摘要
在开发一个项目之前需要首先清楚地明白自己需要做什么。需要达到什么样的效果,采用怎样的技术路线去实现自己想要的效果。这就需要通过对需求的分析,得到项目的架构
Situation 需求分析
人性是提出需求的本源,通过分析 人性 来抓住 用户诉求。
需求分析角度
明确以下三方面:
-
边界:哪些是需要自己做的,哪些是不需要自己做的。
-
用户故事:能够以用户的角度,结合不同的用户场景,走完所有用户诉求。
-
用户路径:实现某种功能所需要的步骤。用户路径尽可能的短。
需求分析结果
得到的需求应满足以下条件:
-
模块化;
-
配置化;
-
有逻辑
需求落地路径
需求分析-》可行性-》设计-》编码-》测试-》发布
Architecture 架构分析
架构的定义
架构是一种能力,而不是岗位。架构用来描述项目代码的组成以及决策。
项目代码的组成:模块的结构及模块之间的关系。
项目代码的约束:设计原则及代码的生长方向。
总结来说如下:
架构=组成+决策
组成=模块结构+模块关系
决策=约束+设计原则+演化方向
架构解决的问题
通过架构分析,需要解决以下四个问题
-
确定技术上做与不做
-
确定模块之间的依赖关系与模块的输入和输出
-
使后续子系统在一个既定框架内和技术方向上继续演化
-
明确非公能性需求:安全性,可用性,可扩展性
架构的约束
在设计架构时,需要考虑的条件如下:
1.让系统由可扩展性和可维护性;
2.让系统恰到好处解决问题;
3.让系统3-5年不重构;
架构图 - 架构的体现方式
架构图的定义
水平上业务模块 + 垂直方面的技术依赖 形成的 逻辑结构图。
架构图分类
架构图的画法
-
明确架构图的类型
业务架构图:使用一套方法论,对所涉及到的业务单元进行划分
应用架构图:对整个系统的实现进行可视化落地实践。
数据架构图:对存储数据的架构逻辑,根据各个系统应用场景,不同时间段的应用场景,对数据进行诸如数据异构、读写分离、缓存使用、分布式数据策略等划分。
技术架构图:承接应用架构的技术需求,把各个关键技术和技术之间的关系描述清楚。
-
确认关键要素
-
理清关键要素之间的关联
-
使用显而易见的方式画出
布局:布局要符合大多数人的思维习惯
颜色:颜色突出主体
逻辑:能够体现出业务逻辑
UML 画类图及时序图
UML 的分类:
静态结构图:类图,对象图,包图,组件图,部署图
动态行为图:交互图(时序图与协作图),状态图,活动图
类图:
描述类之间的关系。类的六大关系:
泛化关系:类之间的继承。
实现关系:某个类实现某个接口。
聚合关系:类之间生命周期不完全一样,不存在很多接口的调用。
组合关系:类之间的生命周期一直,有较多接口调用
(为了分解任务,产生了聚合关系及组合关系。如果类之间是聚合关系,则任务可分解给多个人,如果类之间是组合关系,则任务最好分给一个人)
依赖关系:在类的方法中调用到了别的类。
关联关系:体现业务逻辑之间的依赖关系。
时序图:
描述对象之间发送消息的事件顺序显示多个对象之间的动态协作
关注正常流程
不关注逆流程
不关注异常流程
不关注分支判断
结论
作为工程师,不仅需要了解技术,同时应该理解需求。当对需求有深刻了解的时候,架构设计上才会出现神来之笔。
站在模块之间的角度上:需求推导出模块;工程师的经验+系统设计原则推导出模块之间的关系;根据以上两点,选定技术栈及技术路线。
站在模块中的类角度上:OOD设计原则推导出该写哪些类,以及每个类应该怎么实现。
后续工作
熟悉OOD设计原则:阅读并实践 Head First OOD。
熟悉23中设计模式:实践这些设计模式。
完成T31类图及时序图设计;
按照以上方式,设计当前公司的工单系统。
在实践过程中补充本文。
附录
OOD设计原则
目的:提升软件可扩展性,可维护性
单一职责
高内聚、低耦合的延伸。最简单也是最难的。
-
属性和行为向着模块 预先定义的功能 内聚
-
模块的名字非常重要
违反的危害:
-
难以维护
里氏代换
父类能出现的地方,子类一定能出现。
违反的危害:
-
瞎继承
接口隔离
接口粒度要尽可能小。接口内方法强内聚同一特征。
违反的危害:
-
违反了单一职责
组合复用
尽量用组合,不用继承。
违反的危害:
-
违反里式替换
-
造成接口污染:多态
依赖倒置
细节依赖抽象。底层依赖高层。
违反的危害:
-
代码复用性太差。
迪米特原则
不需要关注具体代码实现。
(不能返回多余的东西)
违反的危害:
-
难以维护
开闭原则
对扩展开放,对修改关闭
任何变化的点,都需要被隔离出来。
识别和隔离变化的点。
违反的危害:
-
难以维护
重复代码的危害
-
不一致性
-
代码冗余
-
容易出bug