读书《代码大全》

什麽是隐喻?
重大发现往往是从类比中产生的。通过把一个你所陌生的事物与你所熟知的事物比较,你
会对它有进一步的认识,从而形成你对它的独到的深刻理解,这种隐喻方法被称之为“模型化”。
在科学发展史上,充满了利用类比而产生的发现。
(模型化,和我理解的抽象化是类似的概念,为了建立对於客观事物的认知,需要进行抽象化;比如一个系统,通过对方的介绍,能够立刻了解系统的模块和优缺点等等,这些部分虽然说明的人可能会说,但是对於了解的人,只有立刻抽象成自己的模型後,才能够理解,并进行快速的学习和使用,甚至优化扩展等等;比如我们说道一个视频播放器:会立刻想到一个窗口,然後左下角有一个按钮,这个按钮可以‘播放’‘暂停’等,这样一个模型就可以立刻抽象出来,进行功能设计了);

‘模块化设计’中的‘信息隐蔽’,是什麽?
(可能是指,提供外的接口,但是内部实现是隐藏的;)
以下是一些适合使用模块的域:
输入与输出(函数常常这样),
用户接口(界面or工具类),
对硬体or操作系统有依赖的部分(会需要处理二进制等,这些都需要隐藏,改动之後会很难发现),
操作系统依赖部分。把对操作系统有依赖的部分放入模块的原因与把对硬件有依赖部分放
入模块的原因是相同的。如果你正在编写一个在 Microsoft Windows 下运行的软件,为什么要把
它局限于 Windows 环境下呢?你完全可以把对 Windows 的调用放在一个 Windows 接口模块中。
如果以后想把程序移植到 Macintosh 或者 OS/2 环境下,你所要做的只是改动一下接口模块而已。
(不同平台的软件的话,就需要设计一个接口类,与系统相关的部分,都需要通过这个接口类,进行转化:比如变量int的长度,比如使用一些api的时候,名称不一样,还有头文件不一样等等;函数名不一样的话,就都需要转成自己的函数名;相当於一个adapter;这个在开发pc软件的时候才需要注意,如果只是开发前端的话,并不会有差别;)
数据管理。应把数据管理部分放入模块中,让其中的子程序去与那些杂乱的实现细节打交道。而让模块外的子程序用抽象的方式与数据打交道,这种方式应该尽可能避免实际处理问题,如果你认为将数据管理模块化是将其放入一个单独模块中,那你就错了。通常,每一种主要的抽象数据类型,都需要一个单独的模块来管理。
(处理不同模块之间,进行沟通的信号的时候,需要单独管理,但是这里所指的自定义的数据,需要每个进行单独管理,确实是一个更有深度的想法;)
可再使用的代码;(函数和工具类都是)
可能发生变动的相互联系的操作。应该在那些可能发生变动的操作周围修建一道隔墙。这事实上是容错原则的一种,因为这样可以避免局部的变动影响到程序的其余部分。(思考怎麽做这个?这里的变动的含义是哪一个?一个含义是因为user的使用而会发生变动,另一个含义是因为需求的变动而发生变动;前者的话,是需要提前设计好可能的操作的情况,并进行封装和处理的;如果是後者的话,就是设计到软件的可扩展性了,所以是更深层次的部分,这个要设计就需要对於业务有很多的了解才可以;)
互相联系的操作。最后,应把互相联系的操作放到一起。在绝大多数情况下,都可以发现把看起来互相联系的子程序和数据放在一起的更强的组织原则。在无法隐蔽信息的情况下,比如共享数据或计划增强灵活性时,仍然可以把成组操作放在一起,比如,三角函数、统计函数、
字符串操作子程序、图像子程序等。通过精心地成组放置相关操作,还可以在下一个项目中重新使用它。(互相关联,有共同的抽象的部分的事物放在一起;但是这里的问题是怎麽设计范围?设计太小了容易杂乱,设计太大了,又不便於使用,效能也比较差;)

