首页 > 其他分享 >《代码大全》读后感2

《代码大全》读后感2

时间:2023-05-22 21:57:19浏览次数:33  
标签:读后感 调用 对象 代码 接口 耦合 设计 方法 大全

第五章 软件构建中的设计

> 设计的限制:

设计是一个“险恶”的问题:只有通过解决或至少部分解决,才能明确地定义它。

设计中会有很多错误和修正的过程。

设计有诸多限制,要针对限制与需求进行取舍。

设计是不确定的,是启发式的过程,是自然而然的。

> 管理复杂度:把任何人在同一时间需要处理的本质复杂度减小到最小(模块化、分工),不要让偶然复杂度无谓地增长(封装、良好的问题处理机制)

> 理想的设计特征:

复杂度最小(可以为此牺牲算法的精巧);易于维护;松散耦合;可拓展;可复用;高扇入,即让某个特定的类被大量调用,意味着更好地利用低层次的工具类;低扇出,即让某个特定的类尽可能少调用其它的类,减少依赖关系;可移植性;精简性;层次性;标准化。

> 设计层次:

1. 系统层次

2. 分解为子系统或包,常用的有业务规则、用户界面、数据库访问、系统依赖性。

对子系统之间的交互关系要加以限制到最简,一个常用原则是应该无环。

3. 分解为类

4. 分解为子程序

5. 子程序内部设计

> 一些帮助设计的启发式方法:

>> 找出现实世界中的对象:辨识对象及其属性,定义可对对象执行的操作,定义对象可对其它对象执行的操作,如继承、包含,定义对象哪些属性对其它对象可见定义每个对象的接口。

>> 形成一致的抽象。基类就是一种抽象。可以忽略不必要的细节。

>> 用封装实现细节。

>> 当集成能简化设计时要继承。

>> 信息隐藏,隐藏复杂度及隐藏变化源。要避免循坏依赖。不要因为考虑性能放弃信息隐藏,应该在后期寻找性能瓶颈。信息隐藏很有价值,要养成问自己“我应该隐藏什么”的习惯。

>> 找出容易改变的区域,用封装将它与其它区域隔离。如:业务规则,硬件依赖性,IO,非标准的语言特性,困难的设计区域,状态变量,数据量的限制(如数组大小,用宏定义、const替代),。

>> 松散耦合。

标准:规模,耦合越小越好;可见性,接口应该公开;灵活性。

耦合种类:

简单数据耦合:Object1要求Object2传递简单数据为参数,正常的耦合

简单对象耦合:一个模块实例化一个对象,正常的耦合

对象参数耦合:Object1要求Object2传递Object3,耦合较紧密

语义的耦合:十分危险

>> 查阅常用的设计模式

>> 其它,如:高内聚性,一组代码在支持同一目标上的紧密程度;分层结构;严格描述类契约;分配职责;为测试而设计;考虑并避免失误;有意识地选择绑定时间;“唯一一个正确位置的原则”:每一段代码应该只在一个地方能看到,也只在一个地方能进行维护和修改;考虑暴力算法;画图;保持模块化。

> 设计实践:

>> 分治

>> 自上而下 vs. 自下而上

自上而下:从高抽象层次向下逐层增加细节的层次,简化问题的复杂性

自下而上:从具体需要执行的工作出发,进行分类、组合

二者实际没有矛盾,应该配合使用。

>> 构建原型(同样在《程序员修炼之道》中提到过):用最简单的方式写出仅用来试用某个功能、隐藏细节的代码,随时可以丢弃

>> 合作设计

>> 记录设计成果,方式如将设计文档写入代码、Wiki、总结邮件、数码相机、设计挂图、索引卡片、uml图

 

第六章 可以工作的类

 

> ADT:描述类的数据与操作。

优点:可以隐藏实现细节与内部数据;可以降低耦合,改变一部分时不用改变所有代码;有助于后期提高性能;可以避免直接操作数据可能带来的粗心错误;接口可以传递更多信息;程序更具自我说明性,更可读,且可以像操作现实中的数据一样操作。

> 良好的接口抽象:

>> 应该展现一致的抽象层次,一个类及其接口对应一个ADT;

>> 要清楚抽象的对象;

>> 要检查是否需要提供成对的服务,如class Light可能要提供开灯与关灯的服务;

>> 假如类中有两个甚至多个不相干的独立部分,将它们拆开;

>> 尽可能使接口可编程,即通过参数、调用关系决定它们的关系,而减少“执行a接口之前必须执行b接口”这样的软关系;

>> 不要在修改类的设计时破坏类的抽象;

>> 同时考虑抽象性与内聚性。

> 良好的封装:

>> 尽可能在不破坏抽象完整性的前提下限制内部成员与方法的可访问性;

>> 尽量不要暴露内部数据,尤其是那些相关联的数据;

>> 不要暴露类的内部实现。这与cpp要求矛盾,cpp要求头文件中放置类的定义,从而暴露了内部实现。一个解决方式是将内部用一个指针指向具体实现;

>> 不要对使用者进行假设。假如某个方法有什么前提,应该自己设定或检查;

>> 避免使用友元。这个概念我只在cpp中接触过……c++ primer plus认为友元类没有破坏oop的特性,但本书认为友元常常会破坏良好的封装;

>> 不要因为一个方法只调用了公共方法就将其定义为公开接口,而应该从抽象角度考虑是否公开;

要增强程序可读性;

>> 要避免从语义上破坏封装,如要求调用方法a之前必须要求方法b,或因为知道方法b中已经调用过方法a就不再调用方法a;私以为这与“不要对用户要求过多”是一个意思,但偏向于编码时避免该问题;

