Существует ряд шаблонов, которые помогают вам отделять логику в приложениях, что приводит к получению более чистого и более удобного кода. Шаблон MVP хорош для начала. Он основан на определении 3 областей ответственности, т. Е. MVP M = модель, V = вид, P = презентатор. Если вы знакомы с использованием интерфейсов, у вас все будет хорошо, иначе это было бы хорошим началом (пересмотрите основные принципы ОО: инкапсуляция, абстракция, полиморфизм). Основной принцип MVP состоит в том, чтобы поместить логику приложения в Presenter. Presnter общается с представлением (вашей формой) через интерфейс, и представление перезванивает докладчику (я тоже использую интерфейс для этого), когда пользователь взаимодействует с ним. Модель - это иерархия объектов домена решения, которая реализует бизнес-логику и отношения сущностей.
Большинство шаблонов пользовательского интерфейса (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();
}
}
// Логика презентации
Класс 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;
}
}
Надеюсь, это объясняет, как разделена ответственность. Форма не имеет никакой логики, кроме отображения / форматирования и т. Д., Ее также можно отключить для тестирования. Презентатор является посредником между представлением и моделью и выполняет вызовы к услугам, модель влияет на вашу бизнес-логику. Как уже предлагалось, в этом шаблоне есть вариации, которые могут сделать ваш код немного более тонким и гибким, но в нем изложены основные принципы. Надеюсь, это поможет.
: -)