惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
云风的 BLOG
云风的 BLOG
aimingoo的专栏
aimingoo的专栏
Vercel News
Vercel News
T
The Blog of Author Tim Ferriss
F
Full Disclosure
A
About on SuperTechFans
C
Check Point Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
量子位
Know Your Adversary
Know Your Adversary
K
Kaspersky official blog
L
LINUX DO - 热门话题
Recorded Future
Recorded Future
C
Cisco Blogs
M
MIT News - Artificial intelligence
T
Tenable Blog
G
GRAHAM CLULEY
月光博客
月光博客
Recent Announcements
Recent Announcements
V
Visual Studio Blog
IT之家
IT之家
T
The Exploit Database - CXSecurity.com
The GitHub Blog
The GitHub Blog
T
Threat Research - Cisco Blogs
D
DataBreaches.Net
P
Privacy International News Feed
P
Proofpoint News Feed
I
Intezer
博客园 - 叶小钗
C
CXSECURITY Database RSS Feed - CXSecurity.com
The Hacker News
The Hacker News
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
博客园 - Franky
SecWiki News
SecWiki News
宝玉的分享
宝玉的分享
P
Palo Alto Networks Blog
Last Week in AI
Last Week in AI
小众软件
小众软件
Hacker News - Newest:
Hacker News - Newest: "LLM"
O
OpenAI News
N
News and Events Feed by Topic
Microsoft Security Blog
Microsoft Security Blog
Security Archives - TechRepublic
Security Archives - TechRepublic
N
News and Events Feed by Topic
The Cloudflare Blog
Spread Privacy
Spread Privacy
酷 壳 – CoolShell
酷 壳 – CoolShell
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
B
Blog RSS Feed

博客园 - 飘啊飘

一个精简的vi源码(2000行) dtruss 粗糙的翻译 gdb常用命令[转] gdb中信号的处理[转] 在linux中通过进程名获得进程id busybox0.60.3源码学习开始 pygame做的贪吃蛇 python中使用struct模块处理二进制数据 使用PYGAME开发的坦克游戏[代码][思路] 一篇很好的讲/etc/inittab的文章[转] 哲学家吃空心粉问题 使用面向对象概念优化条件判断语句的一个小应用 python生成文件树的代码 深入理解软件包的配置、编译与安装[转] pygame学习之对象移动 pywin32重启电脑 - 飘啊飘 - 博客园 解决LINUX和WINDOWS时间不一置 通过状态机实现的一个配置读取函数 UNIX基础知识--《APUE》第一章笔记
《代码整洁之道》笔记之函数
飘啊飘 · 2011-04-16 · via 博客园 - 飘啊飘

作者给出了几个评判函数好坏的标准:

  • 短小
    作者给的函数合理长度是小于15行,目标是每个函数都一目了然,每个函数都会把你依次带到下一个函数中去。
    if、else、while语句等其中的代码快应该只有一行。该行大抵应该是一个函数的调用语句。这样不但能保持函数短小,而且因为块内调用的函数拥有较具说明行的名称,从而增加了文档上的价值函数的缩进曾不该多余两层,这样函数更容易理解。

  • 只做一件事
    从我接触编程开始,这条规则反反复复听了很多遍:函数应该做一件事,做好这件事,只做这一件事。问题是那件事是什么,函数到底做了一件事还是做了几件事。比如一个名为write_text_to_file(char *filename)的函数,它在其中会打开一个文件,写入文本到这个文件,然后关闭文件流。这算几件事?
    作者如是说:如果函数只是做了该函数名下同一抽象层上的步骤,则函数还是只做了一件事。
    这样就好分辨的多。
    我的理解是:write_text_to_file函数里面调用的几个函数,fopen、fwrite、fclose都是同一抽象层的,这算是只做了一件事,如果调用了更上层的delete_file函数,这样就算两件事了。不知道这样理解有没错。

  • switch语句的正确使用
    学习过《windows程序设计》的人肯定都写过这样的代码:
    switch(uMsg)
    {
    case WM_DESTORY:
    //xxxxxxx
    break;
    case WM_CREATE:
    //xxxxxxx
    break;
    }
    在其中对WINDOWS窗口的消息进行判断,然后处理。没什么封装的话,就是直接写在case和break之间,一大坨。有了点封装,会把要执行的代码写到独立的函数里,在收到消息时进行调用。还可以弄个消息表,这样只需要在for循环中就完成了对应消息的处理,除非是写框架时才会这么做,一般都没这么多消息要处理。有了面向对象还可以利用继承和多态机制来简化代码,参看:http://www.cnblogs.com/shiweifu/archive/2011/04/12/2014136.html
    作者这么说switch:对于switch语句,我的规矩是如果只出现一次,用于创建多态对象,而且隐藏在某个继承关系中,在系统其他部分看不到,就能容忍
    对于switch他也没说绝对,后来又补充说: 要就事论事

  • 函数的名称
    函数名别怕长,命名方式要在模块中进行统一。做到让看代码的人自己可以通过函数名就能大概弄明白函数是干嘛的,这样就到位了,也就是他最后说的“深合己意”

  • 函数的参数
    书中说最理想的函数参数是没有参数,其次是一个,再次是两个,如果有了三个以上的参数,就说明这个函数需要传递对象作为参数了。我觉得这个更多适合的是面向对象编程,像面向过程编程,有些时候没参数活儿没法干,难道哪个文件都弄一大堆静态函数,再弄静态变量放在文件中?我不怎么习惯这样。等我看完lua的源码再谈这个吧

然后是一些建议:

  • 使用异常替代返回错误码
    相对与返回错误码,这是更好的做法。有异常就用异常吧

  • 如何正确编写异常处理
    对异常没有太多经验,只停留在会用的层面,就不多说了

  • 避免重复
    一般第一遍编写代码,会有不少冗余重复的代码。再写一遍就是了。

  • 如何编写出优秀的代码
    以前代码写的又烂又难看,设计的又丑陋(现在设计也很糟糕),我向一位有经验的程序员请教,他说你重新再写一遍就好了,多写几次,总能写好的。后来我就按照他的话重新写了遍当时的代码,果然好看多了。后来每当遇到不满意的代码,都会重新写一下,慢慢的就有了进步。现在有时重写一次就能写出满意的代码,有时得写三次。这与对所使用的技术是否了解有关系。对所运用的技术越熟悉,一次性写好的几率就越高。书中对写出好的代码的建议也是重复编写,当然,加上这些规则对自己的代码进行审查,会写的更好。