Автор оригинала: FreeCodeCamp Community Member.
Даниэль Оливейра
Как разработчики, мы не можем поддерживать использование внешних библиотек и каркасов в наших системах. Руки сообщества создают изумительные инструменты, а использование их только естественно. Однако у всего есть недостаток.
Неограниченные команды и люди могут попасть в опасную ситуацию, структурируя свои системы вокруг инструментов, которые они используют. Бизнес-правила перепутают с деталями реализации. Это может привести к хрупкой системе, трудно продлить и поддерживать. Что должно быть быстрое изменение в GUI, в конечном итоге превращается в охоту на ошибку, которая длится часами. Но это не должно быть таким.
Архитектура программного обеспечения предлагает модели и правила для определения структур (таких как классы, интерфейсы и структуры) в системе и как они относятся друг к другу. Эти правила продвигают многократно и разделение опасений для этих элементов. Это позволяет легко изменить детали реализации, такие как СУБД или интерфейсная библиотека. Рефакторы и исправления ошибок влияют как можно больше деталей системы. И добавление новых функций становится ветером.
В этой статье я объясню Модель архитектуры, предложенная в 2012 году Роберт С. Мартин, Дядя Боб Отказ Он является автором классики, как Чистый код и Чистый кодер. В октябре этого года он запустит другую книгу, Чистая архитектура Отказ
Модель имеет то же имя, что и книга, и она построена на простых концепциях:
Разделите композицию системы в слои с различными и четко определенными ролями. И сдерживать отношения между субъектами в разных слоях. Нет ничего нового в разделении вашего приложения в слоях. Но я выбрал этот подход, как это был тот, который был самым простым для понимания и выполнения. И это делает тестирование в использовании случаи мертвых простого.
Мы просто должны убедиться, что Интакторы работать должным образом, и мы добры к работе. Не волнуйтесь, если слово «интеракторы» казалось вам иностранцам, мы узнаем о них в ближайшее время.
Изнутри выезда мы собираемся исследовать каждый из слоев немного дальше. Мы будем использовать приложение приложения, которое вполне знакомо для нас: счетчики. Требуется время, чтобы понять, поэтому мы можем сосредоточиться на предмете этой статьи.
Вы можете найти демонстрацию приложения здесь и образцы кода будут в типографии. Некоторые из кодов основных сигналов ниже используют реагировать и redux. Некоторые знания об этих решениях могут помочь в их понимании. Тем не менее, понятия чистого архитектуры намного более универсальны. Вы сможете понять это даже без предыдущих знаний о упомянутых инструментах.
Объекты
Сущности находятся на диаграмме как правила бизнеса предприятия. Предприятия включают бизнес-правила, которые являются универсальными для компании. Они представляют собой объекты, которые являются основными для своей области работы. Это компоненты с высочайшим уровнем абстракции.
В наших счетчиках образец, есть очень очевидное предприятие: Счетчик
сам.
Сценарии использования
ИСПОЛЬЗОВАНИЕ СЛУЖИВАНИЯ УТВЕРЖДАЕТСЯ, КАК ПРАВИЛА ПРИМЕНЕНИЯ. Они представляют каждое из употребления случаев использования одного приложения. Удачный элемент этого слоя обеспечивает интерфейс к внешнему слою и действовать в качестве ступицы, который связывается с другими частями системы. Они несут ответственность за полное выполнение случаев использования и обычно называются интеракторами.
В нашем образце у нас есть случай для увеличение
или уменьшение
наше счетчик
:
Обратите внимание, что заводская функция для Chang EcounterInteractor
Получает параметр типа Контрактария
Отказ Мы обсудим существование этого типа позже в статье. Но мы можем сказать, что ворота – это то, что стоит между случаями использования и следующим слоем.
Интерфейсные адаптеры
Этот слой состоит из границы между бизнес-правилами системы и инструментами, которые позволяют ему взаимодействовать с внешним миром, такие как базы данных и графические интерфейсы. Элементы в этом слое действуют как посредники, принимающие данные из одного слоя и передают его вперед к другому, адаптируете данные по мере необходимости.
В нашем образце у нас есть несколько интерфейсов адаптеров. Один из них является компонентом реагирования, который представляет Счетчик
и его контроль на увеличение
и уменьшение
:
Обратите внимание, что компонент не использует Счетчик
Пример, чтобы представить его значение, но экземпляр CounterViewdata
вместо. Мы сделали это изменение в Декупла, представляя логику от деловых данных Отказ Примером этого является логика выставки счетчика, основанная на режиме просмотра (римских или индуистских арабских цифр). Реализация CounterViewdata
следует ниже:
Другим примером интерфейсного адаптера будет реализацией нашего приложения. Модули, ответственные за запросы на сервер и использование локального хранения, также будут жить внутри этого слоя.
Рамки и драйверы
Инструменты, которые ваша система использует для связи с внешним миром, составляют внешний слой. Мы обычно не пишем код в этом слое, который включает в себя библиотеки, такие как React/Redux, API для браузера и т. Д.
Правило зависимости
Это разделение на слои имеет два основных целя. Один из них должен прояснить обязанности каждой части системы. Другой – убедиться, что каждый из них наполняет свои роли как можно более независимо друг от друга. Для этого произойдет, есть правило, которое гласит, как элементы должны зависеть друг от друга:
Элемент не должен зависеть от любого элемента, принадлежащего слою за пределами его собственного.
Например, элемент в использовании Case Layer не может иметь никакого знания о любом классе или модуле, связанном с постоянством GUI или данных. Аналогично, сущность не может знать, какие случаи использования используют его.
Это правило, возможно, подняло вопросы в вашей голове. Например, используйте случай. Это вызвано в результате взаимодействия пользователей с помощью пользовательского интерфейса. Его исполнение включает в себя обновление в некоторых постоянных хранилище данных, таких как база данных. Как Interactor может сделать соответствующие вызовы в процедуре обновления, не в зависимости от интерфейса, который отвечает за постоянство данных?
Ответ находится в элементе, который мы упомянули ранее: Шлюзы Отказ Они несут ответственность за установление интерфейса, необходимого в случае использования случаев использования, чтобы выполнить свою работу. Как только они установили этот интерфейс, это зависит от интерфейсных адаптеров для удовлетворения их стороны контракта, как показано на диаграмме выше. У нас есть Контрактария
Интерфейс и бетонная реализация с использованием Redux ниже:
Возможно, вам не понадобится
Конечно, это приложение образца было несколько сложным для приложения приращения/уменьшения приложения. И я хотел бы понять, что вам не нужно все это для небольшого проекта или прототипа. Но поверьте мне, так как ваша заявка становится все больше, вы захотите максимизировать повторное использование и ремонтопригодность. Хорошая программная архитектура делает проекты устойчивыми к прохождению времени.
Хорошо … так что?
С этой статьей мы обнаружили подход к отделениям наших системных организаций. Это делает их легкими для поддержания и продления. Например, чтобы построить такое же приложение с использованием Vue.js, мы бы только переписали Уплотнение
и Counterwidget
составные части. Исходный код приложения образца находится в ссылке ниже:
Valbrand/Counter-Clean-архитектура Способствовать разработке контр-чистой архитектуры, создавая учетную запись на GitHub. github.com.
Эта история была переведена на португалью мной! Это доступно здесь Отказ
Какие плюсы и минусы вы видите в этом подходе? Вы использовали что-то похожее в производстве? Поделитесь своим опытом в ответах. Если вам нравится статью, пожалуйста, хлопайте для меня!