假期没事 学了下asd
发现原来自己的有些设计不符合ocp原则
原来代码大致如下:
public enum OperationSymbol
{
Equality,
Like
}//用于构建sqlstatement的where部分 :)
public string GeranateCondition(string columnName,OperationSymbol sybol,string value)
{
if(sybol == OperationSymbol.Equality)
{
return columnName + "='" value + "'";
}
else
{
return columnName + " like '%" + value + "%'";
}
}当我想在OperationSymbol里增加一个In时,就违反了ocp原则
不知道改怎么设计才能满足ocp原则,使当在OperationSymbol里增加一个新的值的时候不用修改GeranateCondition方法.
请教了~~~~

解决方案 »

  1.   

    in this case, is enum a good choice? something like (didn't test, so there could be syntax errors)abstract class Operation
    {
      public abstract string Format(string strValue); 
    }class Equal : Operation
    {
      public override string Format(string strValue)
      {
           return String.Format("='{0}'", strValue);
      }
    }
    class Like : Operation
    {
      public override string Format(string strValue)
      {
           return String.Format(" LIKE '%{0}%'", strValue);
      }
    }
    public string GeranateCondition(string columnName,Operation sybol,string value)
    {
     columnName + sybol.Format(value);
    }
    ??
      

  2.   

    To saucer(思归):
    不错啊
    本来我也想用个abstract
    不过当时子类就不知道该怎么实现了 原来String.Format()传入的sybol是Operation类型的
    sybol.Format()不就是Operation.Format()了?
    但是我所想要的是如Equal.Format()是否定义个IOperation.Format()就可以解决? 1 bug found
     columnName + sybol.Format(value); 应该为 return  columnName + sybol.Format(value);
      

  3.   

    >>>sybol.Format()不就是Operation.Format()了?
    >>>但是我所想要的是如Equal.Format()suggest you read a decent OOP book, you will know that is not true, note the override keyword string s= GeranateCondition("LastName",new Equal(),"Smith");>>>是否定义个IOperation.Format()就可以解决?you could define an interface, but the idea is same
      

  4.   


    看错了,面向对象功力还不够.目前项目中 嘿嘿 算是没用到`~ 只是相等于用class打包而已
    我接触现在的项目之后的第一个继承是我加的 一个ValidPage用于所有要求登陆的WebForm.
    新手继续学习中~ 正好放假~~我之所以想选择enum 
    是因为Equality,Like,In等这些值可以纳入到一个enum类型中,这样IDE就可以自动列出成员
    Equality,Like,In等继承自Operation之后不能放到一个enum OperationType了吧
    看来要用个命名空间来组织这些Operation类了谢谢~~~
      

  5.   

    abstract class Operation --> public abstract class Operationanother bug had found.