《 Clean Code 》 读书笔记(一)

来源:互联网 发布:剑网三光头捏脸数据 编辑:程序博客网 时间:2024/06/05 04:35

要有代码

有人说,很快,代码就会自动的生产出来,不再需要人工编写代码了。程序员完全没有用了,因为商务人士可以直接从规约中生成程序。
扯淡~ 我们不可能丢掉代码。因为代码呈现的需求上的细节,在某些层面上,这些细节无法被忽视或者被抽象。我期望语言的抽象侧此继续的提升,也期望领域特定语言继续增加,那是好事,但是终结不了代码。实际上,在较高的层面上用领域特定语言编写的规约也将是代码!它得严谨,规范,精确,详细,好让机器理解和执行。

其实我感觉吧,这就是有了鸡之后还需不需要蛋的问题,表明了 鸡也得从蛋里孵化出来。抛开了蛋,鸡又怎么产生。鸡蛋不能生鸭子,所以还是需要鸭蛋~

糟糕的代码

为什么写糟糕的代码呢?因为是快点完成任务?因为是要赶时间?或许你要干的太多,花时间整理代码会耽误进程。或许你不耐烦的搞完这套程序,期望着早点结束。
我们都曾经的瞟一眼自己曾经造成的混乱,决定弃之不顾,走向新的一天。我们都曾经惊讶于自己写的糟程序竟然能跑出结果,然后断言能运行的程序总比什么都没有要强。我们都曾经说过,有朝一日再回头清理。当然,那些日子里我们都没有听过 勒布朗法则:稍后等于永不。

混乱的代价

混乱代码的增加,团队的生产力持续下降,趋于零。当生产力下降时,管理层只有一件事情可以做,那就是增加人手。可是新人并不了解这个系统,他们不清楚什么样的修改会符合意图,什么样的修改违背意图。他们顶着要提升生产力的压力。于是,他们制造了更多的混乱,驱动生产力向零的那端不断的下降,

态度

为什么好的代码很快的就成了糟糕的代码呢?理由多得很:愚蠢的经理,苛求的客户….. , 不过亲爱的,我们不过是自作自受。你也许不愿意听,难道不关乎需求,不关乎进度的事情么?不,经理只不过是指望从我们这里得到必须的信息,然后才能做出承诺和保证。即使他们没有开口问,我们也不应该羞于告知自己的想法。我们与项目的规划脱不了干系。对失败负有重大的责任。特别是当失败与糟糕的代码有关时
多数的经理想要好的代码,即使他们总和是痴缠于进度,他们会奋力维护进度和需求。那是他们该干的,你则当以同样的热情护卫代码。在说些明白点,假使你是位医生,病人要求你在手术前不要洗手,因为那会花费太多的时间,你会照办么? 本该是病人说了算,但是一声绝对应该拒绝遵从。为什么?因为一声比病人更加了解疾病和感染的风险。医生如果按照病人说的办,则就是不专业的作法了

整洁代码的艺术

你会问:怎么才能写出整洁的代码呢? 不过,如果你不明白整洁对代码有何意义,尝试着写整洁的代码就毫无意义!
坏消息是写整洁代码就像是绘画,多数人能知道一幅画是好是坏,但是不代表着会画出一幅好画。
写整洁代码需要大量的小技巧,刻苦习得”整洁感“。这种”代码感“就是关键所在。有些人生而有之,有些人需要花费点时间才能得到。它不仅让我们看到代码的优劣,还与我们以戒规之力化劣为优的攻略。

什么是整洁代码

  • Bjarne Stroustrup :
    • 代码逻辑应该直截了当,叫缺陷难以隐藏
    • 尽量减少依赖
    • 依据某种分层战略完善错误之处的代码
    • 性能调到最优,省的别人做没有规矩的优化
    • 整洁代码只想做好一件事,糟糕的代码想做的事情太多
    • 每个函数,每个类,每个模块都全神贯注的做一件事
  • Dave :
    • 整洁系于测试之上
    • 整洁便于别人修改
  • Micheal Feather
    • 整洁代码总是看起来是特别在意它的人写的
  • Ron Jeffries
    • 能通过所有的测试
    • 没有重复的代码
    • 体现系统中的全部设计理念
    • 包括尽量少的实体
  • Ward Cunningham
    • 代码让编程语言看起来就像是为了解决那个问题存在的

有意义的命名

软件中的命名随处可见,我们给变量,函数,参数,类和封包命名,我们给jar,war,ear文件命名,不断的命名。既然有那么多命名要做,为什么不做好它呢?

名副其实
名副其实说起来很简单,我们强调的事是取个好名字要花好长时间,但是省下来的时间要比花掉的时间多~。而且一旦要发现更好的名称,就要替换掉旧的。
变量,函数,或者类的名称应该已经答复了所有的大问题。它告诉你它为什么存在,它做什么事情,应该怎么用。如果名称需要注释来解释的话,那就不算名副其实了。

 int d //表示消逝的时间,以日记 int elapsedTimeInDays;

上面的两个变量哪个好?

变量名称不介意长,在能完全表达出意图的名称里取最短的来用。

1 避免误导

比如单词Linux, File
你如果用Linux来命名蛋糕,用File命名糖果。这就是单词误导,好不如i,j这样无意义的词来得好~。
注意小写字母 l 与 1 ,大写字母 O 与 0 之间的相似之处。

int a = l;if(O == 1){    O = 1;}

这样的代码,叫谁读起来都会发时间联些什么。

2 做有意义的区分

变量 a1, a2, a3 这样的名称纯属没意义。他没有向读者提供写意图的线索。
ProductInfo 与 ProductData 虽然名称不同,但是意义却无区别。Info 与 Data 就像 a, an, the 一样,是意义含糊不清的废话。
废话都是冗余的。Variable 根本就不应该出现在变量中,就像 table 不能出现在数据库表的命名中一样。NameString 会比 Name 要好么? 难道 Name 还有浮点型的么? Customer 的类 和 CustomerObject 的区别何在呢?

3 使用读得出来的名称
程序里面写了 genymdhms 变量,这个由很多单词字母块组成的变量,怎么读?如果你跟别人交流的时候,难道还要搬着电脑问它这变量XXXXX么?

4 使用可以搜索的名称
int iint timesCount哪个更容易被搜索?你不希望你Ctrl F 之后,满屏都被标记出来吧!

类名
类名和对象应该是名词或者名词短语

方法名
方法名应该是动词短语

你们不觉得对于类名,方法名,属性 的命名,与其存在意义有很大的关联么?

别扮可爱,别用双关
你认为有意思的名字,不一定别人也认为有意思。你用典故里的名字来命名变量,没有读过这个典故的人怎么办?怎么理解?

写代码就像写简历一样,表达的东西要立竿见影,别人看见就能理解。
删繁就简,直击主题。多看,多修改。
写代码不在于慢,而在于精
不是为了写代码而写代码,而是为了读代码
(跟写文章差不多吧,写文章不就是为了给别人读的么?)

0 0