Поздравляем с обнаружением повторяющейся природы вашего кода. Это хорошее начало.
С другой стороны, у вас есть длинный путь к go, в этом вам нужно многому научиться.
После изучения вашего Структура кода выглядит следующим образом:
(1) Controller Class
-- (2) HTTP GET METHOD / ACTION
-- (3) HTTP POST METHOD / ACTION
-- -- (4) If the model state is valid
-- -- -- (5) If the object does not already exist in the database
-- -- -- -- (6) Do the thing. In your case, create a record in the database and save it.
-- -- -- -- (7) While doing it, if there's an error, write it to TempData.
-- -- -- (8) Else if the object already exists in the database
-- -- -- -- (9) Write an error to the temp data
-- -- -- (10) End of check if the object exists in the database
-- -- (11) Else if the model state is not valid
-- -- -- (12) Write an error to TempData
-- -- (13) End of check if model state is valid or not
-- -- (14) If while doing the whole method thing, there's an error, write it to TempData
-- (15) End of method.
К счастью, это не новая проблема, или даже сложная для взлома. В основном это мясо и картошка всех простых приложений CRUD.
Проблема в том, что вы кричите громко и ясно, и у вас есть подозрение, что что-то не так. Вот проблема.
Все перепутано. На сложном языке вы смешиваете проблемы .
Итак, вам необходимо выделить ваши проблемы .
Это основа c принцип проектирования, а не конкретный c шаблон проектирования.
Разделение проблем
У вас есть код, который находится рядом с пользовательским интерфейсом, то есть действия вашего контроллера, ваш бизнес-объекты или модели, то есть такие классы, как пользователь, учетная запись и т. д. c. ваши служебные классы, такие как методы, которые преобразуют вещи в JSON и обратно, все в одном месте.
Кроме того, вы создали даже свои служебные методы, которые выполняют JSON и обратное преобразование из ваших бизнес-объектов. в методы publi c, что делает их вызываемыми как действия на вашем контроллере.
Все эти ошибки нарушают принципы хорошего дизайна.
Вы должны выделить их, чтобы ваш код читается как две или три строки, например:
public void PostAction(ModelObject model)
{
if (!ModelState.IsValid)
{
// Some error handling strategy common to the whole
// application that sits well with the kind of interface
// this application has. Are you making a website or is this
// a web API?
}
// You're here because the model state is valid
// Get the repository object somehow:
// (a) Either through dependency injection in the controller's constructor, and
// when you get the dependency, get it in the lowest / basest possible interface
// so that it is polymorphic.
// (b) Or as a service location strategy, which means new it up here
repositoryObject.doTheThing();
}
public class MyCentralErrorHandler : HandleErrorAttribute
{
...
}
При их разделении я заметил, что применил несколько шаблонов:
- Внедрение зависимостей
- Расположение службы
- Репозиторий
Я также применил принцип SOLID сегрегации интерфейса . То есть я получил свою зависимость, используя полиморфный c тип времени компиляции, например:
public class MyController : Controller
{
public MyController(IRepository repositoryObject) : base()
{
}
}
Итак, чтобы ответить на другой аспект вашего вопроса о том, какой шаблон проектирования применить, я бы сказал, вы все еще попадаете в ту же ловушку, в которую попадают все новички. На этом этапе вам не нужно изучать шаблон проектирования. Но вам нужно больше кодировать.
Код много для практики, пока ваша собственная интуиция не разовьется до такой стадии, когда, как вы заметили, в вашем коде было что-то грязное, ваша собственная интуиция ясно и недвусмысленно говорит вам границы того, что нужно go, где, и вы начинаете работать над своей интуицией и в конце следования его инструкциям, вы понимаете: «Эй, то, что я сделал только сейчас, это называется такой-то шаблон дизайна. Альт! Я никогда не делал это сознательно. "
Итак, в двух словах, изучите их все. Узнайте все шаблоны дизайна на данный момент. Изучите их полностью и дайте ему несколько лет, чтобы катиться в вашей голове. А затем выбросьте их из головы, когда вы пишете код. Вы не должны быть супер внушительными шаблонами дизайна в своем коде. Они просто должны выйти из вас, как это делает р oop. И поверь мне, это случится. Все, что вам нужно, это просто еще несколько лет практики.
Между тем, пишите много кода. Много кода.
Еще один ответ на ваш вопрос, как я уже говорил выше, заключается в том, что вам необходимо применить следующие вещи:
- Принцип построения разделения проблемы;
- Шаблон хранилища, который сам по себе является проявлением принципа разделения интересов;
- Расположение службы
- Внедрение зависимостей
- Принцип SOLID программирования для интерфейса, а не для конкретной реализации
- Правильная стратегия обработки ошибок / исключений. Это много размышлений, которые должны быть здесь. Вам нужно задать себе много вопросов о том, какой интерфейс имеет ваше приложение и что вы собираетесь делать на каждом этапе. Это не то, что я могу написать здесь и покончить. Вам нужен наставник или много лет практики.
Еще одна вещь, на которую я должен обратить ваше внимание, - это то, что шаблоны проектирования накладываются друг на друга. Итак, есть несколько более очевидных шаблонов проектирования, которые на самом деле также go по более чем одному имени, которые уже применяются в решении, которое я выделил выше. Они в основном разные имена для одного и того же. Итак, это туманные идеи, которые выделяются в зависимости от их функции и даже контекста.
Например, просто принцип программирования для интерфейса также можно назвать сегрегация интерфейса хотя термин сегрегация интерфейса имеет другое, более широкое значение в контексте проектирования системы. Также можно заметить, что при игре полиморфизм . И я уверен, что есть другое имя шаблона, которое можно отнести к тому же здравому смыслу, очевидному решению.