软件设计的哲学:第八章 降低复杂性

2023-12-25 18:08

本文主要是介绍软件设计的哲学:第八章 降低复杂性,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 8.1 示例:编辑器文本类
  • 8.2 示例:配置参数
  • 8.3 做过了头
  • 8.4 结论

本章介绍了另一种思考如何创建更深层次类的方法。假设您正在开发一个新模块,并且发现了一个不可避免的复杂性。哪个会更好呢:应该让模块的用户处理复杂性,还是应该在模块内部处理复杂性? 如果复杂性与模块提供的功能有关,那么第二个答案通常是正确的。大多数模块的用户都比开发人员多,所以开发人员比用户遭罪更好。作为一个模块开发人员,您应该努力使您模块的使用用户生活的尽可能轻松,即使这意味着您需要额外的工作。表达这一思想的另一种方式是, 对于模块来说,拥有一个简单的接口比简单的实现更重要

作为一名开发人员,很容易采取相反的方式:解决简单的问题,把困难的问题推给其他人。 如果出现不确定如何处理的情况,最简单的方法是抛出异常,让调用者处理它。如果您不确定要实现什么策略,您可以定义一些配置参数来控制策略,并让系统管理员为它们找出最佳值。

这样的方法在短期内会使你的生活更容易,但它们会增加复杂性,因此许多人必须处理一个问题,而不是一个人。例如,如果一个类抛出一个异常,那么该类的每个调用者都必须处理它。如果类导出配置参数,则每个安装中的每个系统管理员都必须学习如何设置它们。

8.1 示例:编辑器文本类

红尘小说网 https://www.zuxs.net/

考虑为GUI文本编辑器管理文件文本的类,这在第6章和第7章中讨论过。该类提供了将文件从磁盘读入内存、查询和修改文件在内存中的副本以及将修改后的版本写回磁盘的方法。当学生必须实现这个类时,他们中的许多人选择了一个面向行的接口,该接口具有读取、插入和删除整行文本的方法。这导致了类的简单实现,但也为更高级别的软件带来了复杂性。在用户界面级别,操作很少涉及整行。例如,击键会导致在现有行中插入单个字符;复制或删除选择项可以修改几个不同行的部分。使用面向行的文本界面,为了实现用户界面,高级软件必须分割和连接行。

面向字符的接口(如6.3节中描述的接口)将复杂性拉低。用户界面软件现在可以插入和删除任意范围的文本,而不需要分割和合并行,因此变得更加简单。text类的实现可能会变得更加复杂:如果它在内部将文本表示为行集合,那么它将不得不分割和合并行来实现面向字符的操作。这种方法更好,因为它封装了文本类中分割和合并的复杂性,从而降低了系统的整体复杂性。

8.2 示例:配置参数

配置参数是一个向上而不是向下移动复杂性的例子。类可以导出一些控制其行为的参数,而不是在内部确定特定的行为,例如缓存的大小或放弃之前重试请求的次数。然后该类的用户必须为参数指定适当的值。配置参数在当今的系统中非常流行;有些系统有数百个。

支持者认为配置参数是好的,因为它们允许用户根据自己的特定需求和工作负载调整系统。在某些情况下,底层基础结构代码很难知道应用的最佳策略,而用户对他们的域要熟悉得多。例如,用户可能知道某些请求比其他请求的时间要求更严格,因此用户为这些请求指定更高的优先级是有意义的。在这种情况下,配置参数可以在更广泛的领域内获得更好的性能。

然而,配置参数也为避免处理重要问题并将其传递给其他人提供了一个简单的借口。在许多情况下,用户或管理员很难或不可能确定参数的正确值。在其他情况下,只需在系统实现中做一点额外的工作,就可以自动确定正确的值。考虑一个必须处理丢失的包的网络协议。如果它发送了一个请求,但是在特定的时间段内没有收到响应,它将重新发送请求。确定重试间隔的一种方法是引入配置参数。但是,传输协议可以自己计算一个合理的值,方法是测量成功请求的响应时间,然后对重试间隔使用该时间的倍数。这种方法降低了复杂性,使用户不必确定正确的重试间隔。它还具有动态计算重试间隔的额外优点,因此如果操作条件发生变化,它将自动调整。相反,配置参数很容易过时。

因此,您应该尽可能避免配置参数。在导出配置参数之前,先问问自己:“用户(或更高级别的模块)能够确定比我们在这里确定的更好的值吗?”当你创建配置参数时,看看你是否能自动计算出合理的默认值,这样用户只需要在特殊情况下提供值。理想情况下,每个模块应该完全解决一个问题;配置参数导致解决方案不完整,增加了系统的复杂性。

8.3 做过了头

当把复杂性往下传递时要谨慎,这种想法很容易被夸大。一种极端的方法是将整个应用程序的所有功能都放到一个类中,这显然是没有意义的。如果(a)被降低的复杂性与类的现有功能密切相关,(b)降低复杂性将导致应用程序中其他地方的许多简化,(c)降低复杂性将简化类的接口,那么降低复杂性是最有意义的。请记住,目标是最小化整个系统的复杂性。

第6章描述了一些学生如何在反映用户界面的text类中定义方法,例如实现backspace键功能的方法。这似乎是件好事,因为它将复杂性向下传递。但是,将用户界面的知识添加到text类并不能简化高级代码,而且用户界面知识也与text类的核心功能无关。在这种情况下,降低复杂性只会导致信息泄漏。

