现在公司做的是监督系统,使用的客户比较多,但是各个客户给出需求不可能都是一样的。现在公司是这样做的:
      假设石家庄A公司和保定市B公司要用我们的系统,公司都是用一套代码的,然后在代码里面做了逻辑判断,如:
    
      if(秦皇岛){
       //////
       }else if(石家庄){
       ///////
       }       这样的话,一套代码就可以同时适应A公司和B公司了,但是这样,由于客户越来越多,导致代码中出现了很多的if
else 判断,维护起来十分的麻烦的。
个人想到的解决思路:
     1、使用多套代码
         找出各个客户需求中的公共模块,把所有的通用模块(如分页、工作流)抽象出来,假设最后抽象出了五个通用模块,
         如果石家庄用户要用我们的系统,同时提出了个性化需求,则我们可以以五个通用模块为基础,然后加上
         个性化实现,最后组成一套代码。
           
           但是这样的话,如果客户越多,而且需求都不太相同,那么如果有100个客户,则就有100套代码。
           
    2、一套代码
           可以针对石家庄写出对应的实现类,针对秦皇岛也是写出一套实现类,然后用接口管理起来。
            想要实现的效果是这样的:
               在配置文件中输入石家庄,然后系统启动的时候,就会自动的去加载对应的石家庄实现类。
               这样的话就是一套代码了。不过这个估计实现起来有些难度。
             
             
想问的问题
       
         各个客户都要用监督系统,虽然监督系统的大致业务流程差不多,但是不同客户提出的需求还是不一样的。
          那么在这种情况下是使用多套代码呢?还是使用一套代码?如果是多套代码的话,我上面的提的那种方式是否
          可行,有更好的吗?如果是一套呢?又该如何处理好?

            一套代码则维护起来不太容易。而多套代码则如果客户多的话,则会有很多的套代码。           请教一下,大家是如何处理这个问题的呢?
            
          
     

解决方案 »

  1.   

    前端调用业务逻辑方法的时候不要直接调用功能模块,比如说现有三个通用功能模块A、B、C,
    对于石家庄公司设置接口SjzInterface,此接口持有ABC三个模块的引用,
    同样对于秦皇岛的公司设置接口QhdInterface也持有ABC模块的引用,
    所有公司业务逻辑相同的的操作放在ABC模块中。对于某个公司的特定需求可以建立其独有的模块,
    此模块只被某一个接口引用。
    这应该属于多套代码,如果客户很多且大都需要些独有功能时可能会造成功能模块繁多,这是一个缺点。
      

  2.   

    觉得还是使用1号方案 比较好,可以给不同版本的代码设置版本号V_sjz_1.*** (石家庄1.****版本)。2号太难维护了,而且以后会越来越麻烦。
      

  3.   

    你可以用final变量来控制嘛:
    // 代表秦皇岛
    public static final int CITY_QHD = 1;
    // 代表石家庄
    public static final int CITY_SJZ = 2;然后这样:
    switch(arg){
    case XXXX.CITY_QHD:
    ...
    break;
    case XXXX.CITY_SJZ:
    ...
    break;
    }