软件设计之美
郑晔
开源项目 Moco 作者
19890 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 42 讲
软件设计之美
15
15
1.0x
00:00/00:00
登录|注册

04 | 三步走:如何了解一个软件的设计?

你好!我是郑晔。
经过了前面几讲的铺垫,我们已经对软件设计是什么,以及要考虑哪些因素有了一个初步的了解。热身之后,就该开启正式的旅程了。
作为一个程序员,我们在职业生涯中免不了要接手新项目,承担维护该项目的职责。如果一个新项目摆在面前,你会怎么去研究它呢?
很多人的第一反应就是去看源代码。但是,一头扎入代码中,很快你就会迷失其中,最初那股子探索精神,也会逐渐被迷茫所代替。回想一下,有多少次你满怀希望地打开一个开源项目,结果多半都是坚持不了多久就放弃了。你有没有想过,问题出在哪里呢?
你的迷茫在于缺少对这个软件整体的了解,这就如同不带地图指南针闯入密林一般,迷路只是早晚的事。所以,虽然阅读源码是必经的一步,却不应该是你的第一步。我们应该先从了解软件的设计开始。那我们该如何了解一个软件的设计呢?

模型、接口和实现

了解一个软件的设计可以从三个部分着手:模型、接口和实现这三者的关系就好比你去看代码,你会先去看有哪些类以及它们之间的关系,这就是看模型;然后你会打开一个具体的类,看它提供了哪些方法,这就相当于看接口;最后,你再来打开一个具体的方法,去看它的代码是怎么写的,这就是看实现。
好,接下来,我们具体地分析一下每一个部分。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

软件设计的重要性不言而喻,而了解一个软件的设计可以从模型、接口和实现三个部分入手。首先,模型是软件的核心部分,理解模型有助于建立对软件整体的认知,同时也能看到软件发展的趋势。其次,接口决定了软件通过怎样的方式将模型提供的能力暴露出去,是我们与软件交互的入口。最后,实现是指软件提供的模型和接口在内部是如何实现的,是软件能力得以发挥的根基。在实际工作中,许多人以为的设计其实是实现,但实现必须建立在模型和接口的基础之上。模型和接口的稳定度都要比实现高,实现则是要随着软件发展而不断调整。文章强调了了解设计的顺序应该是,先模型,再接口,最后是实现。了解设计,需要一层一层地展开,在每个层次都按照模型、接口和实现进行理解,在头脑中形成一棵设计树。这样的方法可以帮助程序员更好地理解和应对新项目,以及承担维护项目的职责。文章还提出了思考题,鼓励读者找一些自己感兴趣的开源项目,看看它们分别提供了什么,是新的模型、是新的接口,还是新的实现。这样的思考有助于读者深入理解软件设计的重要性和方法。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《软件设计之美》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(37)

  • 最新
  • 精选
  • 西西弗与卡夫卡
    模型,通常包含两类要素,一是基本元素,二是这些元素之间的关系。比如常见的CRM,基本元素就包括项目、客户、合同和回款,相互之间的主要关系通常是客户报备,进入立项环节(评估投入产出),再签约,最后进入回款环节。这是基本模型。 这个模型(系统)的接口,就是要为BD提供从客户报备到签约、回款的整个流程管理。 实现就是要考虑如何用消息在这些模块之间传递数据,状态控制、数据查重锁定等等。

    作者回复: 赞,这个思路很清晰!

    2020-06-01
    3
    49
  • Geek_3b1096
    喜欢老师只能记住一件事总结风格

    作者回复: 能记住就好。

    2020-06-02
    26
  • 闲不住的令狐冲
    上周月度回顾会,团队成员提出一个改进项,希望能在软件设计方面给他们进行一些培训。一直苦于不能系统给大家讲解。老师的这个系列简直就是及时雨,特别是这篇三步走,让我在后续准备培训分享的课程里面一下找到了方向。

    作者回复: 很高兴能配合上你的工作。你可以试着讲一下,有不清楚的地方,我们再交流。

    2020-06-02
    14
  • Y024
    模型->接口->实现,这也是郑老师第一季专栏里结构化思维的一种体现,由全局到定向细节。

    作者回复: 由此可见,两个专栏是一个人写的。

    2020-06-09
    10
  • 苦行僧
    看rocketmq的文档,可以先从https://github.com/apache/rocketmq/blob/master/docs/cn/concept.md了解模型开始

    作者回复: 很好的补充!

    2020-06-02
    8
  • Geek_0315ca
    模型,接口,实现的概念映射到现实生活,类似参观动物王国,园区都会发一张园区导航图。导航图就是整个动物王国的模型,海洋馆,猛兽馆等就相当于接口,现实中的海洋馆和猛兽馆就相当于实现。在模型上展示的接口(海洋馆,猛兽馆)只是文档上的书面表示,看不出来它是用什么材料做的,占地面积。只有我们亲自到了才知道它是用水泥建的塔楼,还是水中的玻璃走廊。在海洋馆或猛兽馆门口都还会有一个导航图(模型),告诉不同种类动物的位置(接口),你按照导航图找到动物所在的位置(接口),看到了想看动物(实现)

    作者回复: 这个比喻很有趣。

    2021-01-17
    2
    7
  • naijiz
    老师,在使用类似springboot+mybatis开发的时候,mybatis-generator生产的mapper,service,service imp,在配合controller,就可以对数据库的数据进行增删改查,然后就可以实现一些CMS啊电商之类的业务需求,似乎都不需要自己定义新的接口和抽象,请问这是因为业务过于简单的原因吗?

    作者回复: 不是,是你把业务逻辑混在了增删改查里面。

    2020-07-31
    2
    7
  • Jxin
    1.模型:圈定了数据,明确了边界。在我的数据范围内的业务才是我的业务。模型是业务的抽象定义。 2.接口:定义了功能,明确了提供什么服务和这个服务的规格。接口是业务的功能口径。 3.实现:选择技术,明确了功能的性能,满足接口的规格,实现业务的逻辑。实现与业务无关,只考虑接口规格和技术选型。 以上个人理解。课后题有点广。没办法随手解答。得有时间翻个项目才好说。

    作者回复: 这个课后思考题就是让大家有一个重新思考的过程。

    2020-06-01
    7
  • 刘岳
    看完老师的文章做了下总结:模型可以理解为对要解决问题的抽象,这里可能更倾向于建模的意思,只有清晰的定义好要解决问题才能写出好的软件,这也是以终为始原则的一个体现吧。一个大的软件还会分解出很多小的模块,小的模块同样适用模型、接口、实现的原则,但小的模块又是上层抽象实现的一部分。接口是软件对外暴露的最基本方法,可以比作成软件的说明书。实现则更具体,接口的稳定性很高,我们可以根据具体情况更改内部实现

    作者回复: 这个理解很到位。

    2020-10-08
    5
  • chenzesam
    以前一直以为 react 的接口设计很有前瞻性,以至于它们的内部架构改了几次对于使用者来说都没什么影响。 读了这个课程之后才发现,它们只是严格遵循了软件设计的原则罢了。 以前一直苦于不知如何改进现有项目的腐败点以及文档的产出,在这里我找到了切入点了,谢谢老师🌹

    作者回复: 好的设计都是类似的。

    2020-06-06
    4
收起评论
显示
设置
留言
37
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部