C# 构建一个系统,求助,40分,分不多,我来空手套白狼

SamBaal 2014-12-18 03:13:32

如何解决,求感兴趣的朋友帮帮忙
...全文
718 49 打赏 收藏 转发到动态 举报
写回复
用AI写文章
49 条回复
切换为时间正序
请发表友善的回复…
发表回复
於黾 2014-12-26
  • 打赏
  • 举报
回复
所以你现在还是在纠结如何把所有功能都做到一个大工程里,而没想过做成不同的程序或各种dll 如果你的思路不能转变的话,简单的问题也会变得很复杂
SamBaal 2014-12-26
  • 打赏
  • 举报
回复
引用 45 楼 Z65443344 的回复:
DataTable只是个例子.你也可以组织成xml序列化传递给客户端 客户端和服务端通信,可以放在一台机器上,也可以分别放到2台机器上,甚至多个客户端对应一个服务端(通信程序) 或者如果你是把它当dll用,也可以直接调用dll,返回一个DataTable或xml或byte数组之类的
你只是说传递如何如何,服务端如何,客户端如何,我上面说过了,不知道你看没看,我需要的是一个优化程序的组织,UI层调用同一个类或接口的方法就会根据配置参数通知这个实现调用不同处理,比如我在UI层传参“OPC”,那么就会做OPC处理,比如我在UI层传参“IO”那么就会做IO处理。这种做是可以实现的,我已经做过了,但是再往下划分的话,我就有疑问了,比如我将OPc处理的类再细划分成公共类或接口和实现类二部分,将对OPC的读写方法封装成公共的,实现部分的m1,m2,m3的实现就会依赖 这个公共部分;IO处理的也是如此,RS485的也是,也就是说同样都实现m1,m2,m3那能不能将m1,m2,m3统一成一个接口?统一成接口后调用方便了,疑问也出现 了,m1,m2,m3实现这个接口依赖如何处理?如何统一?
於黾 2014-12-26
  • 打赏
  • 举报
回复
DataTable只是个例子.你也可以组织成xml序列化传递给客户端 客户端和服务端通信,可以放在一台机器上,也可以分别放到2台机器上,甚至多个客户端对应一个服务端(通信程序) 或者如果你是把它当dll用,也可以直接调用dll,返回一个DataTable或xml或byte数组之类的
SamBaal 2014-12-26
  • 打赏
  • 举报
回复
引用 40 楼 xuanbg 的回复:
你这个不同客户的不同需求根本就是不同的业务好吧。现在软件还没有发展到可以把不同需求放在一个万能的类里面实现的方法。
我不需要万能的类,我只是想将改动的部分,你所谓的不同业务,提出来,将不改动的封装起来,除改动的部分以外其它的都不需要做代码修改,这样的话就想到了接口和基类,我上面描述了,请各位耐心看下上面的描述问题
於黾 2014-12-26
  • 打赏
  • 举报
回复
举个简单的例子: 假如我用DataTable传输数据,不管是哪种通信模块,只要发来请求要数据,就返回一个DataTable,所有的通信模块都遵循这一个结构,也就是不管是OPC还是串口还是TCP还是http,读到数据之后组织成DataTable发给客户端(当然发送前需要序列化) 客户端得到数据之后反序列化成DataTable,然后根据每个客户端想要显示的内容不同,将DataTable组织成不同的形式,比如只显示4个,那么可能有些数据没用,就丢弃了,显示图表,就用数据填充进chart里 想做的更好,你协议也要做的更复杂点,比如只请求4个数据,你就不要把获得的全部数据都填充进DataTable里再返回 或者DataTable改成实体类,或者自定义byte数组结构,多少到多少代表什么,客户端解析一下
SamBaal 2014-12-26
  • 打赏
  • 举报
回复
引用 38 楼 Z65443344 的回复:
你显示的软件应该作为客户端,它可能有N种展现形式 而你的通信软件应该作为服务端,它可能有M种通信方式 你只需要根据不同的通信方式使用对应的服务端程序,然后让客户端和它通信,就行了 而不是自己组合M*N种方法出来
我不是做你说的通讯的,我做的是单机程序,和设备通讯,和不同的设备通讯所需要的API或Dll或自己写的属性方法类就不同。这个程序根据配置不同设备调用不同的处理用api或Dll或自己写的属性方法类。
引用 22 楼 songyan_jun 的回复:
不知道你看前面的没有。我是想优化一个程序。 我现在再细描述一下: 我有个程序有三种配置(板卡IO,OPC,RS485),不管是那种配置都实现三个功能(读,写,查)。 最后我配置OPC方案,那么读写查三个功能就会用到OPC相关属性方法。我配置RS485方案,那么读写查三个功能就会用到串口处理的相关属性方法。。。。。 也就是说不管我配置那一 种都会影响到那三个功能,这是其一。其二就是有的客户要求在winform界面上输出四个数据,有的需要10个数据。。不同的客户不同的输出。 所以倒致我这三个功能频繁修改,我想优化。。。。
求助,麻烦各位大侠耐心看下我在前面描述的问题
SamBaal 2014-12-26
  • 打赏
  • 举报
