👋 Привет, новичок!
Сегодня мы разберемся, как правильно строить программы
чтобы они были:
// Всё в одной форме!
public class CalculatorForm : Form
{
private void buttonAdd_Click(...)
{
// Тут и логика, и работа с БД, и проверки...
int a = int.Parse(textBox1.Text);
int b = int.Parse(textBox2.Text);
// Сложные вычисления
// Работа с базой данных
// Отправка email
// Обновление интерфейса
// ВСЁ В ОДНОМ МЕСТЕ!
}
}
🚫 Проблемы: Код трудно читать, тестировать и менять!
📁 Model (Модель) — данные и расчеты 📁 View (Представление) — что видит пользователь 📁 Presenter/ViewModel — связь между ними
| Роль | В программе | В ресторане |
|---|---|---|
| Model | Данные и расчеты | 🍳 Кухня (готовит еду) |
| View | То, что видит пользователь | 📋 Меню, столики |
| Presenter | Управляет всем | 👨💼 Официант (передает заказы) |
// View - только показывает!
public interface ICalculatorView
{
string FirstNumber { get; set; }
string SecondNumber { get; set; }
string Result { get; set; }
event EventHandler AddClicked; // Кнопка нажата
}
// Model - только математика!
public class CalculatorModel
{
public int Add(int a, int b) => a + b;
}
// Presenter - связывает View и Model
void OnAddClicked()
{
int a = int.Parse(_view.FirstNumber);
int b = int.Parse(_view.SecondNumber);
int result = _model.Add(a, b);
_view.Result = result.ToString();
}
// XAML (экран)
<TextBox Text="{Binding UserName}" />
<Label Content="{Binding UserName}" />
// C# (данные)
public string UserName
{
get => _userName;
set
{
_userName = value;
OnPropertyChanged(); // МАГИЯ! Экран сам обновится!
}
}
public class MainViewModel
{
private string _name;
public string Name
{
get => _name;
set
{
_name = value;
OnPropertyChanged(); // Авто-обновление!
}
}
public ICommand SayHelloCommand { get; }
public MainViewModel()
{
SayHelloCommand = new RelayCommand(() =>
MessageBox.Show($"Привет, {Name}!"));
}
}
<TextBox Text="{Binding Name}" />
<Button Content="Сказать привет"
Command="{Binding SayHelloCommand}" />
View знает о Presenter
👨💼 Официант сам всё делает
✅ Проще для понимания
🎮 WinForms
View не знает о ViewModel
🤖 Умный дом сам работает
✅ Меньше кода для обновлений
🪟 WPF, MAUI
// Тест для MVP
[Test]
public void TestAdd()
{
var presenter = new CalculatorPresenter(...);
presenter.OnAddClicked(); // Проверяем логику
// Не нужен экран!
}
| MVP | MVVM |
|---|---|
| View → Presenter → Model | View → ViewModel → Model |
| View знает Presenter'а | View НЕ знает ViewModel |
| Ручное обновление | Авто-обновление (Binding) |
| Проще для начала | Сложнее, но мощнее |
| WinForms | WPF, MAUI |
🙏 Спасибо за внимание! Вопросы?