我是一个教自己编程的人,还没有在.NET编程中进行任何正式的培训.
一会儿,我开始使用C#来开发GUI程序来控制传感器,并且项目已经开始了.我只是想知道如何最好地组织我的表单中的代码,特别是UI代码.
我的形式目前是一团糟,或者至少对我来说似乎是一团糟.
>我有一个构造函数来初始化所有参数并创建事件.
>我拥有一个巨大的州级财产,随着用户通过国家枚举控制的应用程序(即:断开连接,连接,设置,扫描),我更新了所有窗体控件的Enabled状态.
>我有通过属性访问的3-10个私有变量,其中一些在更改表单元素的值时具有副作用.
>我有很多“UpdateXXX”函数来处理依赖于其他UI元素的UI元素,例如:如果传感器被更改,则更改波特率下拉列表.它们分成几个区域
>我有很多事件调用这些更新功能
>我有一个后台工作者进行所有的扫描和分析.
我的问题是,这似乎是一团糟,特别是国家财产,而且是不可维持的.此外,我的应用程序逻辑代码和UI代码在同一个文件中,在某种程度上,混合似乎错误,意味着我需要做很多滚动来找到我需要的.
你如何构建你的.net表单?
谢谢
解决方法
有许多模式可以帮助您分离应用程序中的逻辑,从而实现更清洁和更可维护的代码. MVP模式是一个很好的开始.它基于定义3个区域的重要性,即MVP M = Model,V = View,P = Presenter.如果你熟悉使用接口,你将会很好,否则这将是一个好的开始(查看基本的OO价格:封装,抽象,多态). MVP的基本原理是将应用程序逻辑放在Presenter中.主持人通过界面与视图(您的表单)进行交谈,当用户与之交互时,该视图会回调给演示者(我也使用界面).该模型是解决方案的域对象层次结构,它隐含了商业逻辑和实体关系.
大多数UI模式(MVP,MCV等)都在尝试做同样的事情,分离您的疑虑.以下是一个简单的例子:
//视图界面
interface IUserDetailsView { string Username{set;get;} string FirstName{get;set;} string LastName{get;set;} UserDetailsPresenter Presenter{get;set;} void DisplayMessage(string message); }
//视图隐含
//具有文本框,标签,组合等的标准窗体
class UserDetailsView : Form,IUserDetails { public string Username{set{txtUserName.text = value;}get{return txtUserName.text;}} public string FirstName{set{txtFirstName.text = value;}get{return txtFirstName.text;}} public string LastName{set{txtLastName.text = value;}get{return txtLastName.text;}} Public UserDetailsPresenter Presenter{get;set;} public void DisplayMaessage(string message) { Message@R_301_460@.Show(message); } private void saveButton_Click(object sender,EventArgs e) { Presenter.SaveUserDetails(); } }
//演示逻辑
课程Presenter UserDetailsPresenter
{
//Constructor public userDetailsPresenter(IUserDetailsView view) { //Hold a reference to the view interface and set the view's presnter _view = view; _view.Presenter = this; } private IUserDetailsView _view; DisplayUser(string userName) { //Get the user from some service ... UserDetails details = service.GetUser(userName); //Display the data vioa the interface _view.UserName = details.UserName; _view.FirstName = details.FirstName; _view.LastName = details.LastName; } public void SaveUserDetails() { //Get the user dryaiols from the view (i.e. the screen UserDetails details = new UserDetails(); details.UserName = _view.UserName; details.FirstName = _view.FirstName; details.LastName = _view.LastName; //Apply some business logic here (via the model) if(!details.IsValidUserDetails()) { _view.DisplayMessage("Some detail outlining the issues"); return; } //Call out to some service to save the data service.UpdateUser(details); }
}
//最后,模型
public class UserDetails { public UserName {get;set;} public FirstName{get;set;} public LastName{get;set;} public bool IsValidUserDetails() { if(LastName == "Smith") { //We do not allow smiths,remember what happened last time ... or whatever return false; } return true; } }
希望这解释了如何分离责任.该表单除了显示/格式化等之外没有逻辑,也可以被剔除进行测试.演示者是视图和模型之间的中介者,并调用服务,该模型会影响您的业务逻辑.如已经建议的那样,这种模式有变化,这可以使您的代码变得更加细腻,更灵活,但这概述了基本原则.我希望这有帮助.