代码大全2阅读笔记 9~1
第一部分 打好基础
第一章 欢迎进入软件构建的世界
软件构建是软件开发的核心活动;构建活动是每个项目中唯一一项必不可少的工作。
软件构建的主要活动包括:详细设计、编码、调试、集成、开发者测试(developer testing)(包括单元测试和集成测试)。
构建也常被称作“编码”和“编程”。
构建活动的质量对软件的质量有着实质性的影响。
第二章 用隐喻来更充分地理解软件开发
通过把软件的构建过程比作是房屋的建设过程,我们可以发现,仔细的准备是必要的,而大型项目和小型项目之间也是有差异的。
通过把软件开发中的实践比作是智慧工具箱中的工具,我们又发现,每位程序员都有许多工具,但并不存在任何一个能适用所有工作的工具,因地制宜的选择正确工具是成为有效编程的程序员的关键。
第三章 三思而后行:前期准备
准备工作的中心目标就是降低风险:一个好的项目规划者能够尽可能早的将主要的风险清除掉,以使项目的大部分工作能够尽可能平稳的进行。目前,软件开发中最常见的项目风险是糟糕的需求分析和糟糕的项目计划,因此准备工作就倾向于集中改进需求分析和项目计划。
你所从事的软件项目的类型对构建活动的前期准备有重大影响--许多项目应该是高度迭代式的,某些应该是序列式的。
如果没有明确的问题定义,那么你可能会在构建期间解决错误的问题。(找到需要打的靶)
如果没有做完良好的需求分析工作,你可能没能觉察待解决的问题的重要细节。(瞄准靶,选择好箭的飞行路线)
如果没有做完良好的架构设计,你可能会在构建期间用错误的方法解决正确的问题。架构变更的代价随着“为错误的架构编写的代码数量”增加而增加,因此,也要确认“架构”已经到位了。(根据距离的远近以及环境,选择适合的弓箭,安排每支箭的力度角度策略,力求最少的箭枝射中靶心)
架构包括:程序组织(主要构造块)、主要类、数据设计、业务规则、用户界面设计(如果需求阶段没有)、稀缺资源管理、安全性、性能、可伸缩性、互用性、国际化本地化、输入输出、错误处理、容错性、架构的可行性、过度工程(部分代码健壮,部分不健壮)、关于买还是造的策略、关于复用的策略、架构的总体质量、需求变更策略。
(评价:系统分析--类图静态、业务顺序图状态;业务类图--数据存储;通用类业务--平台框架组件)
第四章 关键的“构建”决策
本章关注的焦点是程序员和技术带头人必须(直接或间接)负责的准备工作。在向工地进发之前,如何选择合适的工具别在你的腰带上,你的手推车里该装哪些东西。
在高质量的软件中,你可以看到“架构的概念完整性”与“其底层实现”之间的关系。“实现”必须与(指导该实现的)“架构”保持一致,并且这种一致性
是内在的、固有的。这正是变量名称、类名称、子程序名称、格式约定、注释约定等这些针对“构建活动”的指导方针的关键所在。
假如没有一种统一的规则,你创作出来的东西将会充斥着各种不同的风格,显得混乱而邋遢。这些不同的风格将使你的大脑承受沉重负担--而这仅仅是为了理解不同编程风格之间的(本质上是随意的)差异。
大多数重要的编程原则并不依赖特定的语言,而依赖于你使用语言的方式。
在开始编程之前,做好一些约定。“改变代码使之符合这些约定”是近乎不可能的。
第二部分 创建高质量的代码
第五章 软件构建中的设计
无论是以何种方式来进行设计,小型项目也能和大型项目一样从精心的设计之中获益,而如果能认识到设计是一项明确的活动,你就更会获益匪浅。
5.1 设计中的挑战
设计是一个险恶的问题。你必须首先把这个问题“解决”一遍以便能够明确的定义它,然后再次解决该问题,从而形成一个可行的方案。
设计是个了无章法的过程(即使它能得出清爽的成果)。因为在此过程中你会犯很多的错误。还因为优劣设计之间的差异往往非常微妙。还因为你很难判断设计何时算是“足够好”了。设计到什么细节才算够?有多少设计需要用形式化的设计符号完成,又有多少设计可以留到编码时再做?什么时候才算完成。
设计就是确定取舍和调整顺序的过程。
设计受到诸多限制。
设计是不确定的。
设计是一个启发式过程。
设计是自然而然形成的。他是不断的设计评估、非正式讨论、写试验代码以及修改试验代码中演化和完善的。
5.2 关键的设计概念
软件的首要技术使命:管理复杂度
作为软件开发人员,我们不应该试着在同一时间把整个程序都塞进自己的大脑,而应该试着以某种方式去组织程序,以便能够在一个时刻可以专注于一个特定的部分。
所有软件设计技术的目标都是把复杂问题分解成简单的部分。子系统间的相互依赖越少,你就越容易在同一时间里专注问题的一小部分。精心设计的对象关系使关注点相互分离,从而使你能在每个时刻只专注于一件事情。在更高汇聚的层次上,包(packages)提供了相同的好处。
保持子程序的短小精悍也能帮助你减少思考的负担。从问题的领域着手,而不是从底层实现入手去编写程序,在最抽象的层次上工作,也能够减少人的脑力负担。
一个程序中的设计层次。系统1首先被组织为子系统2子系统被进一步分解为类3然后类又被分解为子程序和数据4每个子程序的内部也需要进行设计
5.3 设计构造块:启发式方法
找出现实中的对象。在确定设计方案时,首选且最流行的一种做法便是“常规的”面向对象设计方法,此方法的要点是辨别现实世界中的对象以及人造的对象。
形成一致的抽象。
封装实现细节。当继承能简化设计时就继承。
隐藏秘密(信息隐藏)。信息隐藏中所说的秘密主要分为两大类:隐藏复杂度;隐藏变化源。问题“这个类需要隐藏些什么?”正切中了接口设计的核心。在设计的所有层面上,都可以通过询问该隐藏些什么来促成好的设计决策。
找出容易改变的区域。
预料不同程度的变化。
保持松散耦合。
查阅常用的设计模式。
下列的启发式方法有时也很有用:高内聚性、构造分层结构、严格描述类契约、分配职责、为测试而设计、避免失误、有意识的选择绑定时间、创建中央控制点、考虑使用蛮力、画一个图、保持设计模块化
5.4 设计实践
分而治之
自上而下和自下而上的设计方法
建立试验性原型
合作设计
要做多少设计才够
记录你的设计成果
要点
软件的首要技术使命就是管理复杂度。以简单性作为努力目标的设计方案对此最有帮助。
简单性可以通过两种方式获取:一是在同一时间所关注的本质性复杂度的量,二是避免生成不必要的偶然的复杂度。
设计是一种启发式的过程。固执于某一种单一方法会损害创新能力,从而损害你的程序。
好的设计都是迭代的。你尝试设计的可能性越多,你的最终设计方案就会变得越好。
信息隐藏是个非常有价值的概念。通过询问“我应该隐藏些什么?”能够解决很多困难的设计问题。
文章参考https://wenku.baidu.com/view/d856fb1ba8114431b90dd859.html#