CursedProgrammer Ответов: 2

Как реализовать простой в использовании и масштабируемый шаблон?


В настоящее время я работаю над более крупным проектом WinForms. Раньше я программировал небольшие приложения с помощью WinForms, которые имели максимум ~20 различных окон.

Теперь я стою перед большим проектом и хочу адаптироваться к нему, переосмыслив свой подход к нему.

Я читал о MVVM и MVC и некоторых вариациях.
Кстати о вариациях: Я нашел так много вариантов, что понятия не имею, из какой реализации они возникли.

Моя идея заключается в том, что он имеет:
-возможность простого масштабирования
-четкое разделение проблем (SoC)
-интуитивно понятный способ использования

Некоторые побочные замечания по этому проекту:
-Навигация с помощью горячих клавиш (каждый вид может иметь несколько горячих клавиш для перехода к другим видам)
-Требуется быстрое время отклика (клиент не любит ждать завершения запроса дольше 1 секунды.)

Ниже вы увидите мое текущее представление о том, как использовать шаблон.
Я очень благодарен за критику и/или советы по этому поводу.
Кроме того, я был бы очень благодарен услышать ваши предложения о том, как использовать этот шаблон и если есть какие-либо ловушки, как их избежать.

Заранее спасибо :)

Что я уже пробовал:

До сих пор я разработал следующий шаблон в качестве подхода:

Занятия:

Смотреть
void SetViewModel(ViewModel viewmodel);
void Clear();

Мысли:
Представление должно принимать только класс ViewModel для отображения.
Вся логика в представлении предназначена для регистрации ключевых событий, нажатий кнопок и т. д.
Если что-то подобное происходит, то запускается событие или команда перенаправляется на контроллер.

Контроллер
void AddView(View view);
void RemoveView(View view);
void SetModel(Model model);
void SetViewModel(ViewModel viewmodel);

Мысли:
Мой контроллер будет содержать всю логику принятия решений. (пример: если нажать кнопку X на вид - открыть новый вид)
Он будет принимать представления (одно или несколько) и обновлять каждое представление.

модель представления
event PropertyChangedEventHandler PropertyChanged;
T Get<T>(string property);
void Set<T>(string property, T value);

Модель
event PropertyChangedEventHandler PropertyChanged;
T Get<T>(string property);
void Set<T>(string property, T value);

Мысли:
Модель и ViewModel почти одинаковы.
Они содержат значения объекта и события пожара при изменении свойства.

Конвертер<TVM, TM>
TM ConvertToModel(TVM viewmodel);
TVM ConvertToViewModel(TM model);


Мысли:
Мой преобразователей будет отвечать на конвертировании моделей из модели представления в модель и обратно. Они должны будут обрабатывать соответствующие представлению преобразования и форматирование конкретных вещей.

Вывод:
Я не уверен, как заранее определить ловушки реализации и возможные ошибочные варианты дизайна, и мне нужны некоторые рекомендации о том, как подойти к большому проекту с четким шаблоном, чтобы следовать ему.

2 Ответов

Рейтинг:
12

RickZeeland

Дзоне имеет хорошую рефкарту об оригинальной банде из четырех шаблонов дизайна, которую вы можете скачать бесплатно (после регистрации):
https://dzone.com/refcardz/design-patterns?chapter=1[^]
Я также наткнулся на эту статью на DZone о фабричном шаблоне хорошо известного Кодопроектора (Ричард McCutchan): https://dzone.com/articles/design-patterns-c-factory[^]
Фабричный шаблон-один из самых полезных, я думаю, особенно если вы хотите отделить классы в большом решении.


CursedProgrammer

Работа через PDF действительно помогла мне с реализацией базовой части проекта. Спасибо за ссылку. Я принимаю это решение, потому что оно мне уже очень помогло.

Рейтинг:
1

RickZeeland

Может быть, вы можете использовать пользовательские формы, что-то вроде этого:

public class CustomForm : Form
{
    /// <summary>
    /// Initializes a new instance of the <see cref="CustomForm"/> class.
    /// </summary>
    public CustomForm()
    {
        // Required for Windows Form Designer support
        this.InitializeComponent();
    }

    private void CustomFormLoad(object sender, EventArgs e)
    {
        this.BackColor = SkinSettings.FormBackgroundColor;
        this.ForeColor = SkinSettings.FormForegroundColor;
        this.Font = SkinSettings.FontDefault;

        if (this.Text == @"CustomForm")
        {
            this.Text = SkinSettings.ProductName;
            this.Icon = SkinSettings.FormIcon;
        }
    }
}


CursedProgrammer

Здравствуйте, Рикзиленд, спасибо за ваш ответ.

Я тоже обдумывал подобную идею.

Но давайте вернемся к концептуальному вопросу здесь пожалуйста:

Помимо деталей реализации, есть ли у вас идея о том, как организовать большой проект с таким шаблоном?
Или у вас есть идеи о том, как изменить этот шаблон, чтобы лучше использовать конкретные функции WinForms? (например, привязка данных)

RickZeeland

Боюсь, я не поклонник MVC или MVVM и согласен с Джерри, что вы не должны становиться рабом такого шаблона, но это может быть потому, что мне и моим коллегам приходится бороться с унаследованным MVC-приложением разработчика, который покинул компанию и доставил нам много головной боли.
Для меня Windows Forms-это уже MVC, так как код и дизайн формы находятся в отдельных файлах ! Но все это, конечно, может быть моим предвзятым мнением ...

Gerry Schmitz

"Рефакторинг" вашего "старого" проекта и сделайте его "шаблоном" для вашего нового проекта (на основе извлеченных уроков).

Начиная с "нуля" сейчас (снова), вы будете вращать колеса большую часть времени.

А быть рабом MVVM (когда вы не можете ответить, почему) - значит быть посредственным (стадным) приложением.