组织.NET表单中的UI代码

前端之家收集整理的这篇文章主要介绍了组织.NET表单中的UI代码前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我是一个教自己编程的人,还没有在.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;
   }

}

希望这解释了如何分离责任.该表单除了显示/格式化等之外没有逻辑,也可以被剔除进行测试.演示者是视图和模型之间的中介者,并调用服务,该模型会影响您的业务逻辑.如已经建议的那样,这种模式有变化,这可以使您的代码变得更加细腻,更灵活,但这概述了基本原则.我希望这有帮助.

猜你在找的HTML相关文章