#region 数据和变量的定义
private int i_count; //模块中的数据长度
private int [] iChannelA; //通道A中的数据数组
private int [] iChannelB; //通道B中的数据数组
private int [] iChannelC; //通道C中的数据数组
private int [] iChannelD; //通道D中的数据数组
private DateTime dt_insertTime; //插入数据时间
#endregion #region 初始化类
/// <summary>
/// 连接硬件初始化数据
/// </summary>
public FlowData()
{
i_count=UseDsadDll.DsadSetBlockMode(1);
this.dt_insertTime=DateTime.Now;
iChannelA=new int[this.i_count];
iChannelB=new int[this.i_count];
iChannelC=new int[this.i_count];
iChannelD=new int[this.i_count];
for(int i=0;i<this.i_count;i++)
{
iChannelA[i]=UseDsadDll.DsadInputA();
iChannelB[i]=UseDsadDll.DsadInputB();
iChannelC[i]=UseDsadDll.DsadInputC();
iChannelD[i]=UseDsadDll.DsadInputCount();
}
UseDsadDll.DsadSetBlockMode(0);
}
/// <summary>
/// 复制初始化数据
/// </summary>
/// <param name="copyFrom"></param>
public FlowData(FlowData copyFrom)
{
this.i_count=copyFrom.Count;
this.iChannelA=copyFrom.ChannelA;
this.iChannelB=copyFrom.ChannelB;
this.iChannelC=copyFrom.ChannelC;
this.iChannelD=copyFrom.ChannelD;
this.dt_insertTime=copyFrom.InsertTime;
} /// <summary>
/// 自定义数据
/// </summary>
/// <param name="length">存储各通道长度</param>
/// <param name="channelA">通道A数组</param>
/// <param name="channelB">通道B数组</param>
/// <param name="channelC">通道C数组</param>
/// <param name="channelD">通道D数组</param>
/// <param name="dt">时间</param>
public FlowData(int length,int[] channelA,int[] channelB,int [] channelC,int [] channelD,DateTime dt)
{
this.i_count=length;
this.dt_insertTime=dt; this.iChannelA=new int[length];
this.iChannelB=new int[length];
this.iChannelC=new int[length];
this.iChannelD=new int[length]; this.iChannelA=channelA;
this.iChannelB=channelB;
this.iChannelC=channelC;
this.iChannelD=channelD;
}
#endregion /// <summary>
/// 获取模块中的数据长度
/// </summary>
public int Count
{
get
{
return this.i_count;
}
}
/// <summary>
/// 获取通道A中的数据
/// </summary>
public int[] ChannelA
{
get
{
return this.iChannelA;
}
}
/// <summary>
/// 获取通道B中的数据
/// </summary>
public int[] ChannelB
{
get
{
return this.iChannelB;
}
}

/// <summary>
/// 获取通道C中的数据
/// </summary>
public int [] ChannelC
{
get
{
return this.iChannelC;
}
}

/// <summary>
/// 获取通道D中的数据
/// </summary>
public int[] ChannelD
{
get
{
return this.iChannelD;
}
} /// <summary>
/// 获取读取模块的时间
/// </summary>
public DateTime InsertTime
{
get
{
return this.dt_insertTime;
}
}
}
注:连接硬件的构造函数,是连接某个硬件填充数据

解决方案 »

  1.   

    something you might want to do:
            public FlowData(int length,int[] channelA,int[] channelB,int [] channelC,int [] channelD,DateTime dt)
            {
                //
                // parameter checking goes here
                //
                if( channelA == null || channelA.Length != length ) throw new ArgumentException("......");
                
                            this.i_count=length;
                this.dt_insertTime=dt;            this.iChannelA=new int[length];           // useless, delete these lines
                this.iChannelB=new int[length];           // .
                this.iChannelC=new int[length];           // .
                this.iChannelD=new int[length];           // .            this.iChannelA=channelA;
                this.iChannelB=channelB;
                this.iChannelC=channelC;
                this.iChannelD=channelD;
            }
      

  2.   

    看上去没有什么不妥,只是下面这段:
    public FlowData(int length,int[] channelA,int[] channelB,int [] channelC,int [] channelD,DateTime dt)
            {
                this.i_count=length;
                this.dt_insertTime=dt;            this.iChannelA=new int[length];
                this.iChannelB=new int[length];
                this.iChannelC=new int[length];
                this.iChannelD=new int[length];            this.iChannelA=channelA;
                this.iChannelB=channelB;
                this.iChannelC=channelC;
                this.iChannelD=channelD;
            }其中            this.iChannelA=new int[length];
                this.iChannelB=new int[length];
                this.iChannelC=new int[length];
                this.iChannelD=new int[length];
    是没必要的,删去这四句,直接用随后四句的赋值就可以了。
      

  3.   

    没看出你这个类哪里“万能”来了...功能单一不是输入单一...你可以看看.NET Framework里...多输入多构造函数大把...
      

  4.   

    感觉上没并没有违反啥原则不过如果我设计,我不会这么写
    我更愿意像下面这么做public class A
    {
       ilist<B> res;
       pulic void ilist<B> getDate()
         {
           return res; 
         }
        
    }public class B
    {
    }
      

  5.   

    你头头意思可能是违反了“高内聚,低耦合”的设计规范。你头头说你造了个万能的主,这样到时候测试的时候不方便,而且如果功能太复杂到时候维护的成本也高。最好一个功能一个类,比如读数据库就一个类,然后类中在细分为读数据类,写数据之类的(视具体情况而定)。你可以去看看<<Effective C#>>
      

  6.   

    用Microsoft FxCop和Mono Gendarme检查一下你的dll就可以报告哪些设计有问题了。另外使用NDepend也可以得到一些问题报告。
      

  7.   

    大家提及到,你复制数据那段代码,我也给个建议:
    现在你复制后的数据,如果源对象改变,那么你这个新对象同时也会改变。
    看看下面代码执行后会怎样:FlowData a = new FlowData();
    a.ChannelA[0] = 99;// b 复制 a 的数据
    FlowData b = new FlowData(a);// 设置 a 的数据看看
    a.ChannelA[0] = 88;// 断言 a.ChannelA[0] 和 b.ChannelA[0]是相等的
    Debug.Assert(a.ChannelA[0] == b.ChannelA[0]);// 如果要做到A 和 B 复制后的数据分离,你需要这样子
    this.iChannelA = new int[length];
    this.iChannelB = new int[length];
    this.iChannelC = new int[length];
    this.iChannelD = new int[length];channelA.CopyTo(this.iChannelA, 0);
    channelB.CopyTo(this.iChannelB, 0);
    channelC.CopyTo(this.iChannelC, 0);
    channelD.CopyTo(this.iChannelD, 0);
      

  8.   

    个人感觉,里面的数组,还是改成 List 或 ArrayList 比较好些