关于软件设计
目标
- 软件设计本质是什么:
- 典型的软件设计思维误区及解析
- 设计软件必备的 4 大知识模块
- 面向对象的主流设计原则
- 主流的编程范式
- DDD设计方法
- API在软件设计中的地位是什么?
编码常见问题
- 一直在增删改查,缺少大局观,闷头写代码,埋下了很多自己也不知道的坑;
- 系统出现问题时,只能头疼医头,脚疼医脚,找不到引发问题的本质原因;
- 为了一个小需求,要在无数的地方小心翼翼地做着各种微调,还被产品经理嫌弃改得慢;
- 每次针对需求变更而开发的代码,都会导致无尽的 Bug,连那些本来还好的代码模块也逐渐腐坏变烂;
- 把各种代码堆砌在一起,在出现 Bug 时,犹如“大家来找茬”一样在其中定位问题,脑壳痛。
https://time.geekbang.org/column/intro/100052601?code=u3c5Yd1wi7RMITQlibDv%2F1MmwKzXWv1yB63-HuUDXtI%3D
软件设计的本质
设计是为了让软件在长期更容易适应变化。 — Kent Beck
软件设计的优劣在根本上决定了软件系统的质量。好的设计,可以让系统更容易修改和扩展,不好的设计,却会让人举步维艰
软件设计是一门关注长期变化的学问。一个模块应该有且仅有一个变化的原因。一个模块最理想的状态是不改变,其次是少改变,它可以成为一个模块设计好坏的衡量标准
消除重复,也是软件设计的初衷 程序库 标准库 第三方库 包管理器
到底什么是软件设计?是具体技术实现?是框架和中间件?是设计模式?……
软件设计要关注长期变化,需要应对的是需求规模的膨胀,而上面这些提到的误解则都是不断在变的东西,没有直击问题本质。
软件设计其实是在软件开发过程中,建立起一个统一的结构,便于参与这个过程的所有人都能有一个共同的理解,类似于建筑图纸。
而这个统一的结构,我们可以将其理解为一个模型,它是一个软件的骨架,是一个软件之所以是这个软件的核心。
模型的粒度可大可小,小到可以是一个类(class),也可以大到一个系统(system)
软件设计=模型+规范。https://cloud.tencent.com/developer/article/1770330?from=article.detail.1779958
主流的编程范式
结构化编程、面向对象和函数式编程
面向对象的主流设计原则
SOLID原则:出自 Robert Martin 的著作《敏捷软件开发:原则、模式与实践》和《架构整洁之道》,他在这两本书对SOLID原则进行了完整的阐述。
- 单一职责原则(Single Responsibility Principle, SRP)
- 开放封闭原则(Open-Closed Principle, OCP)
- Liskov替换原则(Liskov Substitution Principle, LSP)
- 接口隔离原则(Interface Segregation Principle, ISP)
- 依赖倒置原则(Dependency Inversion Principle, DIP)
设计模式
关注点分离
KISS 原则
YAGI原则(You aren’t gonna need it)
DRY原则(Don’t repeat yourself)
“高内聚,低耦合”
简单设计(Simple Design)原则
- 通过所有测试;
- 消除重复;
- 表达出程序员的意图;PS:代码要说明做什么,而不是怎么做。
- 让类和方法的数量最小化。
最小的核心模型
一个好的设计,应该找到一个最小的核心模型,所有其他的内容都是在这个核心模型上生长出来的,越小的模型越容易理解,相对地,也越容易保持稳定。比如设计一个http mock服务器,其核心模型为server.request("foo").response("bar");
一方面表达出预期;另一方面给出返回的结果。
所谓模型,它也被称之为抽象,它是软件的核心内容,理解模型就可以帮助我们从高维度建立对软件的整体认知。比如,DI依赖注入是一种模型解决了组件创建和组装的问题,MapReduce也是一种模型解决了分布式计算中节点分发和调度的问题
软件设计的流程
软件设计的第一步:分离关注点
需求分析,多多关注非功能性需求 –》 拆解出模块
了解一个软件的流程
看源代码是了解软件设计的必经之路,但却不是第一步。
郑晔老师说道,了解一个软件的设计,可以从三个部分着手,它们是:模型、接口和实现。
软件设计之美课程大纲
API在软件设计中的地位是什么?
参考软件框架设计的艺术 https://baike.baidu.com/item/%E8%BD%AF%E4%BB%B6%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E7%9A%84%E8%89%BA%E6%9C%AF
Ref
https://cloud.tencent.com/developer/article/1770330?from=article.detail.1779958