干。。。咳咳。。。不是你想的那样。。。
干的英文是DRY,也就是所谓的do not repeat yourself原则。
固体的意思是SOLID,也就是所谓的五大原则的集合。
那么问题来了,为什么不把DRY也加入SOLID,变成六大原则呢?难道是因为SOLID里面已经有了一个D再加个D进去就不好拼成单词了?
显然事情没这么简单,只要有过一些项目经验的人就会发现,SOLID和DRY竟然是矛盾的,自然没法合到一起。
当你越想让系统符合SOLID,那么就不可避免的会引入duplicated code,当你越想把duplicated code清的一干二净的时候,你的系统就越不SOLID。
挖了个去,原来以为这两位是兄弟,没想到却是仇家。
关于为什么这两位存在矛盾,我就不举例了,不然2000字也说不清楚。
那么问题又来了,既然两者不能相容,那我的系统到底要哪个?是要DRY还是要SOLID?
等等,咱能不能两个都要,既给宝总服务也给强总服务,做个双面间谍也不是不可以嘛。
ok,但还是有个问题,即使两个都要了,那要偏向哪个更多些呢?
当然更喜欢有腔调的宝总了,SOLID五个字母,非常坚固扎实的腔调。强总嘛,修养不行,整个人看上去比较干瘪无趣DRY。
所以一定是在做好SOLID的基础上再去删除那些不太影响SOLID的duplicated code,如果duplicated code对SOLID影响很大,也没法再优化了,那这样的duplicated code就不能删除。
总之,SOLID对系统的重要性远大于DRY。
很多大聪明看到duplicated的第一反应是不行,duplicate就是代码有问题了,你一定要把它优化掉。
其实,就像之前写的SRP,如果我两份一摸一样的代码能确保每份代码只有一个actor,那么这种duplicate其实并不是duplicate,因为它们处于不同的平行宇宙之中,不存在相交的可能性,这样的设计反而是好设计。