往返设计?
通过组合使用主要设计方法来扬长避短是完全可能的。每种设计方法都只是程序员工具箱中的一件工具,不同的工具适合不同的工作,你将从研究所有方法的启发中获益无穷。(综合使用不同设计方法进行设计);
你可能会有这样的体验:当你编写程序快结束时,你非常希望能有机会再重新编写一次,因为在编写过程中你对问题又有了更深的理解。(这个就像是复盘一样,不要因为已经完成了任务就完成了,为了能够成长,需要进行复盘,如果我当初怎麽做就会更好,这样下次再进行系统设计的时候,就会update了;)
复杂数据类型
阶梯存取
另一种表存取方法是阶梯法。这种存取方法不如变址法直接,但要比变址法节约空间。阶梯法的主要思想是如图 12-5 所示的阶梯结构,其核心是表中的入口对数据范围而不是对不同数据点有效的。例如你正在编写一个评分程序,"B" 入口的取值范围可以是从 77.5%到 90%。下面是一些你可能遇到的评分范围:
≥90%
A
< 90.0%
B
< 77.5%
C
< 65.0%
D
< 50.0%
F
(这个数据的存储方法思路很好,但是不知道怎麽使用?)
抽象数据类型
抽象数据类型是由数据及对数据的操作组成的。这些操作既向程序的其余部分描述了数据,也允许程序其余部分改变它所描述的数据。在“抽象数据类型”中的数据指的是广义的数据。抽象数据类型可能是图形窗口及影响该窗口的操作,也可能是一个文件及对文件的操作。(比如一个文件,可以有对这个文件的各种操作;现在设计的像array,map等都是抽象的数据类型;自定义的类也是;)

与顺序无关的程序语句
可能有这种情形,即代码中某些语句或程序块的先后顺序并不重要,一个语句并不依赖于或说逻辑上从属于另一些语句,但实实在在的情况是,次序是影响可读性、性能、维护性的。而且当语句执行顺序的依赖关系不存在时,可用下面的准则来组织这些语句或程序块的顺序。指导原则是“接近原则”,使相关操作组织在一起。使代码能由上读到下,使变量存活时间尽可能短;(比如读写的功能就是与顺序无关的,但是最好写在相近的地方,便於查找;)

集成方法
一个好的集成能给你带来以下益处:
· 易于诊断错误
· 更少的错误
· 少量连接框架
· 在短期内形成首次可工作系统
· 短期的全面开发计划
· 良好的用户关系
· 增强信心
· 增加工程完成的机会
· 更可靠的预测计划
· 更准确地了解工程情况
· 提高代码质量
· 减少文件

分段集成
直到前几年,分段集成还是一个规范方法,它按如下设计好的步骤进行。
1. 设计、编程、检查和调试。这个步骤叫“单元开发”。
2. 将各程序合并成一个非常大的系统,这叫“系统集成”。
3. 检查和设计整个系统。这叫做“系统再集成”。

许多良好的编程风格的目的是减少你大脑的负担,以下是一些例子:
“分解”一个系统的目的是为了使其更为简单易懂。人们往往易于理解几条简单的信息而不是一条复杂的信息。所有软件设计方法的目的是将复杂的问题分解为简单的几部分,不论你是否使用结构化、自顶向下或是面向对象的设计,以上目标都相同。进行评审、检查和测试是弥补人的错误的一种方法,评审方法部份源于“无错编程”,如果你没有任何错误,你就用不看评审你的软件,但是当你知道自己的能力是有限时,你就应和别人讨论以提高你的软件质量。将子程序编短一些有助于减少你的工作量。你根据问题而不是计算机科学术语编写程序并使用尽可能高级的抽象思维,有助于减少你的工作量。使用各种交谈方式可将你从编程的死胡同中解放出来。

