资源预览内容
第1页 / 共6页
第2页 / 共6页
第3页 / 共6页
第4页 / 共6页
第5页 / 共6页
第6页 / 共6页
亲,该文档总共6页全部预览完了,如果喜欢就下载吧!
资源描述
计划在开始抽象一下代码大全,如何表达都没有部长的抽象度高。还是做一些实在的工作,把咱们从第一章到第十九章的读书体会一一总结于下。第三章描述软件构建必须做的准备工作。本章沿用了第二章隐喻的概念,把软件构建必须做的准备工作隐喻为建造房子之前的准备工作,使我们很清楚的知道这一章要描述的内容。软件项目的成败与构建前的准备工作紧密耦合在一起,就像房子的地基或者承重设计有问题,盖到封顶了才发现房子开始倾斜,承重墙出现裂缝,这栋房子只能被推到重来。联系到软件质量,也是这个道理。在项目的开始阶段强调质量,比事后弥补花费的开销要小的多。风险预测与控制是项目的开始阶段必须要做的工作之一,只有在一开始就明确了项目有哪些风险,才有可能在项目管理过程中,有计划有措施的管理这些风险,将这些风险尽早清除掉。那么为什么往往准备工作做得不充分呢?是经验。老板的经验不够,可以用合理的方式沟通,开发人员的经验不够,只会多一个触目惊心的不成功案例。本章接着论述了几点有力简洁的论据,如果食物链打动不了你的话,那几组数据总该让人沉思,在项目周期开始之前,应该思考一下开发团队准备好了吗?不同的软件项目,前续的计划和管理也各有侧重。那么对于序列式与迭代式的讨论,更像是“瀑布模型”与“增量模型”的比较,没有绝对优劣之分,需要具体项目具体分析。构建前的准备工作必然牵扯到问题的定义,这确保了项目的输出的产品是不是符合客户的原始需求。可怕的是,客户需求可能变化,稳定的需求只能保证最大化的引导客户需求,帮助客户开发需求,保证客户的需求在软件开发时不变更、少变更。最后讨论的是,准备工作中的软件架构,好多同学分不清楚architecture与framework的区别,这里的解释让人茅塞顿开,进一步又给出了architecture包括了什么内容,这是很重要的知识点。第四章告诉我们一些关键的构建决策。世界上有一百多种编程语言,有20多种已经missing了。在项目中,选择哪种编程语言将对生产率和代码质量产生很大的影响。好在我们在这件事情上没有选择的余地,我们用的是标准C,但是超越语言层面理解编程是有很必要的。最近在CSDN的一位大牛的博客里看到一片无责总结2010年技术浪潮的文章,HTML5.0与服务器端云计算的应用等等,在这样机遇百出的背景下,如何相应调整IT职业规划和长期目标是值得每位同学思考的问题。也幸运,我是个LTE的初学者,但是LTE发展前景那是没的说,好好工作,天天向上吧。下面进入第二部分。这一章讲的是软件设计。设计不是凭空臆想出来的,一定是在不断参与设计实践、学习设计模式、吃到蹩脚设计苦头后演化和完善起来,最终构建成一位优秀软件工程师的设计经验。这里对设计的定义比公司二级培训给出的设计的定义要完整和丰富的多。我们需要重点关注的是理想的设计特征最小的复杂度、易于维护、高内聚低耦合、可扩展、可重用、可移植等等,这几乎涉及到了软件体系结构所有的评价标准。其实上,这里的设计不仅包括了软件体系结构的设计,还细化到类的抽象和子程序的设计。类的的抽象包括数据的封装与隐藏,类间的关系继承、组合等。这里涉及到了设计模式和设计方法自上而下、自下而上与分治法。每一部分的内容都提供了很多书籍,推荐大家阅读四人帮的设计模式和经典算法书籍中的分治法的设计与实现。这里,只需要弄懂字面意思,以后在工作实践中再慢慢深入研究。第六章描述类。类是有一组数据和子程序构成的集合。一个类不论是抽象的,还是具体的,都必然是内聚、明确定义、指责明确的概念实体。逻辑上,类就是一类事物的代表。这一章为构建高质量的类提供一些高明的建议,还是在谈经验。抽象数据类型(ADT)建议大家关注数据结构的第一章,这里不再详述。抽象数据类型是类的基础。首先谈到的是类的接口,类接口是类中的函数,分为“内部接口”与“外部接口”。封装的概念通常理解为把相关联的数据放到一个类中,但封装也包含了接口的封装,也就是功能上的封装。这是类本身的分析,那么,类与类之间的关系又分为了包含(has a)和继承(is a),通过语言机制又可以实现多态。不明白的是,为什么本书没有包涵多态。多态在C+、Java、C#中都存在,或许作者认为多态是语言层面的,不应该放在通用的范畴讨论。时间不充分的话,第六章可以先跳过去,不过,还是需要回头看的,一些成功的框架通过模拟继承、多态支持面向对象机制,典型的是COM。使用C这样的过程语言构建软件框架时,如果提供了面向对象的机制,那么该框架将具有更大的优势。第七章讨论如何编写高质量的子程序。仔细分析162页的低质量子程序将对理解什么是高质量的子程序很有帮助。从这里开始,我们实实在在的踩到了代码上。尽管子程序给程序带了这样那样的好处,我们只要把握一个原则,子程序是“功能”上的最小划分。“功能”上的,可能的是功能的内聚、执行顺序的内聚、数据通信的内聚、过程序列的内聚、逻辑上的内聚,甚至是临时的内聚。给过程命名就是给函数起名字,函数的名字应该是自解释的,能够完整包涵该函数实现的功能。一个函数的代码行数最好控制在50行左右,参数控制在7个以内。使用内联和宏是有风险的,禁止无节制的使用。如何使用内联和宏需要遵照部门的编程规范执行。第八章讲防御式编程。它的主要思想是,承认程序是会出错的,在这个前提下,在编写程序的时候,要做好充分的准备,防止别的程序出错的时候不会蔓延到自己的程序,也就是子程序应该不因传入错误数据而被破坏,哪怕是由其他子程序产生的错误数据。本书给出一种很形象的说法“垃圾进,什么都不出”、“垃圾进来,出去的是错误提示”、“不许垃圾进来”。这里处理技术分为三个部分,检查外部数据,确保它们的正确性,用测试角度说,就是确保它们的值在有效等价类里,是有意义的;检查输入参数,确保函数接受的外部输入是合法值,好的办法是在接受参数后,if判断下,或者使用断言,如果出错,要么什么都不做,直接返回,或者给出出错提示,出错提示的类型主要是打印出错信息。这里复习一下C语言的断言assert,首先它是宏,只在程序的debug模式弹出出错对话框,对于发布的程序版本没有任何开销。通常,断言和出错处理选用一种即可。使用断言时,把出错处理放在断言后面做为补救是目光长远的一种做法。这里了解到了回归测试,原来测试不仅仅到验收测试就截至了说到底断言只是程序员的调试手段,那么程序出错了怎么办,检测到错误数据,应该采取哪种措施。本书给出了很多种,最常用的是两种,一是返回0(0代表着函数的异常),或者在日志文件中记录一条错误信息。其他出错处理方式也有很借鉴意义,系统级项目应该约定出错处理方式,而不应该由各位程序员随意选择,也就是本书所说的高层次设计需要对错误处理方式作出一致的约定。像C+、Java等设计了异常机制,程序可以抛出异常,再捕捉异常,处理或者忽略异常。隔栏策略把数据分为“不干净数据”与“干净数据”,类似“防火墙”。最后,是调试工具的使用,优秀的程序员善于利用各种工具,工具是提升效率很重要的一个步骤。第九章讲伪代码的编写过程(PPP)。写伪代码有助于清晰表述设计思路,它其实就是编码的详细设计,只涉及思路,不考虑实现,是程序设计到创建子程序之间可以选择的、过渡性的步骤。最早接触伪代码是在算法设计中,用来表述算法的设计思路,是一种算法描述语言。本章描述了从编写伪代码到构件子程序的完整过程。需要注意的是,伪代码没有标准的编写规范,最好可以参考算法设计类书籍。把编译器的警告级别调到最高是软件调试与自测的好办法,一开始就这样设置,会减少误码率。第十章讲变量使用的一般事项。这里的变量指代对象和内置数据类型,是广义的。开始的数据认知测试很有用,有一些疑问,tree怎么能是个变量呢?思考一下,这里的变量是广义的,只要能够存贮数据的数据结构都可以成为变量。这个疑问等到交流活动再请教更有经验的同事。隐式声明变量很危险,还好C语言里貌似不能这样。要使用,先声明,再初始化,在声明的时候初始化是良好的编程风格。谈到变量就会联系变量的作用域。以前编程习惯是把所有的变量声明为全局变量,这在系统项目里造成的危害无法想像,应该改掉这个懒习惯,尽可能的使变量局部化。尽可能缩短变量的生存时间是个很好的建议。还有两个原则特别有用,进入循环之前再初始化循环里用的变量,在变量马上被使用时初始化。这样能够减少犯错的几率。变量的持续性是需要我仔细思考的问题,因为变量的生存周期难以预料,在删除一个指针后将其赋值为null,是为了避免使用野指针一个惯用的做法。平时接触的到是C+的静态绑定和动态绑定,这里讲的是变量的绑定时间,留作疑问吧。最后,讲变量用途要单一,春生做的培训提到部门出的一个故障,一个变量做两种用途,看似节省了一个变量,其实被故障埋下了隐患,导致程序的可读性、可维护性、健壮性都不高。第十一章讲变量的命名。在看这一章之前,先回顾了一下,以往编程中我是怎么命名一个变量的。有时,为了起一个合适的名字纠结好一阵子,结果起的名字还不是很满意。等仔细阅读本章之后,惊叹于本章的覆盖面之广,以后再遇到起名字的问题时,还是翻这本书吧。命名的原则是要完全、准确的描述出该变量所代表的事物。在阅读代码时,会积累一些命名的经验,看一眼,就知道这个变量的作用域、用途,一些命名方式已经约定俗成了。二级培训的编程规范讲变量名不得超过31个字符。这里给的建议是9到16个字符为最好。我习惯用的还是微软采用的匈牙利命名法。第十二章讲基本数据类型。避免使用神秘数。把编译器的警告级别调到最高也是防止数据类型间隐式转换的好办法。整数计算时要防止溢出。浮点数计算时,要避免浮点间的比较。C中的字符串涉及到字符串指针和字符数组,C的标准库里也提供了很多字符串处理函数,要对它们有个清楚的认识,使用的时候,知道这些函数是怎么工作的,避免隐晦问题。对于布尔变量,二级培训的编程规范是特别长的布尔变量要分开判断,或者分行显示。曾经遇到过这样的问题,一个if判断里的与或的布尔变量在一行显示,非常的长,到后来不知道那里的判断的意义,这是很不好的编程风格。如果有一组性质或功能类似的数据的话,优先考虑使用枚举类型,这是提高程序可读性、可靠性的好办法。用大写命名具名常量也可以提高程序可读性。使用数组时,要时刻警惕数组越界问题。书中提到了使用typedef带来的种种好处。在整个系统中,使用typedef来定义一些通用的数据类型是非常好的做法,例如C中没有布尔型,typedef int Boolean;还例如:typedef unsigned short uint16;在内存资源受限的系统中,类似uint16的数据类型能够节省很多资源。但是在模块中使用的话,还是要慎重,除非变量命名得很好。第十三章不常见的数据类型。对于C程序开发人员,这一章必须好好读,结构体、指针、全局变量是C程序常见的一部分。结构体是C中最重要的数据结构,使用结构体组织数据块可以产生结构化的数据,一些更加复杂的数据结构的结点均基于结构体,它与C+中的类其实是一回事。指针是初学C时最为难理解的数据类型,对于计算机内存永远是相同的,指向该内存地址的指针的基类型不同,这块内存存贮的数据的意义也不一样。指针使用的内容多到无法在这里一一总结。最基本的建议是声明指针和初始化指针一起完成;使用指针时先检测该指针是否为null,是否指向合理的内存地址;确认该指针不再使用,马上释放它,并将其置为null。尽管指针不好理解,但是使用指针可以直接操作内存,因此指针的效率很高,使用指针最经典的是字符串拷贝:*strDest+=*strSrc;对于全局变量,本书给出了大多数程序员的共识:使用全局数据的风险比局部数据的风险大,只有万不得已时才使用全局数据。全局数据的好处显而易见,但是副作用更多,全局数据是程序的公共资源,谁都能用,多线程共同存取全局数据的情况则更加危险。春生部长的培训中特别提到的全局变量引起的案例发人深省。第十九章一般的控制问题。很多语言提供了布尔数据类型,C没有提供,但我们可以使用宏定义来定义1为TRUE,0为FALSE。正确的设计控
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号