自然思考:流程任意定制的一个问题

    目前有20种不同的操作流程,现在随意提出一种或多种形成一个组合流程,每个组合流程将会都有可能发生改变,而组合流程将会组合成更多的流程,目前已知所有的流程均是同步的,是否有通用的编程方法实现任意流程的组合?

    采用简单的面向对象方法来解决,那么,针对20个流程需要创建20个不同的对象,并赋予它们20种差异来表示它们的不同,实际上,这只是一个简单的加法,创建20个对象后,随机从中抽取任意数量的对象,实际上只关心该对象之间最后的运算结果作为一组对象构成的一个概念实体.
     针对这样的情况,我们可以先定义一个类B,然后创建它的20个对象B1,B2,B3~B20,对此20个对象都建立一个属性进行区别,最简单的办法就是对象名称,故此:
     public class B
     {
         public string Name;
     }
     public class BList
     {
         private List listB = new List(20);
         public BList()
         {
             for (int i=0;i<20;i++)
             {
                 B objB = new B();
                 objB.Name = "B"+i.ToString();
                 listB.Add(objB);
             }
         }
     }

     据此,我们就创建了20个对象,然后其中任意的对象会构成任意的组合,这个怎么办呢?我们可以采用一个BGroup来实现这个功能
     public class BGroup{
         private List listB = new List();
         public void Add(B obj){
         listB.Add(obj)
         }
    }
    问题来了,对于任意组我们只关心它与其它组的接口运算,也就是关键结点,于是,我们就必须要创建一个接口
    public Interface IComput
    {
        void Compute();
    }
    计算的结果不能是void,否则就没有意义了,有时候,一些流程的结果相当于某一个单独流程的结果,对于可以得到这样的结果时,我们就可以采用流程优化,但这样的情况,我们应该如何处理?直接使用B这个类为结果,就难以处理定义B之外的结果,所以针对此结果,我们必要要一个特殊的实现.此时需要用到继承:
    public BResult{
       public BResult ConvertBToResult(B objB){
          //问题是B与BResult之间的转换关系是什么样的?
       }
    }
   
    我们必须要采取一个能够有标记它的结果的能力的东西来确定它是可优化的,或是在某种参数的情况下是可以优化的,所以,此时需要定义B也是可以计算的, 这就产生了一个问题,即B与BGroup必须都具有Result作为可以判断是否一样的决定,故而,我们可以得到:
    public class B:ICompute {
        public string Name;
        BGroupResult Compute(){//返回什么呢};
    }

    然后,我们必须对BGroup实现它.
    public class BGroup:ICompute{
         private List listB = new List();
         public void Add(B obj){
         listB.Add(obj)
         }
         BGroupResult Compute(){
         }
    }

    整理一下,得到如下的代码:
    public Interface IComput    {
        BResult Compute();
    }
    public class B:ICompute {
        public string Name;
        BResult Compute(){//怎么运算呢?};
    }
    public class BGroup:ICompute{
         private List listB = new List();
         public void Add(B obj){
             listB.Add(obj)
         }
         BResult Compute(){//怎么运算呢?}
    }
    为了它们能够有一致性,决定采取唯一标识,即产生类BResult如下:
    public class BResult {
       public string ID;
       public B objB;
       public object Value;
    }
    再用一个管理类
    public class BResultManagerObject{
          public bool IsExist(BResult objResult,out B objB);
          public bool AddBResult(){
          }
    }

    就此,服务层已经写好,我们可以采用如下的形式确定:
    if (objBResultManageObject.IsExist(BGroup,out objB){
    }

    对于优化集合列表,必须再实现:
    public class OptResultList{
         public bool AddEqual(string id1,string id2){};
    }

    也就是说,这里我们发现,必须给B与BGroup一样视角来处理,故而这里可以定义一个接口专门处理它的ID,这个就是接口合并了.
    public Interface IOpt
    {
       string ID;
    }
    public class BResult:ICompute,IOpt {
       public string ID;
       public B objB;
       public object Value;
    }
    public class BGroup:ICompute,IOpt{
         private List listB = new List();
         public void Add(B obj){
             listB.Add(obj)
         }
         BResult Compute(){//怎么运算呢?}
    }

    这样,就可以实现为:
    public class OptResultList{
         public bool AddEqual(IOpt obj1,IOpt obj2){//对对象进行分析判断};
    }

    于是就大大地扩展了功能,最后的代码,几乎是完全在抽象层次上不依赖于任何非可定义对象的,达到直接概念上的抽象.
    这只是一个大致的做法,具体在实践中还有许多细节,这里只是提出一个简单的思路,说明,任何业务定义不应该依赖于具体的值类型或是系统其它定义,因为它们是不可扩展的,而全部应该采用自定义类型,系统提供的框架往往就会在框架这个层次上产生的巨大限制,自定义对象一种最佳的扩展方式,同时为了系统的扩展特性考虑,尽量也要避免使用继承的对象,而更应该考虑从组合的方式来进行.代码的复用,最好是当任何一种利用模式是一种"片断式"地利用,而不应该完全接纳,否则就很容易跌入危险的深渊.
    与此同带来的后果就是代码过多,需要耗费很多时间去写自定义的包装对象,这也是一个比较麻烦的事情.这样的事情,不是能够通过框架完全解决,需要配合开发工具进行一定的自定义对象的代码生成.

转载请注明出处http://william_fire.cnblogs.com

posted @ 2007-12-15 00:40  一根神棍研古今  阅读(384)  评论(0编辑  收藏  举报
Web Counter