最近在开发过程遇到一个问题,最初期的版本需求很简单,当然我实现的也很简单。但中途不断的有新的需求提出来,在以前的简单代码中加入后来的新需求,变的越来越复杂,导致代码的可维护性大大降低。介于这个问题,我决定把代码整理一下,记录一下。
当我们的代码在一个主循环中,有很多的变量要监控,那意味着将有很多的 if--else语句,这样的代码在后期很难维护,如下:
•
•
while (!_
isInterrupted
) {
•
OperByDate
();
•
if (
IsGetSkuTimeOut
()) {
•
GetServerBaserInfo
();
•
}
•
// is get notification list time up
•
if (
IsGetNotificationTimeOut
()) {
•
GetServerNotificatonList
();
•
}
•
// is xxx
•
if(
IsGetXXXXTimeOut
()){
•
Dosomethis
();}
•
ThreadSleep
(120000);// 60s
•
}
后来,决定,对他重构。
思考:
•
对于一个完成的系统,我们新增加任何一个功能的复杂度都应该是一个常数,而不应该随的系统的增大增加,如果其他功能不变的话,我们不需要改动其他的代码。
•
设
计模式
-----》
面向接口的编程
•
在系统分析和架构中,分清层次和依赖关系,每个层次不是直接向其上层提供服务(即不是直接实例化在上层中),而是通过定义一组接口,仅向上层暴露其接口功能,上层对于下层仅仅是接口依赖,而不依赖具体类
。
----
引用
•
这也是设计模式的
依赖倒转
原则
介于这个考虑:
最终变成:
这样的好处
总结:
介于这个考虑:
最终变成:
•
//
新方案
•
while
(!_
isInterrupted
) {
•
for(
IEventTick
event :
mEventArray
)
•
event.Tick
();
•
ThreadSleep
(120000);// 60s
•
}
这样的好处
•
接口与实现分离
•
上
层不再关心具体的逻辑,只负责调用抽象的接口进而找到具体的实现类上层代码由
800
行减到
127
行
•
依赖倒置
—-
具体依赖抽象
如果我们要加一个新的事件,只需做三步1,实现一个新类来实现接口的方法2.实现这个类对象构造的factory 3.将这个对象加入到上层的事件队列中。
最坏的打算,如果某个逻辑有变动的话,我们只需找到具体的类来修改其逻辑即可,不会影响到其他逻辑,因为我们的逻辑都是单独的一个对象。
•
我们在设计系统的时间,往往是需求很不明确,这个时间,个人不建议我们设计人员去“发挥太多的想象”,这样很容易引起过度设计甚至是南辕北辙,但在后面当我们对需求慢慢的明确的时间,当你发现每当变动一个功能时,你的工作量会随着系统的增大而增大时间,请停下来,思考一个是否应该把代码重构一下。
•
个人认为设计模式的这几个原则很重要,我们在写代码的时间会不会考虑到,我们的代码是否达到了一下的标准:
•
Ocp
原则
•
当
然还要尽可能的减少类之间的耦合度