8.4 结论

在开发模块时,寻找机会让自己承担一些额外的痛苦,以减少用户的痛苦。

这篇关于软件设计的哲学:第八章 降低复杂性的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/536441

相关文章

《数据结构(C语言版)第二版》第八章-排序(8.3-交换排序、8.4-选择排序)

8.3 交换排序 8.3.1 冒泡排序 【算法特点】 (1) 稳定排序。 (2) 可用于链式存储结构。 (3) 移动记录次数较多,算法平均时间性能比直接插入排序差。当初始记录无序,n较大时, 此算法不宜采用。 #include <stdio.h>#include <stdlib.h>#define MAXSIZE 26typedef int KeyType;typedef char In

读软件设计的要素04概念的关系

1. 概念的关系 1.1. 概念是独立的,彼此间无须相互依赖 1.1.1. 一个概念是应该独立地被理解、设计和实现的 1.1.2. 独立性是概念的简单性和可重用性的关键 1.2. 软件存在依赖性 1.2.1. 不是说一个概念需要依赖另一个概念才能正确运行 1.2.2. 只有当一个概念存在时,包含另一个概念才有意义 1.3. 概念依赖关系图简要概括了软件的概念和概念存在的理

word转PDF后mathtype公式乱码以及图片分辨率降低等一系列问题|完美解决

word转PDF后mathtype公式乱码以及图片分辨率降低等一系列问题|完美解决 问题描述 最近在投一篇期刊论文,直接提交word文档,当时没有查看提交预览,一审审稿意见全是:公式乱码、公式乱码、乱码啊!!!是我大意了,第二次提交,我就决定将word文档转成PDF后再提交,避免再次出现公式乱码的问题。接着问题又来了,我利用‘文件/导出’或‘文件/另存为’的方式将word转成PDF后,发现公式

Redis的设计哲学和实现方式

‌ Redis是一个可用性和分区容忍性优先的系统。 Redis的设计和实现强调了高可用性和高性能,而不是严格的数据一致性。 这一点可以从Redis的分布式设计、数据压缩支持、以及异步IO机制等方面看出。 ‌分布式设计与数据一致性‌:Redis的分布式设计中采用了异步复制,这意味着当某个节点上的数据发生改变时,这个修改操作会被发送给其他节点,但由于网络传输延迟等原因,这些操作不一定

C语言-第八章:指针进阶

传送门:C语言-第七章:字符和字符串函数、动态内存分配 目录 第一节:常见指针         1-1.字符指针                 1-1-1.变量字符串                 1-1-2.常量字符串                        1-1-2-1.const 关键字 第二节:指针数组 第三节:数组指针 第四节:函数指针 第五节:函数指针数

降低安全违规行为发生率,节省人工监管成本的智慧园区开源了

智慧园区场景视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。 它的愿景是最底层打通各大芯片厂商相互间的壁垒,省去繁琐重复的适配流程,实现芯片、算法、应用的全流程组合,从而大大减少企业级应用约95%的开发成本。充分利用现有的摄像头设备,无需大规模更换,降低成本同时提升系统的实施效率。用户只需在界面上进行简单的操作,就可以实现全视频的接入及布控。 项目搭建地址 基础项目搭建地址:

Matlab simulink建模与仿真 第八章(数学运算库)【下】

参考视频:simulink1.1simulink简介_哔哩哔哩_bilibili 六、圆整函数及最值函数模块 1、Rounding Function圆整函数模块 圆整函数模块的功能是将小数转换为整数,它提供了四种取整方式: ①floor:向下取整,输出距离输入小数在负无穷方向上最近的整数。 ②ceil:向上取整,输出距离输入小数在正无穷方向上最近的整数。 ③round:四舍五入,输出距

【周易哲学】生辰八字入门讲解(二)

😊你好,我是小航,一个正在变秃、变强的文艺倾年。 🔔本文讲解【周易哲学】生辰八字入门讲解,期待与你一同探索、学习、进步,一起卷起来叭! 目录 十神十神判断十神类象十神与五行案例 地支藏干藏干介绍四四四四藏干力量 旺衰强弱旺衰强弱介绍日主强弱判断案例1—强案例2—弱案例3—综合案例4—从强(有克)案例5—从强(无克)案例6—从弱 十神 十神判断 介绍:以日干代表命主

第八章 无尽的任务

1999年,继UO之后又一款奠定网络游戏发展基调的游戏问世了,这就是《无尽的任务》。如果要回顾这款游戏的历史,可以追溯到其诞生10年之前——那一年里,3名年轻人开始了他们在游戏行业的生涯,日后3个人聚集到一起时,便催生了EQ的开发。 1989年,约翰·史沫特莱(John Smedley)是一名狂热的D&D奇幻游戏爱好者,他在1989年大学毕业后加入ATG,为苹果公

哲学概述2(马克)

三、哲学的基本问题 思维是主观的(对应意识) 存在是客观的,不以人的意志为转移(对应物质) 恩格斯说:“全部哲学,特别是近代哲学的重大的基本问题,是思维和存在的关系问题” 哲学的基本问题 何者为第一性 唯物主义√ 存在第一性,思维第二性 存在决定思维唯心主义× 思维第一性,存在第二性 思维决定存在 有无同一性 可知论√ 思维可以认识存在(马哲中,世界上只有尚未认识之物,没有不可认知之物