电梯是上班族最常使用的工具之一。上班、下楼取快递、拿快递上楼、下楼取外卖、拿外卖上楼、下楼抽烟摸鱼、上楼、下班……每个人每天都要往返乘坐电梯很多次。
而电梯的设计也是五花八门。最常见的莫过于想上楼就按上想下楼就按下,进了电梯想去几楼就按几楼的那种。而有的电梯为分流考虑分高低层、奇偶层;有的小区电梯为安全考虑进去之后需要刷卡才能按楼层键,且只能按你注册的那个楼层;也有的电梯可以在外面就选择楼层等等。
而我最近的项目是给一个客户的系统做DDD改造,他们所在的大楼电梯比较新奇。你必须在电梯外面扫员工卡,然后在触摸屏上选择要去的楼层,扫卡处的显示屏会通知你将要乘坐的电梯编号。
比如你要去18层,刷卡之后点击18层,然后显示屏会显示C,提示C电梯将带你去18层。而其他人这时如果再选择其他楼层,很有可能为他服务的将是另一部电梯。如果你是一个程序员,显然就会意识到这时的调度算法肯定是和普通的电梯不一样的了。
这天我正在给团队介绍DDD中应用服务与领域服务的区别。可能是我表达能力有限,讲了半天大家还是一脸疑惑。已经到饭点儿了,只好先暂停,我和同事大饼准备下楼吃饭。
大饼刷了临时员工卡,按下了1层,屏幕上显示的是D。这时刚好电梯来了,大饼一边喊一边拉着我往里进:“DDD”。
什么?DDD?Aha!
DDD初学者最容易迷惑的概念就是应用服务和领域服务。因为一般来说代码只会有一个服务层,什么逻辑都往里面放。如果突然告诉他们还有应用服务和领域服务之分,自然是一头雾水。
但这部电梯的设计恰好完美解释了什么是应用服务什么是领域服务。
对于一部电梯来说其核心的业务逻辑应该是可以根据指令上行、下行(有可能还包括开门、关门),但至于指令是如何产生的其实并不关心。对于最普通的电梯系统