设计之二

设计从根源上来说是一种想法;而将这种想法落实到代码层次则是这种想法的实体化;真正将设计实现是编译以及随后的运行。

设计是针对什么的?这个问题似乎很少有人考虑,就如同很少有人考虑设计的内容除了结构还要有其他很多内容。而实际上,设计不仅仅要考虑代码的静态结构,还应该考虑程序的动态结构。

既然设计可以被认为是一种想法,那么设计就存在变化的必然。而设计的内容,需要设计者在各种约束下不断的权衡。这种权衡,不如说是纠结,经常会带来放射性的扩散。最终的结果,可以看作各种选择确定之后,带来的动态平衡。然而周围的环境会改变,人们的看法会可能会改变,因此设计者经常性的会有调整这种平衡的动机。

自然的重构是一种优先的选择。在理想的情况下,完善的单元测试可以保证程序的功能不会改变,被修改的仅仅是其内部的结构。然而,我们很少会仅仅为了优化内部结构而重构代码。多数情况下,我们还是为了修改代码运行的结果而重构。而当然的,我们也很少会仅仅为了一个更加优美的结构,而修改我们的想法。多数情况下,我们还是在修改程序运行结果的目的下,顺便的修改代码的结构。而从这个角度说,重构的价值依然体现在为了修改而先将结构进行重构。

测试无疑是重要的,这不仅仅是体现在重构的基础是建立在完善的单元测试基础上。实际上测试定义了功能的实现结果,也定义了功能的修改。任何的功能,都需要通过测试去定义,也需要通过测试去验证。而进一步,通过单元测试来实现功能测试是一种合理的选择。关键点在于,通过代码来表达自己的意图,而意图也必须通过代码来表达。这一点从设计的角度来看,是相通的,其实也是相同的。也就是说我们的设计想法,首先应该落实为单元测试,而不是首先落实在其实现的结构。这并非是我要强调TDD,而是我要强调需求需要一种客观的表达样式,就如同设计也需要一种客观的表达样式。

修改历来被程序员们诉抵触,这种情绪来自对修改所带来的工作量的不确定。这种不确定,本质上是因为我们确实很少能确定我们的生产效率。从这个角度来说,经验是重要的,能力也是重要的。而事情也可以这样说,能够很好的控制对程序的修改,也是设计者能力和经验的体现。我们应该对修改采取一种开放的态度,抵触自然是不行的。但是肆无忌惮的进行修改也是不行的。

从设计到实现,是一个逐步渐进的过程,也是一个逐步修正的过程。这种渐进性,是我所强调的。就如同我强调设计不仅仅关乎结构一样,这种渐进性,也让我们能够从另外的一个角度审视我们所作的。而进一步来说,可修改性的结果就是渐进性的基础。

猜你喜欢

转载自ozzzzzz.iteye.com/blog/1821757
今日推荐