有许多模式可以帮助您在应用程序中分离逻辑,从而产生更清洁和更可维护的代码。MVP 模式是一个很好的开始。它基于定义 3 个责任领域,即 MVP M = 模型、V = 视图、P = 演示者。如果您熟悉使用接口就可以了,否则这将是一个很好的起点(查看基本的 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)
{
MessageBox.Show(message);
}
private void saveButton_Click(object sender, EventArgs e)
{
Presenter.SaveUserDetails();
}
}
//表示逻辑
类演示者 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;
}
}
希望这能解释责任是如何分开的。该表单除了显示/格式化等之外没有任何逻辑,它也可以被存根用于测试。演示者是视图和模型之间的中介并调用服务,模型实现您的业务逻辑。正如已经建议的那样,这种模式有一些变化,这可以使您的代码更苗条和更灵活,但这概述了基本原则。我希望这有帮助。
:-)