专栏名称: SegmentFault思否
SegmentFault (www.sf.gg)开发者社区,是中国年轻开发者喜爱的极客社区,我们为开发者提供最纯粹的技术交流和分享平台。
目录
相关文章推荐
程序员的那些事  ·  印度把 DeepSeek ... ·  昨天  
OSC开源社区  ·  2024: 大模型背景下知识图谱的理性回归 ·  2 天前  
程序猿  ·  “我真的受够了Ubuntu!” ·  2 天前  
程序员的那些事  ·  惊!小偷“零元购”后竟向 DeepSeek ... ·  2 天前  
51好读  ›  专栏  ›  SegmentFault思否

面向对象的设计过程

SegmentFault思否  · 公众号  · 程序员  · 2019-11-24 10:00

正文

SegmentFault 社区专栏 TIGERB的技术博客

作者: TIGERB





背景



工作中,几乎大家经常抱怨别人写的代码:

•  没法改
•  耦合高
•  无法扩展
今天就来探讨如何克服上面的问题~




场景



首先问个问题:

平常工作中来了一个业务需求,我们是如何开始写代码的?


我推测大多数人可能:

•  梳理业务
•  设计数据库、接口、缓存
•  评审
•  于是就开始了 怎么怎么样...如果怎么怎么样...怎么怎么样...愉快的码代码的过程

此处有人觉着有啥问题么?
备注:说出来问题的,本次分享就可以略过了~


一个简单的业务场景


比如产品提了个需求:
描述“我一个同事”一天的生活,简单来看看他一天干些啥。

1.0 饿了吃饭
1.1 到点吃饭

2.0 渴了喝水
2.1 到点喝水

3.0 困了睡觉
3.1 到点睡觉
3.2 有可能一个人睡觉,也有可能... 是吧?复杂


刚开始,一个业务逻辑从头写到尾
接着,一个业务逻辑 (拆成多个函数) 从头写到尾:
再接着,一个业务逻辑 (引入类) 从头写到尾:
再接着,一个业务逻辑 (拆成多个类方法) 从头写到尾,也许、可能、貌似、猜测大多数人停留到了这个阶段。

问题:某一天多了社交的能力,咋办?
再接着,一个业务逻辑 (拆成多类) 从头写到尾:
最终,一个业务逻辑 (拆成类、抽象类、接口) 从头写到尾:
思考🤔:上面的代码就没啥问题了吗?


上面就是面向对象设计的代码结果。
所以,如何设计出完全面向对象的代码?




代码建模



什么是 代码建模?

把业务抽象成事物(类 class、抽象类 abstact class)和行为(接口 interface)的过程。


实栗🌰分析

又来看一个实际的业务场景:

最近“我一个同事”开始创业了,刚创立了一家电商公司,B2C,自营书籍《3分钟学会交际》。最近开始写提交订单的代码。

⚠️注意场景 1.刚创业 2.简单的单体应用 3.此处不探讨架构


一般来说,我们根据业务需求一顿分析,开始定义接口 API、设计数据库、缓存、技术评审等就开始码代码了。

接口参数:
uid
address_id
coupon_id
.etc

业务逻辑:
参数校验->
地址校验->
其他校验->
写订单表->
写订单商品信息表->
写日志->
扣减商品库存->
清理购物车->
扣减各种促销优惠活动的库存->
使用优惠券->
其他营销逻辑等等->
发送消息->
等等...


就开始写代码了怎么怎么样...如果怎么怎么样...怎么怎么样...一蹴而就、思路清晰、逻辑清楚、很快搞定完代码,很优秀是不是,值得鼓励。

但是,上面的结果就是大概所有人都见过的连续上千行的代码等等。上面的流程没啥问题啊,那正确的做法是什么呢?就是接着要说的代码建模。

我们根据上面的场景,开始建模。


业务分析少不了


同样,首先,我们看看提交订单这个业务场景要做的事情:

换个角度看业务其实很简单:根据用户相关信息生成一个订单。

1. 梳理得到业务逻辑

参数校验->
地址校验->
其他校验->
写订单表->
写订单商品信息表->
写日志->
扣减商品库存->
清理购物车->
扣减各种促销优惠活动的库存->
使用优惠券->
其他营销逻辑等等->
发送消息->
等等...

2. 梳理业务逻辑依赖信息

用户信息
商品信息
地址信息
优惠券信息
等等...

再次回归概念
什么是代码建模?把业务抽象成事物(类  class、抽象类abstact class)和行为(接口 interface)的过程。



获取事物


我们把订单生成的过程可以想象成机器人,一个生成订单的订单生成机器人,或者订单生成机器啥的,这样我们就得到了代码建模过程中的一个事物。

从而我们就可以把这个事物转化成一个类(或结构体),或者抽象类。


获取行为


这些操作就是上面机器人要做的事情。

事物有了:订单生成机器人 行为呢?毫无疑问就是上面各种业务逻辑。把具体的行为抽象成一个订单创建行为接口:

得到UML




设计代码


1. 定义一个类

2. 定义一个订单创建行为的接口

3. 定义具体的不同订单创建行为类

参数校验->
地址校验->
其他校验->
写订单表->
写订单商品信息表->
写日志->
扣减商品库存->
清理购物车->
扣减各种促销优惠活动的库存->
使用优惠券->
其他营销逻辑等等->
发送消息->
等等...

4. 创建订单

这里的代码该怎么写,这样?

还可以继续优化吗?

使用闭包。

PHP 版完整代码







请到「今天看啥」查看全文