🏗️

Паттерны MVP и MVVM

Для тех, кто только начинает

👋 Привет, новичок!

Сегодня мы разберемся, как правильно строить программы

чтобы они были:

  • ✅ Понятными
  • ✅ Легкими для исправления ошибок
  • ✅ Удобными для новых фич

❌ Как НЕ надо делать

Типичная ошибка новичка:
// Всё в одной форме!
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 — связь между ними

🤔 Что такое "паттерн"?

📖
Паттерн — это как проверенный рецепт или инструкция.
Кто-то уже придумал, как лучше делать, и мы просто используем это!
1
Раньше программисты часто ошибались
2
Они придумали ХОРОШИЕ решения
3
Эти решения назвали "паттерны"
4
Теперь мы просто используем готовые рецепты!

🎭 MVP - Model-View-Presenter

👨‍🍳
Представь ресторан:
РольВ программеВ ресторане
ModelДанные и расчеты🍳 Кухня (готовит еду)
ViewТо, что видит пользователь📋 Меню, столики
PresenterУправляет всем👨‍💼 Официант (передает заказы)
📌 Запомни: Официант (Presenter) знает и про кухню, и про клиента. А клиент не знает, как готовится еда!

📝 MVP - Пример "Калькулятор"

1
View (Форма): Показывает кнопки и цифры
// View - только показывает!
public interface ICalculatorView
{
    string FirstNumber { get; set; }
    string SecondNumber { get; set; }
    string Result { get; set; }
    event EventHandler AddClicked; // Кнопка нажата
}
2
Model (Модель): Просто считает
// Model - только математика!
public class CalculatorModel
{
    public int Add(int a, int b) => a + b;
}
3
Presenter (Ведущий): Связывает всё
// 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();
}

🔄 Как работает MVP

👤 ПОЛЬЗОВАТЕЛЬ
↓ (нажал кнопку)
🖼️ VIEW (форма)
↓ (сказала Presenter'у)
🎭 PRESENTER (ведущий)
↓ (попросил модель)
💾 MODEL (модель)
↓ (вернула результат)
🎭 PRESENTER (обновил View)
↓
🖼️ VIEW (показала ответ)
Всё просто: View → Presenter → Model → Presenter → View

👍👎 Плюсы и минусы MVP

✅ ПЛЮСЫ:
  • Код легче читать
  • Можно тестировать без экрана
  • Легко менять дизайн
  • Работать в команде проще
❌ МИНУСЫ:
  • Приходится писать больше кода
  • Для маленьких программ сложновато
💪 Когда использовать: WinForms, средние и большие проекты

✨ MVVM - Model-View-ViewModel

🤖
Представь умный дом:
РольВ программеВ умном доме ModelДанные🏠 Сам дом (стены, проводка) ViewЭкран📱 Пульт управления ViewModelУмный помощник🧠 Умный дом (сам всё знает)
📌 Главная фишка: View и ViewModel связаны МАГИЧЕСКИ! (через Binding)

🔮 Магия Data Binding

🪄
Это как волшебная ниточка между экраном и данными!
// XAML (экран)
<TextBox Text="{Binding UserName}" />
<Label Content="{Binding UserName}" />

// C# (данные)
public string UserName 
{
    get => _userName;
    set 
    {
        _userName = value;
        OnPropertyChanged(); // МАГИЯ! Экран сам обновится!
    }
}
✨ Изменил данные → экран обновился САМ! Не нужно писать код для обновления!

📝 MVVM - Пример "Приветствие"

1
ViewModel (Умный помощник):
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}!"));
    }
}
2
View (Экран) - почти без кода!
<TextBox Text="{Binding Name}" />
<Button Content="Сказать привет" 
        Command="{Binding SayHelloCommand}" />

🥊 MVP против MVVM

🎭

MVP

View знает о Presenter

👨‍💼 Официант сам всё делает

✅ Проще для понимания

🎮 WinForms

✨

MVVM

View не знает о ViewModel

🤖 Умный дом сам работает

✅ Меньше кода для обновлений

🪟 WPF, MAUI

🤷 Как выбрать что использовать?

Простое правило:
  • 📱 WinForms → используй MVP
  • 🪟 WPF / MAUI → используй MVVM
  • 📝 Маленькая программа → можно без паттернов
  • 🏢 Большой проект → обязательно используй паттерн!
💡 Совет: Начни с MVP (он проще), потом освой MVVM!

🧪 Почему паттерны помогают тестировать?

🔬
Можно проверить работу программы БЕЗ запуска экрана!
// Тест для MVP
[Test]
public void TestAdd()
{
    var presenter = new CalculatorPresenter(...);
    presenter.OnAddClicked(); // Проверяем логику
    // Не нужен экран!
}
✅ Это экономит часы времени! Не нужно нажимать кнопки руками тысячи раз.

🏪 Жизненный пример: Магазин

1
Model: Склад с товарами
2
View: Витрина (что видит покупатель)
3
Presenter/ViewModel: Продавец
Покупатель (View) говорит продавцу (Presenter): "Хочу хлеб"
Продавец берет хлеб со склада (Model) и отдает покупателю
Покупатель НЕ ходит на склад сам!

⚠️ Частые ошибки новичков

❌ Ошибка 1: Весь код в форме (как раньше)
✅ Решение: Разделяй на Model, View, Presenter
❌ Ошибка 2: Presenter работает напрямую с кнопками
✅ Решение: Используй интерфейс View
❌ Ошибка 3 (MVVM): Забыл OnPropertyChanged()
✅ Решение: Всегда вызывай при изменении свойств
💪 Не бойся ошибок! Все через это проходят.

📋 Как начать использовать паттерны

1
Напиши простую программу БЕЗ паттерна
2
Пойми, что в ней неудобно
3
Перепиши ее с MVP (это просто!)
4
Попробуй WPF и изучи MVVM
5
Пользуйся паттернами во всех проектах!

📚 Шпаргалка для новичка

MVPMVVM
View → Presenter → Model View → ViewModel → Model
View знает Presenter'а View НЕ знает ViewModel
Ручное обновление Авто-обновление (Binding)
Проще для начала Сложнее, но мощнее
WinForms WPF, MAUI

🌟 Почему это важно?

  • 🚀 Твои программы станут ПРОФЕССИОНАЛЬНЫМИ
  • 💼 Этого ждут на работе от разработчиков
  • 🧠 Ты научишься думать структурно
  • 🤝 С тобой легче работать в команде
  • 🐛 Ошибки будет легко исправлять
🏆
Настоящие программисты используют паттерны! Ты на правильном пути!
🎉

Ты молодец!

Что ты узнал сегодня?

  • ✅ Что такое паттерны и зачем они нужны
  • ✅ MVP — как официант в ресторане
  • ✅ MVVM — как умный дом
  • ✅ Когда что использовать
  • ✅ Как не совершать глупых ошибок
🚀 Теперь ты знаешь больше, чем многие новички!
Практикуйся и всё получится!

🙏 Спасибо за внимание! Вопросы?