《代码大全》学习摘要(五)软件构建中的设计(下)
这次的学习内容主要是设计过程中的启示式方法和设计实践中的一些经验。
对于详细的编程工作来说,期待确定性的行为是非常正常的,因为软件设计是非确定性的。灵活熟练地运用一组有效的启示方法(试探法)。便成了合理的软件设计的核心工作。
1、在确定设计方案时,首选且最流行的方法是面向对象的方法,此方法的要点是辨别现实世界中的对象以及人造的对象。这个过程分为下面几步:辨识对象及其属性、确定能够对各个对象进行的操作、确定各个对象能对其它对象进行的操、确定对象的哪些部分对其它对象可见、定义每一个对象的公开接口。
2、抽象是一种能让你在关注某一概念的同一时候能够放心地忽视当中一些细节的能力。
人们一直在使用抽象,当你把一个东西称为“房子”而不是玻璃、木材和钉子构成的组合体时,你就是在用抽象了。以复杂度的观点来看,抽象的主要优点在于它使你能忽略无关的细节。
优秀的程序猿会在子程序接口的层次上、在类接口的层次上以及包接口的层次上进行抽象。这样才干更快、更稳妥地进行开发。
3、封装填补了抽象留下的空白。抽象是说:“能够让你从高层的细节来看待一个对象。
”而封装则说:“除此之外。你不能看到对象的不论什么其它细节层次”。
4、当继承能简化设计时就继承。继承的优点在于它能非常好地辅佐抽象的概念。继承是面向对象编程中最强大的工具之中的一个。假设使用得当,它能带来极大的益处,然而假设使用不当,它也有极大的弊端。
5、信息隐藏是软件的首要技术使命中格外重要的一种启示方法,由于他强调的就是隐藏复杂度。
在设计一个类的时候,一项关键性的决策就是确定类的哪些特性应该对外可见。哪些特性应当隐藏起来。类非常像是冰山:八分之七都是处于水面之下,而你仅仅能看到水面上的八分之中的一个。信息隐藏中所说的秘密主要分为两大类:隐藏复杂度、隐藏变化源。信息隐藏的障碍包含:信息过度分散、循环依赖、把类内数据误觉得全局数据、能够觉察的性能损耗。
6、找出easy变化改变的区域。适应这些变化。
过程包含:找出看起来easy变化的项目、把easy变化的项目分离出来、把看起来easy变化的项目隔离开来。
常见的easy变化的区域包含业务规则、对硬件的依赖性、输入和输出、非标准的语言特性等。
7、保持松散耦合。模块之间的好的耦合关系会松散到恰好能使一个模块可以非常easy地被其它模块使用,尽量使你创建的模块不依赖或非常少依赖其它模块。耦合的种类包含简单数据的參数耦合、简单对象耦合、对象參数耦合(更紧密一些)、语义上的耦合(应尽量避免)。
8、设计模式精炼了众多现成的解决方式。可用于解决非常多软件开发中最常见的问题。大多数问题都和过去遇到过的问题类似。能够使用类似的解决方法或者模式加以解决。
设计模式的优点是:设计模式通过提供相现成的抽象来降低复杂度、设计模式通过把常见解决方式的细节予以制度化来降低出错、设计模式通过提供多种设计方案而带来启示性的价值、设计模式通过把设计对话提升到一个更高的层次上来简化交流。
一些良好的设计实践:
1、设计是一种迭代过程。
当你在备选的设计方案之中循环而且尝试一些不同的做法时。你将同一时候从高层和底层的不同视角去审视问题。这样的高低层次之间的互动被觉得是一种良性的原动力。他所创造的结构要远远稳定于单纯自上而下或者自下而上创建的结构。当你首次尝试得出了一个看上去足够好的设计方案后,请不要停下来!
第二个尝试差点儿肯定会好于第一个。
2、分而治之,把程序分解为不同的关注区域,然后分别处理每个区域。假设你在某个区域里碰上了死胡同,那么就迭代。
3、採用自上而下和自下而上的设计方法。
自上而下是从一般的类出发,一步步地把他们分解为更详细的类。自下而上是从知道的东西入手,找出详细的对象和职责,再找到通用的对象。逐步向上。两种方法各有优缺点,但这两种方法不是互斥的——你会收益于两者的相互协作。
4、建设实验性原型可以帮助推断一种设计方法是否奏效,内容是写出用于问题特定设计问题的、量最小且可以随时扔掉的代码。
5、要学会合作设计,三个臭皮匠顶得上一个诸葛亮。
6、要做多少设计取决于团队的经验、系统的预定寿命、得到的可靠度、项目的规模等。
转载于:https://www.cnblogs.com/mengfanrong/p/5188857.html
《代码大全》学习摘要(五)软件构建中的设计(下)相关推荐
- 读书笔记:《代码大全第2版》 02.创建高质量的代码之软件构建中的设计
文章目录 软件构建中的设计 1.软件设计的特征与挑战 2.管理复杂度 3.好的设计所具有的特征 4.软件设计的层次 5.软件设计方法 5.1 找出现实世界中的对象 5.2 形成一致的抽象 5.3 封装 ...
- 《代码大全2》第5章 软件构建中的设计
目录 前言 本章主题 5.1 设计中的挑战 5.1.1 设计在软件构建中所处的角色 5.1.2 设计是一个险恶的问题 5.2 关键的设计概念 5.2.1 软件的首要技术使命:管理复杂度 1. 管理复杂 ...
- 《代码大全》阅读笔记-5-软件构建中的设计
无论是以何种方式来进行设计,小型项目也能和大型项目一样从精心的设计之中获益,而如果能认识到设计是一项明确的活动,你就更会获益匪浅. 设计过程充满了不确定性,因此设计技术也趋于探索性质. 软件的首要技术 ...
- 【知识图谱】知识图谱数据构建的“硬骨头”,阿里工程师如何拿下?深度学习在知识图谱构建中的应用。
阿里妹导读:搜索"西红柿",你不但能知道它的营养功效.热量,还能顺带学会煲个牛腩.炒个鸡蛋!搜索引擎何时变成"暖男"了?原来背后有"知识图谱" ...
- 首次公开!深度学习在知识图谱构建中的应用
在智能化时代的今天,搜索引擎不仅能理解用户检索的信息.并总结出与搜索话题相关的内容,更在逐步构建一个与搜索结果相关的完整知识体系,让用户获得意想不到的发现.神马搜索的知识图谱与应用团队就在这条路上不断 ...
- 领域应用 | 深度学习在知识图谱构建中的应用
本文转载自公众号:阿里技术. 深度学习模型介绍 DeepDive系统在数据处理阶段很大程度上依赖于NLP工具,如果NLP的过程中存在错误,这些错误将会在后续的标注和学习步骤中被不断传播放大,影响最终的 ...
- 【读书笔记】代码大全34章:软件工艺主题
这本书大部分讲的都是软件开发的细节,本章节讲的主要是从宏观角度讲解软件工艺. 控制复杂度 软件开发的精髓就是控制复杂度 降低复杂度的方法 将系统拆分成子系统 精心设计接口,尽量隐藏设计细节 避免使用全 ...
- 用计算机设计软件,平面设计中计算机设计软件的作用
摘要:计算机平面设计在整个平面作品的设计中扮演着十分重要的角色,通过有效的计算机平面设计能够为人们提供更多的平面设计作品.为此,文章在阐述平面设计中计算机设计软件应用意义的基础上,为如何将计算机设计软 ...
- python画图代码大全-Python实现画图软件功能方法详解
概述 虽然Python的强项在人工智能,数据处理方面,但是对于日常简单的应用,Python也提供了非常友好的支持(如:Tkinter),本文主要一个简单的画图小软件,简述Python在GUI(图形用户 ...
- Docker学习笔记五 在测试中使用Docker
2019独角兽企业重金招聘Python工程师标准>>> 5.1 使用Docker测试静态网站(Nginx) 将项目命名为Sample 首先建立构建环境 mkdir sample cd ...
最新文章
- 在看不见的地方,AI正在7×24为你在线服务
- 有赞融资10亿港元 腾讯领投加紧布局产业互联网
- 召集最强的智,昇腾计算产业射出一支「穿云箭」
- magicui系统会不会升级鸿蒙,华为EMUI 11和Magic UI 4.0同步开启内测,均升级为鸿蒙系统...
- Python老男孩 day15 函数(二) 局部变量与全局变量
- 今晚直播 | ICML 2021论文解读:基于Cox-MLP模型的二阶段共形预测
- C# 值类型与引用类型的详解
- linux内核打印前有buildroot,buildroot-linux内核
- Linux find 命令概览
- java math rint_Java Math rint() 使用方法及示例
- Linux中mongodb定时远程备份
- 如何判断真假“中台”?
- 【java】爬虫之零基础利用postman分析并实现12306余票查询功能
- stm32驱动ssd1306配置_STM32实验-SSD1306 OLED显示实验
- 机器学习(14)——激活函数
- digester_Apache Digester示例–轻松配置
- 投屏设置 android,上班摸鱼神器 Anlink安卓手机投屏操作体验
- C语言:输入一个不多于5位的正整数,要求1:求出它是几位数; 要求2:分别打印出每一位数; 要求3:按逆序打印出各位数字;
- 【云原生之Docker实战】使用Docker部署Cloudreve公有云文件系统
- 富友支付接口对接不是必填的值如何处理
热门文章
- php怎样注释代码块,vscode怎样注释方法代码块
- 图卷积网络(Graph Convolutional Network)
- 图像语义分析--深度学习方法
- python实现Dijkstra算法求解图中最短路径距离
- 遍历图像方法以及注意事项
- Dialog里加入下拉框Java_android 自定义dialog弹出框,带单选多选下拉
- python下视频的包_这套Python视频超详细,包你一小时就可开始入门,100天在编程界驰骋~...
- mysql报1665_mysql错误处理之ERROR 1665 (HY000)_MySQL
- Unity TextMeshPro中文显示为方块
- Joda-Time简单使用