用C语言实现一个命令执行的功能容易做出这样的模块划分,解析模块,命令模块,控制模块,这样划分模块的出发点很简单,站在测试的角度上,所有的模块都是可测试的。
但是当我回头审视时,突然发现Command模块本身提供的所有的方法都只被controller使用,并且Command实现的方法都非常的简单,为什么不能将Command和controller合并,它们的合集仍然可以表达一个完整的概念,虽然细分后的模块也具备完整的概念,难道仅仅为了可测试性的原因就要划分出一个模块,这个理由显然不充足,和同事讨论了20多分钟,最后他用一个词点醒了我,“层次”,对,我们划分模块不是因为它的大小而是因为层次,很显然从上图可以看出controller与paser、command模块不是一个层次上的,它们是使用者和被使用者的关系,并且它们本身具有独立的概念,有独立的职责,这样的模块就应该被才分。
在最近的工作上忽略了这个概念,虽然写出来的代码能用,但是没有区分层次的代码总是混乱不堪,相互影响,有物理上的影响,也有逻辑上的影响。
当然,要忘了划分出的调用者模块一定要具有自己的逻辑实现,不要被被调用模块的实现架空了,这样的调用者模块就完全没有存在的必要了。