C#系统设计经验讨论
以下是我个人的一点心得,欢迎交流经验心得目前内容:
属性和字段的应用
类把自身作为属性
类先设计成默认私有的,后面根据需要才开放
外部调用类,凡是纯值的一律属性,属性在类构造之时便生成
真正复杂全新设计的系统,数据库应用仅仅是它的一个模块。以下我讨论的系统都是指这种系统。
关于纯数据库应用系统的模块这里不讲,这个都有套路,大量自动代码+各种实用模块(如水晶报表设计时统一用手工搭建的dataset,然后用自己查询来的dateset去填充。导入导出EXCEL。调用查询的方法。图标使用等等)。模块和方法库总会积少成多,固定不变得。
纯做数据库应用系统,如OA、CRM、人事考勤之类的只是代码工人,更有价值的系统是软硬结合,程序结合技术的系统。
积累到一定程度才发现设计和算法是主要的,每次开发新系统都有全新的感悟。这种系统需要对物理设备进行抽象。比如测试显示模块的系统,其中有关IC的类,IC包括很多寄存器(用Model表示):
属性和字段的应用
只设私有字段和封装属性,不设公开字段
私有字段用于类的内部方法,属性用于对外,举例:
原因:
d和value如果纯属性只读,那么内部也无法设置,属性可写,则外部可修改
但它们仅仅是根据内部方法确定的,比如个数d,就是值的个数,不能外部改。
对于外部访问,风格统一,统统都是访问属性,
使用技巧:开始的时候一律私有字段,然后封装成属性,字段注释写在第一行,为了收缩代码,也能看到注释。class Model
/// <summary>寄存器值的个数,
///外部只读,内部可设
/// </summary>
private int d;
public int D
{
get { return d; }
}
private List<RegValue> value;
/// <summary>寄存器可设的值集合
///外部只读,内部可设
/// </summary>
public List<RegValue> Value
{
get { return value; }
}
/// <summary>初始化模块:生成可设字符串组,值的个数,是否翻转排列
///
/// </summary>
public void Init()
{
//这个方法将00XXX000这样的数生成了XX从000到111的组合
value = Utily.xxxx00To1010(Va);
if (Anti == false)
{
value.Reverse();//反向寄存器的值是反向排列的
}
d = value.Count();
}
类可以把自身作为属性
class Model
private Model negativeModel;
/// <summary>该寄存器对应的反向寄存器
///每个正向寄存器都对应一个反向寄存器
/// </summary>
public Model NegativeModel
{
get { return negativeModel; }
set { negativeModel = value; }
}
在IC层面上构造函数就方便了class IC
public Model refer=new Model("Ref");
public Model amp = new Model("Amp");
public IC()
{
refer.NegativeModel = refer_n;
amp.NegativeModel = amp_n;
}
类先设计成默认私有的,后面根据需要才开放
私有表示只在同一命名空间下才可访问。
类要全局唯一时,直接加到public static class Global 全局类里成一个静态公开字段,所有的类都可以这样声明为全局对象
比如测试一个显示模块,
public static class Global
{
public static IC Ic = new IC();//显示模块IC
public static Ca200 ca200 = new Ca200Class();//测亮度用的CA210设备
}
这样系统运行时要全局唯一的IC就直接 Global.Ic;方便以后的维护,无论自己或别人,看代码就马上知道是全局还是局部的对象,因为有个Global标志
新建一个局部的就用IC Ic = new IC();
外部调用类,凡是纯值的一律属性,属性在类构造之时便生成,不必弄个IniT初始化方法,除非有行为产生才使用方法。
例如class IC里,外部要获得正向寄存器列表,无需调用getModelzheng()(这样每次调用还增加系统开销),直接方正成类的属性Modelzheng:
private List<Model> modelzheng;
/// <summary>正向寄存器列表
///
/// </summary>
public List<Model> Modelzheng
{
get { return modelzheng; }
}
private List<Model> getModelzheng()
{
modelzheng = new List<Model>();
modelzheng.Add(refer);
modelzheng.Add(amp);
modelzheng.Add(grad1);
modelzheng.Add(grad2);
modelzheng.Add(v1);
modelzheng.Add(v20);
modelzheng.Add(v43);
modelzheng.Add(v55);
modelzheng.Add(v62);
modelzheng.Add(v8);
return modelzheng;
}
public IC()
{
getModelzheng();
}
--------------------编程问答-------------------- 类构造时就初始化变量,这要看情况,某些是可以等到用时再初始化的 --------------------编程问答--------------------
设计方法不是唯一的,我构造时就初始化的类,一般都是全局唯一类 --------------------编程问答-------------------- 推荐的标准是什么?这种无关系统的细节规范根本就谈不上系统设计...这类东西微软称之为类库设计准则... --------------------编程问答--------------------
我是边写边逐步补充经验总结的,没想到推荐了,没想到马上被拍砖了。继续写经验,写完再发。
我觉得对我这样从模仿到自己构造的人,还是有用的 --------------------编程问答-------------------- 学习.. --------------------编程问答-------------------- 很有见地.
学习了.
--------------------编程问答-------------------- ???
这是语法准则和设计无关。 --------------------编程问答-------------------- 什么叫系统设计呢……
你说的这几条只能说对于你的项目这么用,一般这么用之类的,
实际从微软的类库规范到开源项目中已经展现了不少的这种“系统设计”。 --------------------编程问答-------------------- 类的种类
全局考虑,类分四种,
一是供应商提供有操作行为的类,由外部引用的DLL提供,不用去设计。例如Ca是测量设备。Ca.AutoConnet;//自动连接 Ca.measure();//测量行为
二是积累的外部工具类,专门封装常用方法,与自定义类和对象无关,适用任何项目,如IniFile对ini文件操作,提供给class MyTool的LoadIC_ini使用。
三是自定义了IC、寄存器、GAMMA曲线等等,都是易做图作的类。
四是自定义的工具类MyTool(适用于本项目),对这些自定义对象进行操作的类,全是静态公开属性。
主要是自定义的对象和工具,我的思路是对象就只提供属性,操作尽量由自定义的MyTool类来做,写代码的时候,需要什么行动都从一个地方去找。
public static class class MyTool--------------------编程问答--------------------
{
/// <summary>读入IC
///
/// </summary>
/// <returns></returns>
public static IC LoadIC_ini(string IcName)
{
IC Ic = new IC();
IniFile infile = new IniFile(IcName);// IniFile为文件操作类,放在外部工具类里
Ic.name = infile.ReadIni("IC_Info", "Name", "null");
Ic.Info = infile.ReadIni("IC_Info", "Info", "null");
List<Model> models = Ic.ModelList;
foreach (Model model in models)
{
model.Addr = infile.ReadIni(model.Name, "Addr", "null");
model.Va = infile.ReadIni(model.Name, "Value", "null");
if (infile.ReadIni(model.Name, "Anti", 1)==1)
{
model.Anti = true;
}
else if(infile.ReadIni(model.Name, "Anti", 1)==-1)
{
model.Anti = false;
}
model.Init();
}
return Ic;
}
"私有表示只在同一命名空间下才可访问。
类要全局唯一时,直接加到public static class Global 全局类里成一个静态公开字段,所有的类都可以这样声明为全局对象"
----------------------------------------------
我认为这个经验是设计来的,全是自己做项目时摸索出来的方法,没去研究过MSDN和微软标准,让各位见笑了。 --------------------编程问答-------------------- 因为刚开始设计时,并不知道哪些类是全局,要设成静态,而且即使是静态的,后面调用时也没有
Global.Ic这样直观。
所以类设计全部默认为私有,不用静态属性。静态类仅仅使用在全局类Global和工具类里。
--------------------编程问答-------------------- 突然懂了好多 --------------------编程问答-------------------- 系统设计这个标题有点大, --------------------编程问答-------------------- 然后呢?没然后了~~~ 修炼修炼 --------------------编程问答-------------------- 等你总结完回头再来读 --------------------编程问答--------------------
补充:.NET技术 , C#