编程生涯成熟的部分标志是不折不挠地坚持诚实,诚实通常表现在以下几个方面:
不假装你是一个编程能手
乐于承认自己的错误
力图理解编译器警告信息而不是对其置之不理
对你的程序有一个清晰的了解,而不是进行编译看其是否有错
提供实际状态报告
提供实际方案评估,在你的上司面前坚持自己的意见
绝大多数高水平程序员喜欢使自己程序的可读性强,并抽出充足的时间这样作。虽然只有一些人能坚持到底,而且其中一些人还是高水平的代码编写者对开发中程序员级别的了解,有助于解释什么地方适合于此原则:
级别 1:初学者
初学者是能使用一种语言基本能力的程序员,这样的人能够使用子程序、循环、条件语句和其它许多语言特征。
级别 2:中间者
中间级程序员有使用多种语言的能力,并且至少非常熟悉某一种语言。
级别 3:专家
编程专家对其语言或环境或对这二者有着很深的造诣,这种级别的程序员对公司有价值的,而且有些程序员往往就停留在这个水平上。
级别 4:大师
大师有着专家那样的专业知识,并能意识到编程只是 15%和计算机交流,其余 85%是和人打交道。一般程序员只有 30%的时间甚至更少。大师所编写的代码与其说是给计算机看倒不如说是给人看的。真正的大师级程序员所编写的代码是十分清晰易懂的,而且他们注意建立有关文档。他们也不想浪费其精力去重建本来用一句注释就能说清楚的代码段的逻辑结构。

减少复杂性的方法
在软件结构级上,问题的复杂性可以通过将系统分成子系统而得到降低。子程序越独立,复杂性就越得以降低。你应仔细定义模块,这样你才能在某一时间集中于某一件事情,而将代
码组装成目标有许多好处。使用全局数据是有害的,因为它可以削弱某一时刻你集中于某事的能力。使用相同的标记符对模块数据是无害的,因为它不会使你的注意力分开。如果你所设计的子系统间有全局变量共享或粗糙定义的接口,其结果是冲淡了因将系统分成许多子系统所带来的好处。复杂性应可通过好的设计得到最大程度的降低。降低复杂性也是促使代码质量提高的动机;

你之所以编写可读的代码是为了帮助别人阅读你的代码,可读性对程序的以下几个方面有着积极的影响:
· 可理解性
· 可检查性
· 错误率
· 调试
· 可修改性
· 开发时间—一受以上各种因素的影响
· 外部质量——受以上各种因素的影响

总体感想:

1好的代码是像字典一样好用的(傻瓜式操作):
提高代码的可读性,系统的纠错方便,可扩展等,这些都是对一个开发者来说是原则性的问题;试想,如果系统有几万行代码,靠自己的眼睛和记忆力是根本找不到bug的;这时候就需要提前设计好,就像是说明书一样,非常简介,就像字典一样,有明确的顺序和目录;这样才好翻找;
2专家如何成为大师?
专家的大部分时间是用来写代码,而大师的大部分时间是用来与人沟通的;也就是说,喜欢沟通,并不断提升自己的沟通能力,并使用这个能力帮助到团队,把自己的系统设计的能力,更多的投入在服务团队上面,而不是写代码上面,这样就能够往大师发展了;从擅长写代码,到擅长协助别人写代码;


<<:  OpenCV癌细胞医学图片的特徵如何做侦测圈选分类

>>:  如何将 OLM 导入 Excel 并附上附件?

Day04,弄几只API

正文 弄完资料库後,花了一点时间的写了这几只API。 主要的routing分成 API/[Contr...

[DAY-13] 走向全球

有效沟通 要先了解彼此文化 才能有效沟通 Google 有强烈的企业文化自豪 Google 把心思放...

【第十九天 - Binary Tree题目分析】

先简单回顾一下,今天预计分析的题目:94. Binary Tree Inorder Travers...

Day 13: 人工神经网路初探 激活函数(上)

激活函数 Activation Function 数学方法去决定neuron输出叫做激活函数(act...

DAY20 MongoDB Oplog 玩坏它

DAY20 MongoDB Oplog 玩坏它 把手弄脏,亲眼於本机见证节点同步跟不上 本篇的目的就...