回复
引用 37 楼 Z65443344 的回复:
我的意思并不是让你放弃现在的程序改用组态 我是说,你应该多借鉴成熟产品的做法 如果你将不同的通信方式直接封装成不同的dll或者干脆就是不同的软件,只要它们实现的接口一样,这样不就行了 这样即使将来再有第4种,第5种,乃至第100种方式,也不过是再另外开发符合同样接口的dll或项目就可以了,而本身的主体完全不用改动
你说的很对,我就是要封装,按你说的“只要它们实现的接口一样,这样不就行了”请问我的这种情况接口怎么提?提出来接口后的实现组织如何?麻烦你给个图或例子
SamBaal 2014-12-26
  • 打赏
  • 举报
回复
引用 48 楼 xuanbg 的回复:
楼主啊,虽然你的3种板卡都是“读”、“写”、“查”3种操作,可这3种板卡的读都完全不一样啊,这个不能抽象为一个“读”方法阿!强制合并3种不同的读不但不能优化,反而添乱呀。其实,我觉得你把3种板卡分别封装1个类比较好。在此基础上,把真正重复的代码抽象到一个公共类里面就可以了。
好吧,不想这令人头疼的事了,结
software_artisan 2014-12-26
  • 打赏
  • 举报
回复
楼主啊,虽然你的3种板卡都是“读”、“写”、“查”3种操作,可这3种板卡的读都完全不一样啊,这个不能抽象为一个“读”方法阿!强制合并3种不同的读不但不能优化,反而添乱呀。其实,我觉得你把3种板卡分别封装1个类比较好。在此基础上,把真正重复的代码抽象到一个公共类里面就可以了。
rtdb 2014-12-23
  • 打赏
  • 举报
回复
引用 22 楼 songyan_jun 的回复:
[quote=引用 20 楼 Z65443344 的回复:] 看了半天,有些混乱
不知道你看前面的没有。我是想优化一个程序。 我现在再细描述一下: 我有个程序有三种配置(板卡IO,OPC,RS485),不管是那种配置都实现三个功能(读,写,查)。 最后我配置OPC方案,那么读写查三个功能就会用到OPC相关属性方法。我配置RS485方案,那么读写查三个功能就会用到串口处理的相关属性方法。。。。。 也就是说不管我配置那一 种都会影响到那三个功能,这是其一。其二就是有的客户要求在winform界面上输出四个数据,有的需要10个数据。。不同的客户不同的输出。 所以倒致我这三个功能频繁修改,我想优化。。。。[/quote] 你这个最好用实时数据库的架构。 前台只和实时数据库打交道,后台配不同的IO驱动接不同的设备, 实时数据库的数据是可配置的,连接到不同的设备中,动态数据自动刷新。
ajaxfeifei 2014-12-23
  • 打赏
  • 举报
回复
最后我要说的是反射并没有你想象的那么慢,.net的系统本身就使用了大量的反射。
ajaxfeifei 2014-12-23
  • 打赏
  • 举报
回复
如果每个客户可以配置的话,你就去实现委托,在系统加载之初根据客户的配置,利用反射将委托事件关联,然后后面执行就不存在每次都反射的情况,只要你的实体保存下来就行了。

public delegate void DoSomeThing();
public event DoSomeThing BeforeM1;
ajaxfeifei 2014-12-23
  • 打赏
  • 举报
回复
1.首先确定你业务里面哪些是不变的,放在m1,2,3里面。会变的,在继承的类里面去重写,我感觉你这业务并不复杂,只是你没有把哪些是要变的业务理清楚,这步最重要,提炼业务。

        public abstract class IPage
        {
            public void LoadPage()
            {
                BeforM1();
                m1();
                AfterM1();
                //.....
                m2();
                //......
                m3();
            }
            public virtual void BeforM1(){}   
            public abstract void m1();
            public virtual void AfterM1() { }
            public virtual void BeforM2() { }
            public abstract void m2();
            public virtual void AfterM2() { }
            public virtual void BeforM3() { }
            public abstract void m3();
            public virtual void AfterM3() { }
        }

        public class BaseGridPage : IPage
        {
            public override void m1(){}
            public override void m2(){}
            public override void m3(){}
        }

        public class BaseFieldPage : IPage
        {
            public override void m1(){}
            public override void m2(){}
            public override void m3(){}
        }

        public class BaseChartPage : IPage
        {
            public override void m1() { }
            public override void m2() { }
            public override void m3() { }
        }
        /*这个是一种模式了。
        public class UIPage<T> where T : IPage, new()
        {
            public T _page;

            public UIPage()
            {
                _page = new T();
            }
        }

        public class form1 : UIPage<BaseGridPage>
        {
            public void Load()
            {
                _page.LoadPage();
                //print custom data 4+?
            }
            
        }
        */
        public class CustomClass:BaseGridPage
        {
            public override void BeforM1()
            {
                base.BeforM1();
                //Do Curstom Special Operation
            }
        }
