Введение
Пару-тройку недель назад попалась ссылка на интересный подход к проектированию называющийся DCI, сформулированный создателем MVC.
В кратце его можно передать так: все, что сейчас разрабатывается не ООП, а Class Orientied Programming.
И на самом деле должно быть разделение не на объекты, которые умеют как-то менять свое состояние, а на данные + роли, т.е. то, как разные классы данных взаимодействуют.
Ведь в сущности объект человек это набор ролей: отец, брат, продавец, муж и т.д.
Описание
Во время выполнения программы или любого алгоритма 1 объект может выступать в разных ролях и попытка впихнуть весь этот функционал в класс приводит к жуткой мешанине кода, тесной связность и вообще страданиям, страху и ужасу).
Вместо этого классы доменной логики, сами по себе должны быть эдакими "тупыми" объектами.
Например, объект Банковский Счет должен знать, что у него есть баланс, и он может его повышать и понижать, но только в рамках определенной роли и определенного контекста, к нему добавляется логика, например
1)возможность или невозможность залезть в долг при выдаче наличных,
2)возможность перевода денег на другой счет, при наличии достаточного количества на счету
3)возможность оплатить деньги всем кредиторам.
Все 3 предыдущих пункта - роли, играемые данным счетом в определенном контексте, и например во 2м варианте , этот же счет может играть роль "принимающего" счета.
Фактически любая программная система это динамический набор объектов, которые принимают то одну то другую роль за время своей жизни в рантайме и концпеции типа MVC, позволяют через сеть слоев соединить ментальную модель пользователя с настоящей vjltkm. работы системы.
Но во время разработки программист работает, с ментальной моделью статичной программы, в которой есть классы А И Б, которые умеют действий В и Г, а не с динамической моделью, что вот в этом месте класс А впитывает в себя роль принимающего счета, или брата, или чего-либо еще.
Подход к разработке с использованием парадигм DCI, пытается смягчить "impedance mismatch" (как это по русски-то называется ?)) между моделью системы в работе(runtime), и моделью ее во время разработки(compiletime), что должно послужить повышению читаемости, понятности и предсказуемости поведения программ.
Итого
Чем-то этот подход и сама идея незримо напоминает AOP (который слишком сложен и неудобен и потому не получил особого распространения) и очень даже напоминает идеи mixin-нов, trait-ов и соответственно аспектов (которые мало-помалу вкрадываются во все новомодные языки и предают им синтаксической и концептуальной силы).
С одной стороны вроде получается боян, по причине "вот же оно - уже было".
С другой стороны если посмотреть, как обычно о них рассказывают, то нет именно этого акцента на участие роли в определенном контексте взаимодействия, и отсутствие четких стратегий смешивания этих самых миксинов и ролей.
В общем-то видно, что интуитивно идея постепенно просачивается в программерское сообщество с тенденциями типа DDD, mixin`ов и trait`ов, но возможно с другим именем, и пока только кусками.
Источники
Тексты/Статьи:
1)http://en.wikipedia.org/wiki/Data,_Context_and_Interaction - статья в википедии
2)http://heim.ifi.uio.no/~trygver/themes/babyide/baby-documents.html - набор ссылок от автора
Видео:
1) http://oredev.org/videos/dci-in-practice(качественная речь, на слух воспринимается до скорости 1.3-1.4х)
2) James Coplien - The DCI Architecture: Supporting the Agile Agenda (качественная речь, до 1.6х скорости воспринимается)
Пару-тройку недель назад попалась ссылка на интересный подход к проектированию называющийся DCI, сформулированный создателем MVC.
В кратце его можно передать так: все, что сейчас разрабатывается не ООП, а Class Orientied Programming.
И на самом деле должно быть разделение не на объекты, которые умеют как-то менять свое состояние, а на данные + роли, т.е. то, как разные классы данных взаимодействуют.
Ведь в сущности объект человек это набор ролей: отец, брат, продавец, муж и т.д.
Описание
Во время выполнения программы или любого алгоритма 1 объект может выступать в разных ролях и попытка впихнуть весь этот функционал в класс приводит к жуткой мешанине кода, тесной связность и вообще страданиям, страху и ужасу).
Вместо этого классы доменной логики, сами по себе должны быть эдакими "тупыми" объектами.
Например, объект Банковский Счет должен знать, что у него есть баланс, и он может его повышать и понижать, но только в рамках определенной роли и определенного контекста, к нему добавляется логика, например
1)возможность или невозможность залезть в долг при выдаче наличных,
2)возможность перевода денег на другой счет, при наличии достаточного количества на счету
3)возможность оплатить деньги всем кредиторам.
Все 3 предыдущих пункта - роли, играемые данным счетом в определенном контексте, и например во 2м варианте , этот же счет может играть роль "принимающего" счета.
Фактически любая программная система это динамический набор объектов, которые принимают то одну то другую роль за время своей жизни в рантайме и концпеции типа MVC, позволяют через сеть слоев соединить ментальную модель пользователя с настоящей vjltkm. работы системы.
Но во время разработки программист работает, с ментальной моделью статичной программы, в которой есть классы А И Б, которые умеют действий В и Г, а не с динамической моделью, что вот в этом месте класс А впитывает в себя роль принимающего счета, или брата, или чего-либо еще.
Подход к разработке с использованием парадигм DCI, пытается смягчить "impedance mismatch" (как это по русски-то называется ?)) между моделью системы в работе(runtime), и моделью ее во время разработки(compiletime), что должно послужить повышению читаемости, понятности и предсказуемости поведения программ.
Итого
Чем-то этот подход и сама идея незримо напоминает AOP (который слишком сложен и неудобен и потому не получил особого распространения) и очень даже напоминает идеи mixin-нов, trait-ов и соответственно аспектов (которые мало-помалу вкрадываются во все новомодные языки и предают им синтаксической и концептуальной силы).
С одной стороны вроде получается боян, по причине "вот же оно - уже было".
С другой стороны если посмотреть, как обычно о них рассказывают, то нет именно этого акцента на участие роли в определенном контексте взаимодействия, и отсутствие четких стратегий смешивания этих самых миксинов и ролей.
В общем-то видно, что интуитивно идея постепенно просачивается в программерское сообщество с тенденциями типа DDD, mixin`ов и trait`ов, но возможно с другим именем, и пока только кусками.
Источники
Тексты/Статьи:
1)http://en.wikipedia.org/wiki/Data,_Context_and_Interaction - статья в википедии
2)http://heim.ifi.uio.no/~trygver/themes/babyide/baby-documents.html - набор ссылок от автора
3)гугл =)
1) http://oredev.org/videos/dci-in-practice(качественная речь, на слух воспринимается до скорости 1.3-1.4х)
2) James Coplien - The DCI Architecture: Supporting the Agile Agenda (качественная речь, до 1.6х скорости воспринимается)
3) Trygve Reenskaug - DCI: Re-thinking the foundations of object orientation and of programming
(у него жуткий акцент, очень сложно воспринимаемое на слух видео)
(у него жуткий акцент, очень сложно воспринимаемое на слух видео)