Co to jest DCI i jak może pasować do szyn?

Niedawna debata ze współpracownikiem na temat różnych podejść do projektowania i kodowania modeli w aplikacji Rails doprowadziła mnie do DCI w kontekście Rails.

Jednak po prostu nie mogę ogarnąć całej tej koncepcji, nawet po przejrzeniu tej przykładowej aplikacji .

Obecnie mam tendencję do mniej więcej "według książki" podczas pisania aplikacji Rails.

Więc jest kilka rzeczy, o które chciałbym zapytać --

  • czym jest DCI i jakie są jego zalety przy implementacji obok MVC nad zwykłym starym MVC (i vanilla ActiveRecord w Rails) ?
  • i jak można to zaimplementować w Rails (lub innymi słowy, o co chodzi ze wszystkimi modułami) ?

Edit

Chciałbym jeszcze bardziej rozszerzyć moje pytanie w kontekście RoR - czy zalecany jest kolejny poziom abstrakcji między modelami a kontrolerami w Rails? Jak szeroko rozpowszechniony jest w aplikacje w różnej skali?

Author: GeReV, 2012-03-13

4 answers

DCI to paradygmat, a więc znacznie więcej niż sposób projektowania aplikacji. To sposób myślenia o modelowaniu i strukturyzowaniu kodu. Jedną z ważnych części DCI jest oddzielenie tego, czym jest system (model domeny) i co robi system (funkcjonalność). DCI nie jest innym podejściem do rozwiązania tego samego problemu co MVC, więc na twoje pierwsze pytanie nie można naprawdę odpowiedzieć. Możesz używać MVC i DCI jednocześnie, co nie jest przypadkiem, ponieważ Trygve Renskaug jest ojcem zarówno MVC, jak i DCI. Ostatnio odpowiedział na podobne pytanie do tego na grupie google 'object-composition'.

Przykład, do którego podlinkowałeś, narusza niektóre z podstawowych pomysłów, takich jak utrzymywanie ról prywatnych w kontekstach i nie mogłem znaleźć ani jednego kontekstu, ale może to wynikać z poświęcenia tylko krótkiego czasu na przeglądanie kodu.

Nie znam się na ROR, więc nie mogę podać przykładu RoR, ale jeśli przejdziesz dofullOO znajdziesz przykłady napisane w różne języki, w tym Ruby i Marvin pierwszy język zaprojektowany dla DCI.

EDIT nie ma prostej odpowiedzi na pytanie "Czym jest DCI" DCI jest paradygmatem, tak jak OOP jest paradygmatem. Obie mają te same korzenie i odpowiedź na powyższe pytanie jest równie skomplikowana jak odpowiedź "czym jest programowanie zorientowane obiektowo". Sprawy są jeszcze bardziej skomplikowane przez fakt, że DCI jest zorientowany obiektowo, a OOP we wszystkich głównych językach OO jest w rzeczywistości zorientowany klasowo i nie zorientowane obiektowo. DCI ma na celu wytworzenie kodu, w którym interakcja pomiędzy obiektami w czasie uruchamiania jest widoczna w kodzie w czasie kompilacji i w ogólniejszym ujęciu stara się łatwiej uzasadnić zachowanie czasu uruchamiania z odczytu kodu. Strona , do której podlinkowałem powyżej, poświęcona jest wyjaśnieniu, o co chodzi w DCI, a także wymienia przykłady w wielu językach. Ruby jest jednym z nich

EDIT jest książka o ruby i NADKOMISARZU na jej sposób. Autor jest dość aktywny na temat kompozycji obiektów i insightfull

 19
Author: Rune FS,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-09 19:10:19

Dla ludzi, którzy zastanawiają się, co oznacza DCI..

DCI oznacza Data Context Interaction

 13
Author: Giri,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-09 01:23:55

Sercem DCI są narzędzia poznawcze, które dostarcza programiście. Nie jestem pewien, czy widziałeś wszystkie wspaniałe wykłady Jamesa Copliena/Trygve Reenskauga , ale postaram się opisać sedno tego dla każdego, kto jest nowy w pojęciach. Chodzi o przeniesienie zachowania systemu z obiektów domeny interakcji systemów (jednostki danych, lub co system jest), a do obiektów zachowania (co System robi) jako obywatele pierwszej klasy, które pośredniczą w współpracy między obiektami przez wprowadzenie ich funkcjonalności w kontekście przypadków użycia just-In-time.

Myśl BDD. Kodujemy zachowanie nie w wielu obiektach, takich jak cząstki funkcjonalności rozłożone na wszystkich naszych obiektach danych, które są wysoce sprzężone z warstwą trwałości, ale w spójnych obiektach, które istnieją wyłącznie dla przypadku użycia(historia), i które wstrzykują możliwości i koordynują interakcje tych głupich obiektów danych. Jak zwykłe warstwy fizycznej architektury, powoli zmieniające się dane obiekty nie są ładowane z szybko zmieniającą się implementacją funkcji, którą noszą cały czas. Zamiast tego, Ruby zapewnia nam możliwość łatwego wprowadzania zachowania do obiektów w czasie wykonywania, gdy / jeśli jest to potrzebne tylko w kontekście przypadku użycia.

Jako przykład w ROR, jeśli masz akcję kontrolera zaangażowaną w przypadek użycia, w którym istnieje macierz prawdopodobieństwa zdarzenia, w której większość wpisów może być wyzwalana tylko w niewielkim odsetku żądań, to utworzenie sieci z nadęte zachowanie-ciężkie obiekty z wiedzą, aby wykonać każde zdarzenie dla każdego możliwego przypadku użycia danych jest niepotrzebne. Ponadto, brak konieczności przekopywania się przez pliki 18 w edytorze tekstu, aby zrozumieć, jak działa ta interakcja, a także posiadanie całej logiki czysto abstrakcyjnej do wzorców w interfejsie dostarczanym przez obiekt context jest również zdecydowanym plusem.

Jeśli chodzi o twoje pytanie o "inną" warstwę abstrakcji między kontrolerami a Modelami w railach, nie jestem pewien, które Inne do którego się odnosisz. Niezależnie Od Tego, Tak. Oczywiście. Nie ma sprawy. wzorce projektowe i solidne zasady Uncle Bobs' są ogólnie przyjętymi najlepszymi praktykami w projektowaniu OO. Obie te kwestie zdecydowanie zachęcają do luźnego powiązania abstrakcji między polityką a wdrażaniem. Oba pomagają uniknąć katostroficznych wysypisk mózgów o rozmiarach niszczących Imperium Rzymskie, ponieważ zapewniają wspólne ramy, które wszyscy rozumieją. DCI, dla mnie, zapewnia ten sam rodzaj poznawczych framework, ale dla ułatwienia zrozumienia systemu i skutecznego radzenia sobie z nim, i to jest Święty Graal dla każdego projektanta zorientowanego obiektowo.

 8
Author: Eric Steen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-12 04:21:35

Jest książka (obecnie w toku) o używaniu DCI w Ruby/Rails: Clean Ruby. Gorąco polecam umieszczenie się na liście powiadomień-przeczytałem fragmenty tej książki i wygląda naprawdę dobrze.

DCI zyskuje akceptację w świecie Rails - w ciągu ostatnich 3 miesięcy pojawiło się na nim wiele ciekawych wpisów na blogu.

 5
Author: RyanWilcox,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-14 15:45:13