当前位置:编程学习 > C#/ASP.NET >>

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();
}

--------------------编程问答-------------------- 类构造时就初始化变量,这要看情况,某些是可以等到用时再初始化的 --------------------编程问答--------------------
引用 1 楼 bdmh 的回复:
类构造时就初始化变量,这要看情况,某些是可以等到用时再初始化的

设计方法不是唯一的,我构造时就初始化的类,一般都是全局唯一类 --------------------编程问答-------------------- 推荐的标准是什么?这种无关系统的细节规范根本就谈不上系统设计...这类东西微软称之为类库设计准则... --------------------编程问答--------------------
引用 3 楼 vrhero 的回复:
推荐的标准是什么?这种无关系统的细节规范根本就谈不上系统设计...这类东西微软称之为类库设计准则...

我是边写边逐步补充经验总结的,没想到推荐了,没想到马上被拍砖了。继续写经验,写完再发。
我觉得对我这样从模仿到自己构造的人,还是有用的 --------------------编程问答-------------------- 学习.. --------------------编程问答-------------------- 很有见地.

学习了.

--------------------编程问答-------------------- ???

这是语法准则和设计无关。 --------------------编程问答-------------------- 什么叫系统设计呢……
你说的这几条只能说对于你的项目这么用,一般这么用之类的,
实际从微软的类库规范到开源项目中已经展现了不少的这种“系统设计”。 --------------------编程问答-------------------- 类的种类
全局考虑,类分四种,
一是供应商提供有操作行为的类,由外部引用的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;

}
--------------------编程问答--------------------
引用 8 楼 nanqi0506 的回复:
什么叫系统设计呢……
你说的这几条只能说对于你的项目这么用,一般这么用之类的,
实际从微软的类库规范到开源项目中已经展现了不少的这种“系统设计”。

"私有表示只在同一命名空间下才可访问。
类要全局唯一时,直接加到public static class Global 全局类里成一个静态公开字段,所有的类都可以这样声明为全局对象"
----------------------------------------------
我认为这个经验是设计来的,全是自己做项目时摸索出来的方法,没去研究过MSDN和微软标准,让各位见笑了。 --------------------编程问答-------------------- 因为刚开始设计时,并不知道哪些类是全局,要设成静态,而且即使是静态的,后面调用时也没有
Global.Ic这样直观。
所以类设计全部默认为私有,不用静态属性。静态类仅仅使用在全局类Global和工具类里。
--------------------编程问答-------------------- 突然懂了好多 --------------------编程问答-------------------- 系统设计这个标题有点大, --------------------编程问答-------------------- 然后呢?没然后了~~~  修炼修炼 --------------------编程问答-------------------- 等你总结完回头再来读 --------------------编程问答--------------------
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,