Что такое DCI и как он может сочетаться с Rails?

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

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

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

Есть несколько вещей, которые я хотел бы спросить:

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

редактировать

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

4 ответа

Решение

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

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

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

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

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам