Контроллеры бога - Как предотвратить их?

Использование обоих является важной частью тестирования доставки приложений. Я только начинаю связываться с Docker и очень серьезно думаю о команде разработчиков, которая имеет ужасную сложность в создании и поставке своего программного обеспечения. Подумайте о классической ситуации с Проектом Феникс / Непрерывной Доставкой.

Мышление выглядит примерно так:

  • Возьмите компонент приложения Java / Go и соберите его как контейнер (обратите внимание, не уверен, должно ли приложение быть встроено в контейнер или построено, а затем установлено в контейнер)
  • Доставить контейнер в Vagrant VM.
  • Повторите это для всех компонентов приложения.
  • Выполните итерации для компонента (-ов) для кодирования.
  • Постоянно тестировать механизм доставки на виртуальную машину (-ы), управляемую Вагрантом.
  • Спать хорошо, зная, когда пора развертывать контейнер, что интеграционное тестирование проводилось на гораздо более постоянной основе, чем это было до Докера.

Это, кажется, является логическим продолжением утверждения Митчелла о том, что Вагрант предназначен для развития в сочетании с мышлением Фарли / Хамблса в «Непрерывной доставке». Если я, как разработчик, смогу сократить цикл обратной связи по интеграционному тестированию и доставке приложений, это приведет к повышению качества и улучшению условий работы.

Тот факт, что я как разработчик постоянно и последовательно поставляю контейнеры на ВМ и тестирую приложение более целостным образом, это означает, что производственные выпуски будут еще более упрощены.

Итак, я вижу, как Vagrant развивается как способ использовать некоторые из удивительных последствий, которые Docker будет иметь для развертывания приложений.

15
задан James A Mohler 20 March 2013 в 18:26
поделиться

4 ответа

Я бы разбил ваш первый список на основе ответственности:

HomeController

  • Index

FoodItemController

  • ViewFoodItem
  • AddFoodItem
  • EditFoodItem
  • DeleteFoodItem
  • SearchFoodItem

NutritionController

  • ViewNutritionSummary

FavoritesController

  • AddToFavorites
  • RemoveFromFavorites
  • ViewFavorites
  • SearchFavorites

Подход Django к приложениям MVC заключается в разделении ответственности ", каждый со своими собственными моделями, контроллерами и даже шаблонами, если это необходимо. Скорее всего, у вас будет приложение Food, приложение Nutrition, приложение Search и приложение Favorites.

Edit: OP упомянул, что поиск более специфичен для каждого контроллера, поэтому я выполнил эти действия. Однако поиск может быть просто глобальным делом, поэтому в таких случаях

12
ответ дан 1 December 2019 в 04:18
поделиться

Делайте, как говорит Совьют. Вы хотите, чтобы контроллеры были простыми. Похоже, что в ваших контроллерах слишком много логики координации. Помните, что они несут ответственность за соединение представления и модели. Эта логика координации, вероятно, должна быть разделена на службы.

Я чувствую это чувство, потому что вы упоминаете о возможности увеличения зависимости вашего контроллера от огромных зависимостей. Что ж, если FavouritesController должен знать о питании и избранных упражнениях (для отображения в одном представлении), не делайте ваш контроллер зависимым от двух репозиториев, таких как классы. Вместо этого инкапсулируйте это координационное поведение. Возможно, создайте службу FavoritesService, которая знает, как возвращать избранное как по питанию, так и по упражнениям. Эта служба может делегировать NutritionFavoritesService и ExerciseFavoritesService. Так ты

2
ответ дан 1 December 2019 в 04:18
поделиться

Я не слишком знаком с этой структурой, но могу дать небольшой совет. Контроллер, вероятно, должен знать только, как выполнить одно действие или вызвать другие контроллеры одного действия, чтобы выполнить последовательность связанных действий. Любую информацию, которая должна передаваться от действия к действию, вероятно, следует каким-то образом передать через уровень модели, поскольку эта информация, скорее всего, имеет отношение к базовой модели.

1
ответ дан 1 December 2019 в 04:18
поделиться

Я также испытал такого рода головные боли при обслуживании и считаю, что использование метода, подобного «Rails», очень помогает в поддержании сосредоточенности моих контроллеров и их разгруженности.

Если я обнаружу, что добавляю действия с необычными названиями Например. Чтобы использовать пример ведения блога, AddPostToBlog, это будет флаг для создания нового контроллера Post с действием Create.

Другими словами, если действие не является одним из действий «Индекс», «Создать», «Создать», «Показать», «Изменить», «Обновить» и «Уничтожить», я добавляю новый контроллер, специфичный для требуемого мне действия.

Для вашего примера.

SearchController {
    SearchExercise
    SearchNutrition
    //... etc
}

Я бы реорганизовал это, чтобы ...

   SearchExerciseController {
           Index   
   }

   SearchNutritionController {
           Index   
   }

Это может означать наличие большего количества контроллеров, но, на мой взгляд, это проще в управлении, чем когда-либо расширяющиеся "божественные" контроллеры. Это также означает, что контроллеры более самодокументируются.

Например. Возвращает ли действие SearchExercise представление для поиска упражнения или действительно выполняет поиск? Вероятно, вы могли бы убедиться в этом, посмотрев на параметры и тело, но это не так просто, как, например, пара действий «Создать» и «Создать» или «Изменить и обновить».

SearchController {
    SearchExercise       
}
1
ответ дан 1 December 2019 в 04:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: