APP推广合作
联系“鸟哥笔记小乔”
【高阶架构师必看】架构设计的两种无上心法-易筋经和太玄经
2024-11-07 13:55:41

编 辑:老彭

来 源:大数据架构师

彭友们好,我是老彭。最近看了一本好书,人称“Bob大叔”的Robert C.Martin写的《整洁架构之道》。一直在数据和架构领域追寻大佬的老彭那读的是津津有味啊~~~

我在带团队的时候经常跟同事们说的一句话就是:只要你在写代码,无论用的是什么语言,做的是什么业务,一定要锻炼自己从架构师的视角思考问题。这也是老彭为啥给公众号取名“大数据架构师”的原因之一。

是否拥有架构师的视角,决定了你是否能编程水平的瓶颈。

好,话不多说,开唠今天的嗑。

01 少林无上内功心法易筋经:高内聚、低耦合

老彭还在本科学习的时候就听说过“高内聚,低耦合”(High Cohesion and Low Coupling)。当时只是单纯的觉得不明觉厉,根本没明白这句话的威力有多大。

再次听到这句话是在考高项的时候,那是老彭已经是一个3、4年经验的SQL Boy了。之前基本上都沉浸在存储过程、提数sql、报表开发等繁重的工作中,全凭本能在写代码,犹如刚上少林寺天天挑水打杂的小和尚,每一个任务就像是一次新的挑水任务,基本上都得重来。

老彭愚钝,一个复杂的报表经常能突破上千行代码,一直觉得这样不对,但又不知道该怎么办。

再次听老师讲解“高内聚、低耦合”其中的奥秘,老彭觉得这简直就是上天来帮助我从繁重的体力劳动中解脱的“易筋经”,一语道破为何那时老彭的代码又臭又长的原因。

所谓内聚性,就是一个软件单位内部的关联紧密程度。

所谓耦合性,则是强调两个或多个软件单位之间的关联紧密程度。

我们要尽可能让一个软件单位内的关联更紧密,或者说把关联紧密的功能放在一个软件单位内实现,这样能避免多余的重复和交互。

同时我们还要尽量让两个或者多个软件单位之间的关联紧密程度不要那么高,减少相互依赖,这样能最大化减少一个软件单位对另一个软件单位的影响,把错误或者运维工作控制在有限范围内。

转头老彭就回去开始重构代码,把各种sql、报表中共性的部分都提炼出来,构造函数,建设基础报表,甚至回过头到数仓的整合层和汇总层重构ETL程序,优化各层的数据模型。

将数仓各层、函数、共性报表进行充分解耦,在每层、每个函数、每个共性报表中把它们需要解决的问题尽量独立完成,使之尽量内聚,之间通过定义数据标准进行交互。

这样一下如同拨开云雾见天明,开发和运维的工作量顿时瞬间降低了一个数量级别。

如果业务系统某张表的字段名字或者长度发生变化,老彭只需要在数仓的第二层进行调整就行了,由于每层做了充分解耦,后面用的字段已经统一为成标准字段、新的数据模型,所以后续代码根本无需做任何调整。

即便是有新表、新字段,由于代码已经层层抽象,数据逐层落地,因此只需要在需要调整的地方略微修改即可。

当老彭花费了不少时间调整之后,终于能按时下班了。这是老彭第一次尝到“架构思维”的甜头。

也需有人会说老彭真笨,学校都教过了,照做就行呗,还需要花这么多时间先错后改,浪费时间。但是老彭觉得,这也需就是“纸上得来终觉浅,绝知此事要躬行”吧。

从文字上来说,就短短的6个字,其中的奥妙还需自己慢慢体会。

02 无上神功太玄经:SOLID原则

如果说“高内聚、低耦合” 太过于基础,那么就得请出如同金庸小说里最强的无上神功太玄经一般存在的SOLID原则:

【高阶架构师必看】架构设计的两种无上心法-易筋经和太玄经

这里不得不吐槽一下老外奇葩的取名方法,逻辑居然是首字母凑单词

Bob大叔在《整洁架构之道》里就披露了SOLID原则的由来:

“20世纪80年代后期,我在 USENET (古早版 Facebook )上和其他人就软件设计原则辩论时,便开始归纳这些原则。多年来,这些原则发生了一些变化。有些被删除,有些被合并,还新增了一些。

2000年代初,这组原则的最终版确定,只是和我的顺序有所不同。

2004年前后, Michael Feathers 给我发了封电子邮件,说如果重新排列这些原则,它们的首字母可以拼成单词 SOLID -﹣于是称为 SOLID 原则。”

SOLID够奇葩了吧?更奇葩的是每个原则的名字...

网上有很多SOLID原则的解释,这里老彭就不赘述了,只讲讲自己的一些体会。

①单一职责原则(SRP)定义为:一个模块应该对且仅对一类行为主体负责。

Bob大叔在书里也吐槽说这个名字取得不好,导致很多人误解了。其实老彭觉得叫做“需求隔离原则”,或者“用户隔离原则”可能会更好。

因为这个原则其实大有来头,是根据“康威定律”推导出来的。

康威定律:软件的最佳系统架构很大程度上取决于开发它的组织架构。也就是说,企业组织架构决定了系统架构。

从这个视角上看,单一职责原则是从需求端视角(用户、用户群等某类行为主体)进行隔离,不能将多个用户、用户群的需要放在同一个模块里,这样会导致某个用户的需求发生变化,会导致该模块的调整,进而影响其他用户的需求。

书里给了一个反例,彭友们一看就明白:

【高阶架构师必看】架构设计的两种无上心法-易筋经和太玄经

Employee类里的三个方法分别服务三个对象。一旦三个CXO中的任意一个人需求有变更,都会导致Employee类要修改,从而影响另外俩CXO的正常需要。

②开闭原则(OCP)定义为:对扩展开放,对修改封闭。

是不是同样有些拗口?其实很简单,老彭带你从面对需求变更的视角就瞬间明白了。

这个原则是为了面对需求变更而存在的。当面临需求变更时,我们尽量减少对现有程序的修改,用新增代码完成变更的需求。减少改代码,就能减少不必要的bug。

怎么实现呢?书里举了一个生成财务报表的例子:

【高阶架构师必看】架构设计的两种无上心法-易筋经和太玄经

注:代表接口,代表数据类,实心箭头代表用关系,空心箭头代表实现或继承关系。下同。

其设计思想是将报表生成拆分为报表数据计算和报表展示两个独立的职责,再加上必要的控制模块和数据库模块,之间都用接口进行隔离,这样就能确保相互不会受到影响。

总体上既能保证非常强的扩展性,又能很好地隔离了各个功能之间的相互影响。在本例中,interactor把核心业务处理好了,其他细枝末节交的任务给另外3个模型实现,最符合OCP原则。

这里有两个设计技巧:依赖方向的控制信息隐藏。接口就是完成依赖方向控制的重要手段之一。接口和data mapper也是信息隐藏重要手段。

在这里个例子,一旦数据库发生变化,只需要改一下data mapper或者接口就行,interactor内部完全不受任何影响。

为了让大家更容易理解,老彭给这个原则取个外号,叫“坚决不改代码原则”,或者叫“只增不改原则”。

③里氏替换原则(LSP)定义为组件必须遵循可以相互替换的约定。是不是看不明白?

其实也非常简单,这是从设计子对象的视角上进行设计的原则。

【高阶架构师必看】架构设计的两种无上心法-易筋经和太玄经

书里给的例子也很清晰,Personal License 和Business License继承Licenes,并且在Billing调用的时候,可以直接替换Licenes,而不会出现不适当的问题。

书里同时给了一个反例,就是矩形和正方形。正方形虽然是矩形的一种,但是他们是有区别的。矩形的两个参数长宽都可以随便变,但是正方形虽然也能继承“长宽”,但是这俩必须得同时变才行。因此正方形不能成为矩形的子类型。

老彭觉得还是叫“龙生龙原则”比较符合拗口的历史替换原则比较合适。毕竟龙生龙凤生凤,老鼠的儿子会打洞。

④接口隔离原则(ISP)定义为恰当地使用接口,避免不必要的依赖。

这个就很好理解了。书里也给出了生动的例子:

【高阶架构师必看】架构设计的两种无上心法-易筋经和太玄经

当user1调用OPS类里的op1时,会强行依赖op2和op3,但是很明显,op2和op3分属user2和user3,跟user1完全没啥关系。这样就造成了不必要的依赖。

解决办法是给每个op(操作)都做一个独立的接口,把操作隔离到接口中,这样就实现了解耦。

这个原则的名字还是挺贴切的,老彭还是给它取个外号吧,就叫“人人有份,大家别抢原则

⑤依赖反转原则(DIP)定义为源代码应该多依赖抽象类型而不是具体实现。

名字同样的拗口,定义同样的不知所云。

其实换个说法就好多了:这是从引用、继承的视角进行设计的原则。为了保证代码不必改来改去(更稳定),我们需要做到以下几点:

1.不要引用易变的具体实现类;

2.不要衍生、继承易变的具体实现类;

3.不要覆盖类中具体实现函数;

4.永远不要直接引用任何具体实现和易变类的名字。

【高阶架构师必看】架构设计的两种无上心法-易筋经和太玄经

Bob大叔建议利用抽象工厂模式设计和管理依赖。如上图所示,中间的曲线是架构边界,上面是抽象接口,下面是具体实现。

因为跨越曲线的箭头方向和实际源代码依赖的方向相反,所以该原则叫“依赖反转原则”。这取名字的水平也是没谁了。

吐槽一下,这真的不是翻译的问题,就tmd是原作者的问题。

老规矩,老彭给取个外号,叫“身份证原则”,大家对外沟通的时候,都取一个不会改的身份证号就完了。至于你的真名、网名、笔名啥的,随便取,随便改。把一个独立的个体,抽象成一个身份证号,完美解决。

03 小结

Bob大叔真的是我偶像!软件领域的巨头之一。架构造诣超神,但是取名字的水平实在是令老彭无力吐槽

以上插图、案例就来自于此书,强烈建议各位购买这本书过来瞅瞅,必有收获。

【高阶架构师必看】架构设计的两种无上心法-易筋经和太玄经

关键词
大数据架构师
分享到朋友圈
收藏
收藏
评分

综合评分:

我的评分
Xinstall 15天会员特权
Xinstall是专业的数据分析服务商,帮企业追踪渠道安装来源、裂变拉新统计、广告流量指导等,广泛应用于广告效果统计、APP地推与CPS/CPA归属统计等方面。
20羽毛
立即兑换
一书一课30天会员体验卡
领30天VIP会员,110+门职场大课,250+本精读好书免费学!助你提升职场力!
20羽毛
立即兑换
顺丰同城急送全国通用20元优惠券
顺丰同城急送是顺丰推出的平均1小时送全城的即时快送服务,专业安全,准时送达!
30羽毛
立即兑换
大数据架构师
大数据架构师
发表文章272
历任多家公司大数据总监、大数据架构师,专注于数字化转型领域。
确认要消耗 羽毛购买
【高阶架构师必看】架构设计的两种无上心法-易筋经和太玄经吗?
考虑一下
很遗憾,羽毛不足
我知道了

我们致力于提供一个高质量内容的交流平台。为落实国家互联网信息办公室“依法管网、依法办网、依法上网”的要求,为完善跟帖评论自律管理,为了保护用户创造的内容、维护开放、真实、专业的平台氛围,我们团队将依据本公约中的条款对注册用户和发布在本平台的内容进行管理。平台鼓励用户创作、发布优质内容,同时也将采取必要措施管理违法、侵权或有其他不良影响的网络信息。


一、根据《网络信息内容生态治理规定》《中华人民共和国未成年人保护法》等法律法规,对以下违法、不良信息或存在危害的行为进行处理。
1. 违反法律法规的信息,主要表现为:
    1)反对宪法所确定的基本原则;
    2)危害国家安全,泄露国家秘密,颠覆国家政权,破坏国家统一,损害国家荣誉和利益;
    3)侮辱、滥用英烈形象,歪曲、丑化、亵渎、否定英雄烈士事迹和精神,以侮辱、诽谤或者其他方式侵害英雄烈士的姓名、肖像、名誉、荣誉;
    4)宣扬恐怖主义、极端主义或者煽动实施恐怖活动、极端主义活动;
    5)煽动民族仇恨、民族歧视,破坏民族团结;
    6)破坏国家宗教政策,宣扬邪教和封建迷信;
    7)散布谣言,扰乱社会秩序,破坏社会稳定;
    8)宣扬淫秽、色情、赌博、暴力、凶杀、恐怖或者教唆犯罪;
    9)煽动非法集会、结社、游行、示威、聚众扰乱社会秩序;
    10)侮辱或者诽谤他人,侵害他人名誉、隐私和其他合法权益;
    11)通过网络以文字、图片、音视频等形式,对未成年人实施侮辱、诽谤、威胁或者恶意损害未成年人形象进行网络欺凌的;
    12)危害未成年人身心健康的;
    13)含有法律、行政法规禁止的其他内容;


2. 不友善:不尊重用户及其所贡献内容的信息或行为。主要表现为:
    1)轻蔑:贬低、轻视他人及其劳动成果;
    2)诽谤:捏造、散布虚假事实,损害他人名誉;
    3)嘲讽:以比喻、夸张、侮辱性的手法对他人或其行为进行揭露或描述,以此来激怒他人;
    4)挑衅:以不友好的方式激怒他人,意图使对方对自己的言论作出回应,蓄意制造事端;
    5)羞辱:贬低他人的能力、行为、生理或身份特征,让对方难堪;
    6)谩骂:以不文明的语言对他人进行负面评价;
    7)歧视:煽动人群歧视、地域歧视等,针对他人的民族、种族、宗教、性取向、性别、年龄、地域、生理特征等身份或者归类的攻击;
    8)威胁:许诺以不良的后果来迫使他人服从自己的意志;


