做软件开发的人员,听的很多的一句话就是系统一定要维护性好,扩展性好。虽然是一句话,但是内部包含的内容和意义非同小可。怎样才能提高系统或者模块的维护性和扩展性呢?下面来做详细的介绍。
1.何为系统的维护性?
2.何为系统的扩展性?
维护性即系统的修改能力,提高系统的维护性即提高系统的修改能力。遇到新的需求,系统能很好的修改。但是我们开发系统人员会发现,我们做的系统并不是很好的修改,往往修改一个地方会导致很多地方出现不同层次的问题。维护工作艰难且巨大。比如我举个例子:
一个开发人员开发了A这个类,后面有50个类在使用它,后面由于一个原因需要修改这个类,需要把这个类分成两个类来操作。你这就会修改51个类,如果更多呢??修改很大的,维护很困难
这种情况下,如果我们最开始有一个代理类,其它50个类来使用A类的时候,通过代理来调用(相当于设计模式中的门面模式)。那么A类修改了,我们只需要改代理类,其它50个类不会做任何修改。
当然这只是提高维护性的一个方式。提供系统的维护性还需要不停的总结,提高。多分层,多设计。
扩展性即系统的开放性,遇到新的需求,能很好的扩展而不是全部去修改。不动以前的内容,只对系统进行增加功能。这个看似不可能的事情,其实是完全可以实现的。大家肯定听说过一个词语,叫对修改关闭对扩展开放。的确这样系统的维护量很小,并且增加功能又不去管之前系统的代码,这样我们系统就会在很快的时间完成新的版本进行交互。但是怎样才能做到这一点呢????
我们面向对象有3大概念:封装、继承、多态。封装继承大家应该耳熟能详,但是多态可能感觉有点陌生。在这里我们就会来介绍下怎么通过多态的方式来实现系统的扩展。
多态的代码表示:
Father f=new Son1();
Father f1=new Son2();
你在使用的时候你会发现,f,f1这两个对象,具有相同的方法和属性(这是废话)。但是我们从上面能获得什么呢。如果我是在运行时指定是哪个儿子不就实现了扩展了吗?,比如儿子3又出现了,但是我在运行时指定后面实例化Son3,那不就是代表Son3的操作了莫。当然这里所有的孩子都要继承父类(这一点大家应该都很清楚吧)。
好,下面我来做个简单的例子。
有如下需求:要求亚洲程序猿开发一个后台代码,实现数据的保存。保存形式很多种,现在就先开发保存到文件中,使用json保存。前台和后台商量好了,我们建立一套枚举值,这套枚举值就代表我们保存的方式,这个前台是需要指定的。
enum SaveDataDefine{SaveByFile}
经过分析,我们发现,保存是一个经常变化的点,如果这里不做到很容易扩展的话,后面系统修改就很大,维护量也会不小。话不多说,直接代码(好的代码即设计):
public interface ISaveData
{
SaveDataDefine Define{get};
void Save(string data);
}
public class SaveTofile:ISaveData
{
public SaveDataDefine Define{return SaveDataDefine.SaveByFile};
void Save(string data){
//实现文件保存 具体代码略
}
}
public void InvokeProxy
{
//传入枚举值,执行调用 此处用反射 进行枚举的比较 找到具体实现的对象 此处略。这个类供前台调用
}
好,现在客户发神经似的需要说,我们要把数据保存到数据库。由于此处的设计很有扩展性,所以修改是分分钟的事情,我们走起:
在枚举类中添加一个枚举值 SaveByDataBase
添加一个类:
public class SaveToDataBase:ISaveData
{
public SaveDataDefine Define{return SaveDataDefine.SaveByDataBase};
void Save(string data){
//实现文件保存 具体代码略
}
}
所有的东西都不需要修改了,是不是很具有扩展性。当然我们在开发系统的时候会遇到各种各样的问题,我这里也只是冰山一角。我们需要不停的总结和学习才能使我们的系统更具有优势,后期的维护和扩展更简单。
亚洲程序猿 2013/12/13 qq:657224709