Что такое DCI и как он может сочетаться с Rails? - PullRequest
22 голосов
/ 13 марта 2012

Недавние дебаты с коллегой о различных подходах к проектированию и кодированию моделей в приложении Rails привели меня к DCI в контексте Rails .

Однако я простоне могу обернуть голову вокруг всей этой концепции, даже после рассмотрения этого примера приложения .

В настоящее время я склоняюсь к более или менее " книге "при написании приложения на Rails.

Итак, есть несколько вопросов, которые я хотел бы спросить -

  • Что такое DCI и каковы его преимущества при реализации вместе сMVC поверх простого старого MVC (и ванильного ActiveRecord в Rails)?
  • И как его можно реализовать в Rails (или, другими словами, , что со всеми модулями )?

Edit

Я хотел бы еще больше расширить мой вопрос в контексте RoR - рекомендуется ли еще один уровень абстракции между моделями и контроллерами в Rails?Насколько широко это распространено в приложениях различного масштаба?

Ответы [ 4 ]

20 голосов
/ 14 марта 2012

DCI - это парадигма и, следовательно, гораздо больше, чем способ разработки приложения. Это способ думать о моделировании, а также структурировать код. Одной из важных частей DCI является сохранение того, что представляет собой система (модель предметной области) и что система выполняет (функциональность) отдельно. DCI - это не другой подход к решению той же проблемы, что и MVC, поэтому на ваш первый вопрос невозможно ответить. Вы можете использовать MVC и DCI одновременно, что не случайно, так как Trygve Renskaug является отцом как MVC, так и DCI. Недавно он ответил на похожий вопрос на этот вопрос в группе Google 'object-состав'.

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

Я сам не знаю RoR, поэтому не могу привести пример RoR, но если вы перейдете на fullOO , вы найдете примеры, написанные на разных языках, включая Ruby и Marvin - первый язык. предназначен для DCI.

РЕДАКТИРОВАТЬ Нет простого ответа на вопрос «Что такое DCI» DCI - это парадигма, точно так же, как ООП - это парадигма. Они оба имеют одинаковые корни, и ответить на поставленный выше вопрос так же сложно, как и ответить на вопрос «Что такое объектно-ориентированное программирование». Ситуация еще более усложняется тем фактом, что DCI является объектно-ориентированным, а ООП во всех основных языках ОО фактически ориентирован на класс, а не объектно-ориентированный. Целью DCI является создание кода, в котором взаимодействие между объектами во время выполнения видно в коде во время компиляции и, в более общих чертах, пытается понять, как во время выполнения можно считать поведение при чтении кода. сайт , на который я ссылался выше, посвящен объяснению того, что такое DCI, а также перечисляет примеры на нескольких языках. Руби является одним из них

РЕДАКТИРОВАТЬ Есть книга на рубине и DCI в пути. Автор довольно активен в объектно-композиционной и проницательной

14 голосов
/ 09 марта 2014

Для людей, которые задаются вопросом, что означает DCI ..

DCI означает Data Context Interaction

8 голосов
/ 12 мая 2012

В основе DCI лежат когнитивные инструменты, которые он предоставляет разработчику. Я не уверен, что вы видели все замечательные лекции Джеймса Коплина / Трюгве Реенскага , но я постараюсь раскрыть суть этого для любого новичка в понятиях. Речь идет о перемещении поведения системы из взаимодействующих с ней объектов предметной области (объектов данных или того, чем является система) и объектов поведения (что делает система) в качестве граждан первого класса, которые опосредуют взаимодействие между объектами, придавая им функциональность в контексте варианта использования как раз вовремя.

Подумайте, BDD. Мы кодируем поведение не во многих объектах, таких как частички функциональности, разбросанных по всем нашим объектам данных, которые тесно связаны со слоем постоянства, но внутри связных объектов, которые существуют исключительно для варианта использования (истории) и которые внедряют возможности и координируют взаимодействия этих тупых объектов данных. Как и просто уровни физической архитектуры, медленно меняющиеся объекты данных не загружаются быстро меняющейся реализацией функций, которую они постоянно носят с собой. Скорее, Ruby предоставляет нам возможность легко внедрить поведение в объекты во время выполнения, когда / если это необходимо только в контексте варианта использования.

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

Что касается вашего вопроса о «другом» уровне абстракции между контроллерами и моделями в рельсах, я не уверен, на какой другой вы ссылаетесь. В любом случае, да. Во всех смыслах. Нет проблем. Шаблоны проектирования и принципы SOLID Дяди Бобса - это в значительной степени общепринятые передовые практики в проектировании ОО. Оба из них настоятельно поощряют слабосвязанные абстракции между политикой и реализацией. Они оба помогают избежать катострофических свалок мозга разрушающей величины Римской империи, потому что они обеспечивают общую структуру, понятную всем. DCI, для меня, предоставляет тот же тип когнитивной структуры, но для облегчения понимания и эффективного управления системой, и это святой Грааль для любого объектно-ориентированного дизайнера.

6 голосов
/ 14 марта 2012

Есть книга (в настоящее время в разработке) по использованию DCI в Ruby / Rails: Clean Ruby .Я настоятельно рекомендую внести себя в список уведомлений - я прочитал части этой книги, и она выглядит действительно хорошо.

DCI получает признание в мире Rails - было несколькоинтересные посты в блоге об этом за последние 3 месяца или около того.

...