假期没事 学了下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方法.
请教了~~~~
发现原来自己的有些设计不符合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方法.
请教了~~~~
{
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);
}
??
不错啊
本来我也想用个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);
>>>但是我所想要的是如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
看错了,面向对象功力还不够.目前项目中 嘿嘿 算是没用到`~ 只是相等于用class打包而已
我接触现在的项目之后的第一个继承是我加的 一个ValidPage用于所有要求登陆的WebForm.
新手继续学习中~ 正好放假~~我之所以想选择enum
是因为Equality,Like,In等这些值可以纳入到一个enum类型中,这样IDE就可以自动列出成员
Equality,Like,In等继承自Operation之后不能放到一个enum OperationType了吧
看来要用个命名空间来组织这些Operation类了谢谢~~~