3. 发布垃圾广告信息:以推广曝光为目的,发布影响用户体验、扰乱本网站秩序的内容,或进行相关行为。主要表现为:
    1)多次发布包含售卖产品、提供服务、宣传推广内容的垃圾广告。包括但不限于以下几种形式:
    2)单个帐号多次发布包含垃圾广告的内容;
    3)多个广告帐号互相配合发布、传播包含垃圾广告的内容;
    4)多次发布包含欺骗性外链的内容,如未注明的淘宝客链接、跳转网站等,诱骗用户点击链接
    5)发布大量包含推广链接、产品、品牌等内容获取搜索引擎中的不正当曝光;
    6)购买或出售帐号之间虚假地互动,发布干扰网站秩序的推广内容及相关交易。
    7)发布包含欺骗性的恶意营销内容,如通过伪造经历、冒充他人等方式进行恶意营销;
    8)使用特殊符号、图片等方式规避垃圾广告内容审核的广告内容。


4. 色情低俗信息,主要表现为:
    1)包含自己或他人性经验的细节描述或露骨的感受描述;
    2)涉及色情段子、两性笑话的低俗内容;
    3)配图、头图中包含庸俗或挑逗性图片的内容;
    4)带有性暗示、性挑逗等易使人产生性联想;
    5)展现血腥、惊悚、残忍等致人身心不适;
    6)炒作绯闻、丑闻、劣迹等;
    7)宣扬低俗、庸俗、媚俗内容。


5. 不实信息,主要表现为:
    1)可能存在事实性错误或者造谣等内容;
    2)存在事实夸大、伪造虚假经历等误导他人的内容;
    3)伪造身份、冒充他人,通过头像、用户名等个人信息暗示自己具有特定身份,或与特定机构或个人存在关联。


6. 传播封建迷信,主要表现为:
    1)找人算命、测字、占卜、解梦、化解厄运、使用迷信方式治病;
    2)求推荐算命看相大师;
    3)针对具体风水等问题进行求助或咨询;
    4)问自己或他人的八字、六爻、星盘、手相、面相、五行缺失,包括通过占卜方法问婚姻、前程、运势,东西宠物丢了能不能找回、取名改名等;


7. 文章标题党,主要表现为:
    1)以各种夸张、猎奇、不合常理的表现手法等行为来诱导用户;
    2)内容与标题之间存在严重不实或者原意扭曲;
    3)使用夸张标题,内容与标题严重不符的。


8.「饭圈」乱象行为,主要表现为:
    1)诱导未成年人应援集资、高额消费、投票打榜
    2)粉丝互撕谩骂、拉踩引战、造谣攻击、人肉搜索、侵犯隐私
    3)鼓动「饭圈」粉丝攀比炫富、奢靡享乐等行为
    4)以号召粉丝、雇用网络水军、「养号」形式刷量控评等行为
    5)通过「蹭热点」、制造话题等形式干扰舆论,影响传播秩序


9. 其他危害行为或内容,主要表现为:
    1)可能引发未成年人模仿不安全行为和违反社会公德行为、诱导未成年人不良嗜好影响未成年人身心健康的;
    2)不当评述自然灾害、重大事故等灾难的;
    3)美化、粉饰侵略战争行为的;
    4)法律、行政法规禁止,或可能对网络生态造成不良影响的其他内容。


二、违规处罚
本网站通过主动发现和接受用户举报两种方式收集违规行为信息。所有有意的降低内容质量、伤害平台氛围及欺凌未成年人或危害未成年人身心健康的行为都是不能容忍的。
当一个用户发布违规内容时,本网站将依据相关用户违规情节严重程度,对帐号进行禁言 1 天、7 天、15 天直至永久禁言或封停账号的处罚。当涉及欺凌未成年人、危害未成年人身心健康、通过作弊手段注册、使用帐号,或者滥用多个帐号发布违规内容时,本网站将加重处罚。


三、申诉
随着平台管理经验的不断丰富,本网站出于维护本网站氛围和秩序的目的,将不断完善本公约。
如果本网站用户对本网站基于本公约规定做出的处理有异议,可以通过「建议反馈」功能向本网站进行反馈。
(规则的最终解释权归属本网站所有)

我知道了
恭喜你~答对了
+5羽毛
下一次认真读哦
成功推荐给其他人
+ 10羽毛
评论成功且进入审核!审核通过后,您将获得10羽毛的奖励。分享本文章给好友阅读最高再得15羽毛~
(羽毛可至 "羽毛精选" 兑换礼品)
好友微信扫一扫
复制链接