<读书笔记>(模块层面)BMS-5: 将关注点进行分离

"如果一个系统即复杂且高耦合, 则一定会发生许多意料之外的事情"

原则: 避免出现大型的复杂模块, 因为模块过大功能过多往往意味着模块间的紧耦合.

解决之道: 为每个模块安排单一的职责, 且使用接口将实现进行隐藏.

好处: 代码会变得更易维护. 且代码更易进行测试和使用.

之前的 4 个原则都是针对代码单元而言的, 意味着在实践中应用它们可以让独立的代码单元(方法/构造函数)更易维护.

从这里开始, 就转而关注模块(Module)层面上的内容了.

注意: 这里的"模块"在面向对象语言中指的是一个类, 比如 Java 中的一个 class. 即之后的模块层面上的原则都是为了解决类之间的关系问题的.

而本条原则的主旨是: 解决类之间的耦合问题, 总地来说就是分离关注点.

设计一个复杂的软件系统需要考虑很多,每一个需要考虑的方面可以称之为一个关注点(Concern),良好的设计需要把这些关注点分门别类,划分为若干模块,让程序开发人员在处理一个关注点时可以尽可能少的被其他关注点的细节所干扰。模块化软件开发就是一种分离关注点(Separation of Concerns)的手段,模块化应当遵循高内聚、低耦合的原则,提高模块的独立性。

这里遇到一个 fan-in 的概念, 软件设计中,扇入扇出的概念是指应用程序模块之间的层次调用情况。
按照结构化设计方法,一个应用程序是由多个功能相对独立的模块所组成。
扇入:是指直接调用该模块的上级模块的个数。扇入大表示模块的复用度高。
扇出:是指该模块直接调用的下级模块的个数。扇出大表示模块的复杂度高,需要控制和协调过多的下级模块;但扇出过小(例如总是1)也不好。扇出过大一般是因为缺乏中间层次,应该适当增加中间层次的模块。扇出太小时可以把下级模块进一步分解成若干个子功能模块,或者合并到它的上级模块中去。

设计良好的软件结构,通常顶层扇出比较大,中间扇出小,底层模块则有大扇入。

1 一个实际的例子

某个类最开始只有读取用户, �修改用户, 判断用户是否存在这三个功能. 但没有使用接口进行隐藏实现. 而后随着不断添加新的需求, 不断迭代, 导致类的功能不断增加, 形成了一个大型类, 而且该类又被多个地方调用(超过 50 处), 即大扇入. 结果就是这个类变成一个紧耦合的类, 因为它被大量的上层模块调用, 且没有接口, 而是直接在实现上进行调用, 而且它也知道许多其他类的内部情况.(比如它可以调用不同的数据访问层模块来完成不同的功能, 而这些调用也是在实现上调用, 而非调用接口.)

模块间的耦合指的是当改变发生的时候, 却发现两个或多个系统部分是连接在一起的. 就像是你想拆掉发动机, 却发现发动机和变速箱焊到了一起解不开了.

这种紧耦合的结果就是它们变为了可维护性提升道路上的绊脚石. 而上面说的这个大型类也就是没有合理分离关注点才形成的.

而这样的大型类后面也就越来越难理解, 甚至变得无法管理.

�总结一下, 为什么类之间的耦合需要高度重视, 主要是因为:

  • 耦合本身就是一个模块层面上的代码问题.
  • 耦合是绝对存在的, 但它有程度的区别, 我们要做到的是尽量低耦合. 而耦合的程度是通过 number of callsize of that class 共同来衡量, 即外界的调用数量(扇入), 以及这个类的大小. 比如外界若调用这个类的次数更多, 那这个类就应该要更小.

从整个程序的维度来看, �上层模块的扇出(调用其他模块的次数)应该是大的, 而底层模块的扇入(被其他模块调用的次数)应该是大的, 所以保证低耦合的手段就是尽量减小类的体积. 而减小类体积的方法就是对关注点进行合理分离(�假设在代码单元层面上的可维护原则已经得到合理应用), 另外就�是使用接口来隐藏实现, 从而达到低耦合.

2 动机

  1. 更小的, 更低耦合的模块让多人开发更加容易, 并且变更的时候更加容易进行.
  2. 更小的, 更低耦合的模块更加容易定位.
  3. 更小的, 更低耦合的模块对所有开发者都更加友好.

3 做法

  1. 将关注点进行合理分离, 从而减小类的体积. 即模块的功能应该是单一的, 这需要对关注点进行合理分离.
  2. 利用接口来隐藏实现.
  3. 将代码替换为 Library 或 Framework, 这样可以保证在一处维护代码而让多处使用, 这样也可以保证模块间的低耦合.
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容