有没有关于如何避免在GUI类中加入逻辑的建议?我试图使用良好的类设计尽可能地保持分离,但我的表单类通常会包含比我想象中更多的非UI内容,这往往会使维护变得非常痛苦。
(Visual Studio 2008 Professional,C#,Windows应用程序)。
非常感谢。
有没有关于如何避免在GUI类中加入逻辑的建议?我试图使用良好的类设计尽可能地保持分离,但我的表单类通常会包含比我想象中更多的非UI内容,这往往会使维护变得非常痛苦。
(Visual Studio 2008 Professional,C#,Windows应用程序)。
非常感谢。
将您的逻辑放入单独的程序集中;并且在构建该程序集时不引用任何GUI包(例如System.Drawing
,System.Windows.Forms
等)。
这其实只是一个练习和自律的问题。我是说,我们都做过这样的事情。而且在错误的条件下(经理/客户大喊让我们“立刻”完成某事,而不是“正确”的时间),我们都会不时地继续这样做。
在编写驱动UI的代码时(更多是针对web方面,但同样适用),我会问自己每个代码单元(一行代码、一个条件、一个循环等)是否依赖于UI的存在。如果我要写入文本框,那么就是依赖于UI的,所以代码就放在那里。但如果我正在计算将放入该文本框的结果,那么这可能是业务逻辑。
另一种方法(正如ChrisW在我打字时所提到的)是先在非UI类库中开发逻辑。在其中尽可能多地放置不依赖于基于UI的库的逻辑(根据您定义“逻辑”的标准判断即可),然后构建UI以利用该逻辑。有不同的方法可以同时开发这两个部分,例如通过接口类来处理逻辑程序集并仅将UI部分编码到这些接口中(然后使用依赖注入将程序集类插入接口中)等。
然后,在您的UI项目中,您引用可重用的层并处理仅与UI相关的内容。UI项目仅与BLL通信,而不直接连接到DAL:
UI <---> BLL <---> DAL
您可以拥有多个UI层来使用您的可重用组件,以及多个可互换的DAL,如果您想支持多个数据库类型。
您需要了解设计模式,例如:
模型-视图-控制器(MVC),通常用于网站(ASP.NET)
模型-视图-视图模型(MVVM),通常用于WPF
通过遵循其中一种模式,您应该能够将应用程序的各个部分保持分离。
还有其他类似的模式可供选择。
此外,使用WPF进行开发可以帮助您,因为UI由XAML定义,而执行工作的代码是C#。这可以提供基本的分离程度。如果您发现自己编写的C#代码仅操作UI,则可以退后一步并思考“我应该在XAML中完成这项工作吗?”显然,可能有些事情必须在代码后面完成,但这是一个开始。
学习如何编写控制器类,使其可以绑定到表单并执行数据绑定。 在WinForms中,这主要涉及控制器类上的INotifyPropertyChanged和IDataErrorInfo接口以及在表单类上使用BindingSource实例。
然后,您可以编写一个包含所有UI和逻辑数据的控制器类,并将其简单地绑定到UI类。您的UI类变得非常轻巧,而您的UI逻辑(保存在控制器中)变得非常易于测试(当针对UI类运行时,单元测试会很棘手,但是当针对控制器类运行时,单元测试会容易得多)。
这是所有MVC/MVVM设计的基础。
Herbie
您应该关注以下模式:
MVC(模型-视图-控制器) MVVM(模型-视图-视图模型)- 在具有丰富数据绑定支持的 WPF 中使用最多。 MVP(模型-视图-展示者)- 经常用于 WinForms 和 Web 应用程序(因为视图是无状态的)
查看这篇博客文章,其中提供了如何使用 MVP 为 Web 和 WinForms 视图都提供动力的示例: http://www.cerquit.com/blogs/post/MVP-Part-I-e28093-Building-it-from-Scratch.aspx
此外,这篇博客文章介绍了使用 MVP 模式对业务逻辑进行单元测试的方法: http://www.cerquit.com/blogs/post/Model-View-Presenter-Part-II---Unit-Testing.aspx
一句话,这被称为重构。
将代码放入UI中只有几个原因:
所有其他“业务逻辑”代码都进入另一个称为业务逻辑类的类中。 所有数据库交互代码都进入不同的称为数据访问类的类中。
当您在UI中编写代码时,请问自己该代码是否正在与表单上的控件交互。 如果不是,它可能属于其他两个类。
查看Martin Fowler关于重构的一些书籍,例如“Refactoring: Improving the Design of Existing Code”。 另一个流行词是责任分离。 我知道您可以在一个类中完成所有这些内容,但是当代码按照上述方式分开时,它变得更加易读和更易于调试。