>> 留意紧密的耦合;

> 设计与实现

>> “has a” relationship:尽量用包含实现,万不得已时用继承实现;警惕包含有7-2 ~ 7+2个成员的类

>> “is a” relationship:用继承实现;要考虑基类内部数据是否对子类可见;继承可能很危险,所以要对继承仔细说明;子类不要取和基类私有方法同名的共有方法;把公用的接口、数据及操作尽可能放到基类;警惕只有一个实例的类、只有一个派生类的基类、覆盖了某个基类方法却没有做任何操作的子类方法;避免过深的继承关系;尽量使用多态而非类型检查;尽量让所有数据都是private。

>> 成员数据与函数:应该尽可能少;禁止隐式地调用不该调用的方法,如赋值、构造函数;减少类调用的不同子程序地数量;对其他类子程序尽量少调用;总的来说,尽量减少类和其他类地合作关系。

>> 构造函数:尽可能给所有数据初始化;如果要实现单件属性(singleton property),即只有一个实例的类,应该将构造函数定义为私有;优先采用深层复制(问题在于某些语言,如python java,在一些情况下默认为浅层复制);

> 类的优势:

为现实对象或抽象对象建模;

隐藏细节,隔离复杂度,将可能的改变限制在小范围内;

集中对特定操作的控制;

让代码可重用;

实现重构。

> 应该避免:万能类;无关紧要的类;抽象某个动作而非某个对象、某族动作的类。

标签:读后感,调用,对象,代码,接口,耦合,设计,方法,大全
From: https://www.cnblogs.com/ysk0904/p/17421836.html

相关文章

  • fastcopy 参数 命令 大全
    FastCopy.exe[/cmd=命令][/file_src="源文件路径"][/file_dst="目标文件路径"][/srcdir="源目录"][/dstdir="目标目录"][选项...]/cmd-指定命令。(force_copy,move,sync,delete,verify,search,load_job,save_job)/file_src-指定源文件路径。(在force......
  • C语言函数大全-- x 开头的函数(2)
    C语言函数大全本篇介绍C语言函数大全--x开头的函数1.xdr_char1.1函数说明函数声明函数功能bool_txdr_char(XDR*xdrs,char*cp);用于将一个char类型的数据编码为XDR流或从XDR流中解码出一个char类型的数据参数:xdrs:指向要编码或解码数据的XD......
  • linux常用命令大全
    pwd显示工作路径shutdown-hnow关闭系统  /halt关闭系统shutdown-rnow重启/reboot重启systemctl stopfirewalld关闭防火墙ipaddr查看ip地址1、cd命令:这是一个非常基本,也是大家经常需要使用的命令,它用于切换当前目录,它的参数是要切换到的目录的路径,可......
  • 2023新版小程序头像昵称显示 代码示例如下 可复制使用
    新版用户授权名字和头像官网点击触发用户头像部分:<blockwx:if="{{!avatarUrl}}">检查用户头像是否存在。如果头像不存在,显示默认头像。<blockwx:else="{{avatarUrl}}">如果头像存在,显示用户头像。<buttonopen-type="chooseAvatar"bind:chooseavatar="onChooseAvatar"cl......
  • 如何把gitee拉取代码的方式从http变为ssh
    前言:因为我已经生成的ssh秘钥,但我每次拉取代码的时候还是需要输入密码。搜索资料发现,是拉取密码的方式还是http所以我把这个方式转换为ssh前提:已经生成了秘钥解决:1.查看连接方式:gitremote-v  2.改为sshgitremoteset-urlorigin《你自己的ssh的url》我......
  • 人月神话读后感四
    唯一不变的就是变化本身,对于大多数项目第一个开发的系统并不合用,为舍弃而计划。要为变更设计系统,计划组织架构。设计可替代的,易修改的接口,程序更能减少维护的成本。即使最熟练的软件维护工作也只是放缓系统退化的进程,因此要时刻未雨绸缪。对于大多数项目,第一个开发的系统并不合用......
  • 1千多求职简历写作大全ACCESS\EXCE数据库
    简历是用于应聘的书面交流材料,它向未来的雇主表明自己拥有能够满足特定工作要求的技能、态度、资质和资信。成功的简历就是一件营销武器,它向未来的雇主证明自己能够解决他的问题或者满足他的特定需要,因此确保能够得到会使自己成功的面试。数据库包含详细分类有:简历范文(250条)、简......
  • 如何通过Java代码将 PDF文档转为 HTML格式
    虽然PDF文件适合用于打印和发布,但不适合所有类型的文档。例如,包含复杂图表和图形的文档可能无法在PDF中呈现得很好。但是HTML文件可以在任何可运行浏览器的计算机上进行阅读并显示。并且HTML还具有占用服务器资源较小,便于搜索引擎收录的特点。那么今天这篇文章就将展示如何通过Ja......
  • linux 部署代码常用命令
    139上ngnix的启动:查看端口:ps-ef|grepngnix启动命令:./nginx关闭命令:./nginx-sstop杀死进程命令:killport压缩文件命令:zipname.zipname解压文件命令:unzipfilename下载文件命令:sz复制文件到另一个文件夹:cp文件夹路径......
  • 【程序员日记】---从业务编排到低代码
    之前总聊微服务,今天换一个话题---低代码。低代码这个词也是最近这几年很火的概念,尤其是遇到大环境下行,很多大厂和互联网那个公司也在慢慢在低代码方向发力,当然,对于传统项目交付型的软件公司,低代码也具有相当大的吸引力。如何理解低代码用一个通俗易懂的说法,就是少写代码,并且降......