在上一篇中:https://www.cnblogs.com/kevin-Y/p/17792071.html
我们将程序组成为三个主要对象:字段、查询范围、行为控制器。
字段、查询范围都是数据,都分别对应一个类,有各自属性,并能保存和读取
行为控制器则是一个接口,有N种实现类,每一种类型的字段就有一种实现类
public interface IFieldController { /// <summary> /// 处理的字段类型 /// </summary> string HandleType { get; } /// <summary> /// 获取查询范围编辑器 /// </summary> /// <param name="field"></param> /// <param name="condition"></param> /// <returns></returns> Control BuildFieldEditor(FieldItem field, string condition); /// <summary> /// 读取查询范围 /// </summary> /// <param name="ctrol"></param> /// <returns></returns> ConditionItem ReadCondition(Control ctrol); /// <summary> /// 生成where条件 /// </summary> /// <param name="build"></param> /// <param name="field"></param> /// <param name="condition"></param> void BuildWhere(SqlBuilder build, FieldItem field, string condition); }
在我们划分好主要对象后,上面方法及其基本上可以确定下来。为什么这么说呢?如果我不能确定该如何做呢?我以这个例子说明我们以何为依据。
1。主程序不需要清楚有多少种类型的字段,只需要工厂方法告诉其控制类是谁
2。所有与类型有关的东西,主程序也不会理会,所以接口出入参只会是主程序知道的某一些基类或接口。
如BuildFieldEditor方法的入参condition,使用了基本的字符串作为所有查询范围的描述载体。显示的界面需要自己解释这个文本再给界面各个控件赋值。
为什么使用string,而不使用object呢?主要是确保能让主程序保存到本地文件中。
3。方法入参不会一下子就能明确下来的。可能需要完成第一个、二个控制器才能基本确定。
如BuildWhere方法的入参SqlBuilder build,一开始我想使用一个StringBuilder就行了。但做完第一个Int类型的控制器、准备做第二个String类型时,
发现几乎所有代码都一样。于是将这些代码组织了一个工具类SqlBuilder。大家可以将入参调整为StringBuilder试试。
4。类似功能、或相关功能应放在一个类中。如读、写应该在一个类;序列化和反序列化也应该在一个类。
5。在上线前要勇于调整方案,力求代码精减、职责清晰(重点:如果不知道对面对象的单一职责原则,请搜索学习一下)
本文只发布在博客园,未经同意请勿转载!
标签:主程序,SqlBuilder,入门,C#,控制器,查询,参数,condition,string From: https://www.cnblogs.com/kevin-Y/p/17792258.html