SamBaal 2014-12-23
  • 打赏
  • 举报
回复
引用 24 楼 assky124 的回复:
这个功能反射加工厂模式实现不了?
我感觉不管用什么模式都能实现,高手10行代码能实现的,笨人或许100行,1000行,别管怎么样应该都能实现。 你看我描述的就能知道,和设备通讯有关系,一般通讯一来回都是毫秒级的,没有多高级的东西(速度越快越好)。用了反射是很灵活,但是会不会要牺牲一些通讯速度?我只是想做读写查频繁修改的分离出来,不想每次修改都找来找去,有时候改错一个地方找半天
mofijeck 2014-12-23
  • 打赏
  • 举报
回复
引用 24 楼 assky124 的回复:
[quote=引用 22 楼 songyan_jun 的回复:] [quote=引用 20 楼 Z65443344 的回复:] 看了半天,有些混乱
不知道你看前面的没有。我是想优化一个程序。 我现在再细描述一下: 我有个程序有三种配置(板卡IO,OPC,RS485),不管是那种配置都实现三个功能(读,写,查)。 最后我配置OPC方案,那么读写查三个功能就会用到OPC相关属性方法。我配置RS485方案,那么读写查三个功能就会用到串口处理的相关属性方法。。。。。 也就是说不管我配置那一 种都会影响到那三个功能,这是其一。其二就是有的客户要求在winform界面上输出四个数据,有的需要10个数据。。不同的客户不同的输出。 所以倒致我这三个功能频繁修改,我想优化。。。。[/quote] 这个功能反射加工厂模式实现不了?[/quote] 虽然有点乱,我觉得可以实现
assky124 2014-12-23
  • 打赏
  • 举报
回复
引用 22 楼 songyan_jun 的回复:
[quote=引用 20 楼 Z65443344 的回复:] 看了半天,有些混乱
不知道你看前面的没有。我是想优化一个程序。 我现在再细描述一下: 我有个程序有三种配置(板卡IO,OPC,RS485),不管是那种配置都实现三个功能(读,写,查)。 最后我配置OPC方案,那么读写查三个功能就会用到OPC相关属性方法。我配置RS485方案,那么读写查三个功能就会用到串口处理的相关属性方法。。。。。 也就是说不管我配置那一 种都会影响到那三个功能,这是其一。其二就是有的客户要求在winform界面上输出四个数据,有的需要10个数据。。不同的客户不同的输出。 所以倒致我这三个功能频繁修改,我想优化。。。。[/quote] 这个功能反射加工厂模式实现不了?
software_artisan 2014-12-23
  • 打赏
  • 举报
回复
引用 36 楼 songyan_jun 的回复:
还有就是上面github_22161131说的M个方案N个功能有可能是m*n个实现,就算是m*n个实现我也认了,但程序运行时用到的1种方案的n个功能也不是固定的,a客户要输出4个数据,b客户要6个数据,c客户要输出图片,d客户要输出报表。。。千奇百怪的。。所以我最后想了下与其想着将所有可能包括进来实现还不如将变动的部分拿出来,每做个项目根据需求单独改动下,其它的不动的封装起来永久不动。这也就是我上面说的情况了。。。
你这个不同客户的不同需求根本就是不同的业务好吧。现在软件还没有发展到可以把不同需求放在一个万能的类里面实现的方法。
software_artisan 2014-12-23
  • 打赏
  • 举报
回复
定义A类:接口1、接口2、接口3。 定义B类:接口1、接口2、接口3。 定义C类:接口1、接口2、接口3。 调用的时候用反射+委托就可以了。
於黾 2014-12-23
  • 打赏
  • 举报
回复
你显示的软件应该作为客户端,它可能有N种展现形式 而你的通信软件应该作为服务端,它可能有M种通信方式 你只需要根据不同的通信方式使用对应的服务端程序,然后让客户端和它通信,就行了 而不是自己组合M*N种方法出来
於黾 2014-12-23
  • 打赏
  • 举报
回复
我的意思并不是让你放弃现在的程序改用组态 我是说,你应该多借鉴成熟产品的做法 如果你将不同的通信方式直接封装成不同的dll或者干脆就是不同的软件,只要它们实现的接口一样,这样不就行了 这样即使将来再有第4种,第5种,乃至第100种方式,也不过是再另外开发符合同样接口的dll或项目就可以了,而本身的主体完全不用改动
加载更多回复(29)

110,535

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