读书笔记:《代码大全第2版》 02.创建高质量的代码之软件构建中的设计

《代码大全2》读书笔记 这本书的核心思想是: 管理软件项目的本质是管理复杂性。 代码承载的是人与人之间的交流。 第一部分 打好基础第2章 隐喻重要的研发成果常常产自类比(analogy)。通过把你不太理解的东西和一些你较为理解、且十分类似的东西做比较,你可以对这些不太理解的东西产生深刻的理解。这种使用隐喻的方法叫做“建模”。目前最合适隐喻:建造软件(Building Software)第3章 前期准备( Measure T 阅读详情

软件构建中的设计

1、软件设计的特征与挑战

软件的设计是一个“险恶”的问题,所谓“险恶”就是你必须首先把这个问题"解决"一遍以便能够明确地定义它,然后才能再次真正地解决该问题,这是软件设计的一大挑战。

同时,软件设计无法判断设计到何种程度才是“足够好”了。而且,软件设计存在着诸多限制,比如资源等。你需要在这些限制中做出选择与平衡,所以没有好的设计或不好的设计,只有适合的设计。

合适的设计不是一蹴而就的,是不确定的、演进式的,不断探索、演练、推到、总结而形成的。

满足同一个需求,不同的人会设计出完全不同的设计,所以,设计又具有不确定性。

2、管理复杂度

人的大脑处理能力有限,无法同时关注太多东西,关注东西太多将会导致某些遗漏和混乱。比如,同时让你忙的太多东西,你肯定会丢三落四!虽然你忙的焦头烂额的,但结果却是不尽人意。

就像是玩杂耍:抛在空中的球两个是比较容易控制,增加复杂度两个以上球难度会增大很多很多。在代码设计过程中也是如此,如果关注的太多,将会越复杂,越复杂手忙脑乱势必会造成遗漏导致错误发生。需要同时关注的事情或者逻辑太多是不可取的,但是该软件中存在诸多逻辑和复杂的事情是不可避免的。为了保证代码的各方面性能,应该降低管理复杂度!

如何降低管理复杂度:

  • 减少在同一时间所关注的本质复杂度的量
  • 避免生成不必要的偶然复杂度

3、好的设计所具有的特征

这些目标之间有时会相互抵触,所以需要在这些目标中做出一套最好的折中方案,这正是设计的挑战与魅力。

  • 最小的复杂度(Minimal complexity)

    • 在设计时应该只专注于程序的某一部分,安心的忽视其他部分。
  • 易于维护(Ease of maintenance)

    • 在设计时要从做维护工作的程序员角度思考该设计是否易于维护
  • 松散耦合(loose coupling)

    • 设计时应该让程序的各个组成部分之间关联性降低最小
    • 模块之间,类之间,尽可能的合理抽象、封装和信息隐藏
    • 减少关联也就减少了集成、测试与维护工作量
  • 可扩展性(extensibility)

    • 增强系统的功能时无须破坏其底层结构
  • 可重用性(reusability)

    • 所设计的系统的组成部分能在其他系统中重复使用
  • 高扇入(high fan-in)

    • 让大量的类使用某个给定的类(比如工具类)
  • 低扇出(low fan-out)

    • 一个类里少量或适中地使用其他的类,一般不要超过7个,否则该类就可能会变得复杂
  • 可移植性(portability)

    • 设计出的系统应该很方便地移植到其他环境中
  • 精简性(cleanness)

    • 设计出的系统没有多余的部分。如:一个函数一个逻辑,一个类功能单一
    • 任何多余的代码也需要开发、Review和测试,并且修改了其他代码后还要重新考虑这部分
  • 层次性(stratification)

    • 对系统进行分层设计,按层次进行访问交互;对依赖部分进行统一抽象提供一致接口
  • 标准技术(Standard techniques)

    • 要尽量用标准化的、常用的方法,让整个系统给人一种熟悉的感觉。比如设计模式

4、软件设计的层次

软件设计是分层次性的,软件设计从高到低,大概有如下几个层次:

软件设计层次

5、软件设计方法

5.1 找出现实世界中的对象

  • 辨识对象及其属性
  • 确定可以对各个对象进行的操作
  • 确定各个对象可对其他对象进行的操作
  • 确定对象的哪些部分对其他对象可见
  • 定义每个对象的接口

以上步骤并无特定的顺序来完成,他们经常反复的被执行。经过上述步骤之后,会得到一个高层次的、面向对象的系统组织结构,然后可以通过两种方式进行迭代:在高层次上面进行迭代,以便更好的组织类的结构;或者在每个已经定义好的类上进行迭代,把每个类的设计细化。

5.2 形成一致的抽象

抽象能够让你在关注某一个概念时可以放心的忽略其中一些细节。

抽象是一种以简化的形式来看待复杂操作的能力。

优秀的程序员会在方法的层次上、类接口的层次上以及包接口的层次上进行抽象,这样才能更快、更稳妥的进行开发。

5.3 封装实现细节

封装填补了抽象留下的空白。
抽象是说:“可以让你在高层次的细节上来看待一个对象。”
封装是说:“除此之外,你不能看到对象的任何其他细节层次”。
封装帮助你管理复杂度的方法是不让你看到那些复杂度。

5.4 有可能的情况下继承

继承是面向对象编程中最强大的工具之一。如果使用得当,它能带来极大的益处,然后如果使用过不当,它也会带来极大的弊端。当继承能简化设计时可以考虑使用继承。

5.5 信息隐藏

在软件设计中,有两种信息应该被重点隐藏:

  1. 隐藏复杂性,因为软件设计的首要原则就是管理复杂性,对复杂性进行隐藏,有助于在设计软件时暂时不关注太多的细节
  2. 隐藏变化源,这样当变化发生时,其影响就能被限定在局部范围内,这其实也就是面向对象所提倡的封装变化

5.6 找出容易改变的区域

好的程序设计的挑战之一就是适应变化。将不稳定的区域隔离出来,从而把变化的影响隔离在方法、类或包的内部,将影响范围限制在最小范围内。也就是设计模式中常说的封装变化点。

以下是一些容易发生变化的地方

  • 业务规则
  • 输入输出
  • 对硬件的依赖
  • 困难的设计区域或构建区域
  • 状态变量
    • 不要用布尔变量做状态变量,请换成枚举类型
  • 数据量的限制
  • 非标准的语言特性

5.7 保持松散耦合

耦合表示类和类之间,以及方法和方法之间关系的紧密程度。松耦合的目标是创建出小的、直接的、清晰的类或方法(也称为模块),使它们和其他的类或方法之间的关系尽可能的灵活。应该尽量使创建的模块不依赖或少依赖于其他的模块。

规模(指模块之间的链接数)、可见性、灵活性是耦合的标准。尽量构建规模小、可见性大、灵活性强的模块。

松散耦合的关键在于,一个模块提供了一层附加的抽象,一旦其Ok,你就可以想当然的去使用它。这样就降低了系统的复杂性,使你在同一时间只关注一件事情。如果在同一时间需要同时关注几件事情——内部细节、全局变量等,那么就失去了抽象的能力,模块所具有的管理复杂性的能力也削弱或完全丧失了。

5.8 使用设计模式

设计模式精炼了众多现成的解决方案,可用于解决很多软件开发中常见的问题。有些软件问题需要全新的解决方案,但大部分的问题都和过去遇到过的问题类似,因此可以用类似的解决方案或者模式加以解决。

应用设计模式时存在两大陷阱:

  • 强迫代码来适应某个模式。这样做有时反而会把问题复杂化
  • 为了模式而模式。不能因为想使用某个模式,而不考虑该模式是否适合就使用它

5.9 其他的设计方法

  • 高类聚性
  • 构造分层结构
  • 严格描述类契约(接口)
  • 分配责任(类)
  • 为测试而设计(TDD)
  • 避免失误
  • 有意识的选择绑定时间(动态绑定)
  • 创建中央控制点
  • 考虑使用蛮力突破
  • 画一个图
  • 保持设计的模块化

6、软件设计实践

  • 迭代(尝试的可能性越多,设计方案就会越好)
  • 分而治之
  • 自顶向下设计(分解;从一般性问题出发,将问题分解成可控的部分)
  • 自底向上设计(合成;从可控的部分出发,构造出一个通用的方案)
  • 建立实验性原型(写出用于回答特定设计问题的、量最少且能够随时扔掉的代码)
  • 合作设计(找人求助或一起讨论/审查你的设计方案)
  • 记录设计结果(以下任意一种方式都可以)
    • 正式的设计文档
    • 将设计文档插入代码中或 JavaDoc
    • 用 Wiki 来记录设计讨论和决策
    • 写总结邮件
    • 保留设计挂图,让大家能够随时查阅和修改
    • 在适当的细节层创建UML图

7、总结

不要停留于你所想到的第一套解决方案,而是去寻求合作,探求简洁性,在需要的时候做出原型,迭代,进一步迭代。好的设计都是迭代的,你尝试设计的可能性越多,你的设计能力就会越强,最终的设计方案就会越好。

核对表

《代码大全2》读书笔记:创建高质量的代码 第五章 软件构建中的设计 5.1设计中的挑战 设计师一个险恶的问题  “险恶的”问题就是那种只有通过解决或解决部分才能被明确的问题。这个看似矛盾的定义其实是在暗示说,你必须首先把这个问题“解决”一遍以便能够明确地定义它,然后再次解决该问题,从而形成一个可行的方案。 设计是个了无章法的过程(即使它能得出清爽的结果) 说设计了无章法,是因为在此过程中你会采取很多错误的步骤,多次误入歧途——你会犯很多的错误。事实上,犯错正是... 阅读详情

相关推荐

NPU、CPU和GPU

NPU、CPU和GPU是三种不同类型的处理器,它们各自有不同的设计特点和应用场景。NPU(Neural Processing Unit,神经网络处理单元)是一种专门为加速神经网络计算而设计的处理器。

m0_60697583的博客 1754

《代码大全》笔记 2 - 创建高质量的代码

豆瓣:https://book.douban.com/subject/1477390/ 《Code Complete》2d ed,CC2 设计中的挑战 设计是一个险恶的问题 你必须首先把这个问题“解决”一遍以便能够明确地定义它,然后再次解决该问题,从而形成一个可行的方案。 设计是个了无章法的过程 设计就是确定取舍和调整顺序的过程 设计受到诸多限制 设计是不确定的 设计是一...

一个软件工程师的技术笔记 586

目标跟踪与视频时序分析基础

两帧均有目标,却因快速移动导致检测框无重叠,仅靠交并比(IoU)无法维持身份关联。本文通过手算与纯Python实现最小跟踪流程,揭示IoU仅为位置线索,不能应对快速位移或遮挡。实验表明,即使目标真实存在,低重叠也会触发新编号。强调跟踪需结合运动预测、外观特征与阈值验证,避免误判。

Mr数据杨 2335

读书笔记:《代码大全第2版》 07.变量

文章目录1、使用变量的一般事项1.1 变量初始化原则1.2 作用域1.3 变量的单一职责1.3.1 每一个变量只用于单一用途1.3.2 避免让代码具有隐含含义1.3.3 确保使用了所有已经声明的变量1.4 总结2、变量的命名2.1 变量名中的计算值限定词2.2 变量名中的常用对仗词2.3 为特定类型的数据命名2.3.1 循环变量2.3.2 状态变量2.3.3 临时变量2.3.4 布尔变量2.3.5...

github_39353936的博客 296

纯方位观测下的三维定位,IV-PLKF(Inverse Velocity-Weighted Pseudo-Linear Kalman Filter)

在现代定位系统中,纯方位观测因其无需测距设备的优势,在无线通信、无人机导航和室内定位等领域备受关注。本文深入探讨基于算法的三维定位方法,并提供完整的MATLAB仿真例程。

985工科博士毕业,专攻定位、导航和滤波等算法研究。从业10年,主要使用MATLAB 671

Underactuated Robotics - 欠驱动机器人学(一)- 全驱动与欠驱动系统

根据牛顿的观点,机械系统的动力学是二阶的(其状态由位置向量 q(也称为配置向量)和速度向量以及(可能还有)时间给出。二阶控制动力系统的一般形式是:其中 u 是控制向量。定义 1.1 (欠驱动控制微分方程) 二阶控制微分方程描述如下:在状态和时间 t 中,如果所得到的映射是可射的:对于每一个,都存在一个能产生预期响应的,那么系统就是全驱动的。否则,就是欠驱动(状态在时间 t)。

机器人控制与仿真应用 3377

读书笔记:《代码大全2》

        本书在笔者实习时就已经开始阅读,按照自己的所处阶段有间隔的分成了3次阅读,一直到现在终于完成了。读者千万不要认为这本书真的只是“代码大全”,在我看来,这本书就是软件工程师的心法,提升软件工程的认知、意识。各种技术层出不穷,也有很多技术最终消失在时间里,但这本书的精髓则适用于每一代软件开发者。        本身还提供了各方面的CheckList,可以借助这部分CheckList培养...

key_next的博客 7366

《基于FPGA的数字信号处理》专栏的导航与说明

《基于FPGA的数字信号处理》专栏的导航与说明

孤独的单刀 4158

软件工程、匠艺和写代码的艺术-《代码大全2》读书笔记

编程是介于艺术和科学之间的手艺,由艺术和技术协同融合而产生的一门工程学科。对编程来说,最有挑战的其实是将问题概念化,也就是建模,核心是管理和降低复杂度。

liuwill的博客 1604

化工过程设计软件:Aspen Plus二次开发_(2).二次开发概述

假设我们需要创建一个自定义的换热器模型,该模型能够计算两个物流之间的热交换量,并根据传热系数和换热面积进行调整。ACM 模型代码示例!自定义换热器模型!参数:传热系数 U (W/m^2·K)!换热面积 A (m^2)!热物流 T_hot_in (K), T_hot_out (K), F_hot (kmol/h)!冷物流 T_cold_in (K), T_cold_out (K), F_cold (kmol/h)!模型输入!U - 传热系数!A - 换热面积!

kkchenjj的博客 367

HarmonyOS 鸿蒙开发DevEco Studio OpenHarmony:安全测试

通过对HarmonyOS应用生命周期建模和应用攻击面建模,采用静态数据流分析技术,提高漏洞发现的准确率,同时覆盖20余种攻击面,65+漏洞测试项,帮助开发者提前发现和识别漏洞隐患。在检测报告中,会针对每一项漏洞风险项给出明确的修复建议,可以帮助开发者快速修复漏洞。

斌擎科技 1181

代码大全 读书笔记

代码大全读书笔记Chap7-9第 7 章 高质量的子程序7.1 章节概述7.2 关键内容7.2.1 概念相关7.2.2 关键内容7.3 思维导图第8 章 防御式编程8.1 章节概述8.2 关键内容8.2.1 概念相关8.2.2 关键内容8.3 思维导图第 9 章 第9章伪代码编程过程9.1 章节概述9.2 关键内容9.2.1 概念相关9.2.2 关键内容9.3 思维导图 第 7 章 高质量的子程序 7.1 章节概述 本章主要介绍何为高质量的子程序,以及如何构建高质量的子程序的内容。介绍的内容包括为何创建子程

GorMing 的博客 411

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

读书笔记:《代码大全第2版》 04.创建高质量的代码之高质量的方法

文章目录高质量的方法1、创建方法的理由2、内聚性(cohesion)3、方法命名4、方法参数5、总结 高质量的方法 1、创建方法的理由 降低复杂度 引入中间的,易懂的抽象 避免代码的重复 支持子类重写(子类重写简短而规整的方法要比冗长而邋遢的方法更好) 隐藏顺序 隐藏指针操作 提高可移植性 简化复杂的布尔判断(有时候将一些简单的操作写出独立的方法会具有更好的可读性)...

github_39353936的博客 227

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

读书笔记:《代码大全第2版》 03.创建高质量的代码之创建高质量的类

6、创建高质量的类 成为高效程序员的一个关键就在于,当你开发程序任何一部分代码时,都能安全地忽视程序中尽可能多的其余部分。 抽象 类 = ADT(抽象数据类型)+ 继承 + 多态 创建高质量类的最关键一步是创建一个好的接口(这里的接口指的是类中能够被外部访问的方法)。 类的接口应该提供一致的抽象。很多问题都是由于违背该原则而引起的。 一个呈现出很好的抽象的类接口通常也有很高的内聚性。而具有很强内聚...

github_39353936的博客 221

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

读书笔记:《代码大全第2版》 06.创建高质量的代码之伪代码编程

文章目录伪代码编程过程1、类和子程序的创建过程2、伪代码3、通过伪代码创建子程序3.1 设计子程序3.2 编写子程序的代码3.3 检查代码3.4 收尾工作4、总结 伪代码编程过程 创建类和子程序通常都是一个迭代的过程。在创建子程序的过程中获得的认识常常会反过来影响类的设计。 1、类和子程序的创建过程 类的创建过程 子程序的创建过程 2、伪代码 如何编写一段伪代码: 用类似英语的语句来精确描述...

github_39353936的博客 505

《代码大全》读书笔记

《代码大全》读书笔记

AaronChan的博客 680

【值得反复读3遍的书】程序员的百科全书——《代码大全》读书笔记

程序员的百科全书——《代码大全》读书笔记

追寻上飞的博客 853

《代码大全2》读书笔记——序

序听说有一本书,名叫《代码大全》,很经典。今天去买了一本,好贵!但推荐说很值得。不过关键还是要看,并且要吸收,这才值。看了译序和前言,大致了解到以下信息:1、书中所讲的是:如何编写高质量的代码,并提供了提高代码质量的技术和决窍。代码主要是供人阅读的,所以首先应该为人编写代码,其次才是为机器。2、阅读建议:对自学编程的人,可先看第7章“高质量的子程序”,详细讨论了子程序的命名和参数选

fan_jinyong的专栏 1203

代码大全第二版读书笔记 第二部分-创建高质量的代码 五、软件构建中的设计

软件开发需要设计,如同建设楼房一般,只有画好草图,才知道下一步改怎么做

CODING 985
上一篇: 读书笔记:《代码大全第2版》 01.打好基础
下一篇: 读书笔记:《代码大全第2版》 03.创建高质量的代码之创建高质量的类
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值