Jak uniknąć powielania struktur danych, gdy części aplikacji są napisane w różnych językach?

12

Jako przykład powiedz, że piszesz aplikację w Javie .

Twoja aplikacja komunikuje się z serwerem API napisanym w języku Python .

Serwer Python komunikuje się z bazą danych SQL .

Masz także stronę internetową dla swojej aplikacji napisaną w JavaScript .

Dzięki 4 różnym językom łatwo jest powtarzać zasadniczo te same struktury danych 4 razy.

Na przykład Usertyp może wyglądać tak (pseudokod):

type User {
  integer id;
  string name;
  timestamp birthday;
}

Każda część projektu wymagałaby pewnego rodzaju reprezentacji User. Części Java i Python wymagałyby dwóch różnych classdeklaracji. Baza danych potrzebowałaby Userdeklaracji tabeli. Strona frontonu również musiałaby reprezentować User.

Powtarzanie tego typu 4 razy naprawdę łamie zasadę „ Nie powtarzaj się ”. Istnieje również problem polegający na tym, że jeśli Usertyp zostanie zmieniony, zmiany te należy powtórzyć w każdej innej części projektu.

Wiem, że biblioteka protobuf firmy Google oferuje rodzaj rozwiązania tego problemu, w którym piszesz strukturę danych przy użyciu specjalnej składni, a następnie biblioteka generuje dla ciebie deklarację struktury w wielu różnych językach programowania. Ale to wciąż nie rozwiązuje problemu powtarzania logiki sprawdzania poprawności dla twoich typów.

Czy ktoś ma jakieś sugestie lub linki do książek / postów na blogu na ten temat?

Normangorman
źródło
To jeden z powodów, dla których wielu ludzi przeniosło cały swój rozwój na JavaScript. Działa na kliencie (internet, jonowy dla urządzeń mobilnych, elektron dla komputerów stacjonarnych), serwer (węzeł), baza danych (MongoDB).
Paul,
3
Można współużytkować te same struktury danych, jeśli zaplecze i interfejs użytkownika używają tego samego języka. Nie powtarzasz się, jeśli używasz różnych baz kodu. Użyj narzędzi do generowania klas ze schematów xml lub ciągów Json z różnych platform programistycznych.
Jon Raynor,
5
Repeating this type 4 different times really breaks the Don't-Repeat-Yourself principle. Nie, nie ma. Masz 4 różne systemy, które robią różne rzeczy. Za daleko bierzesz SUCHO. Z mojego doświadczenia wynika, że ​​rodzaj ponownego użycia, który chcesz zrobić, jest zalążkiem zła, ponieważ wprowadza ścisłe połączenie. To nawet gorsze niż powtarzanie User4 razy w 4 różnych językach. W środowiskach rozproszonych problem stanowi sprzężenie. DRY nie jest.
Laiv
Nie masz czasu na odpowiedź: w zależności od potrzeb możesz spróbować sformułować zasady walidacji przy użyciu np. OWL (zbuduj ontologię). Reguły walidacji stają się następnie „danymi”, które można wykorzystać w niezbędnych punktach. Zmianę zasad można następnie wykonać w jednym centralnym miejscu.
Daniel Jour

Odpowiedzi:

12

Ty nie. A tak naprawdę nie powinieneś.

Jeśli myślisz o aplikacji, serwerze i witrynie jako osobnych kontekstach, wtedy sensowne jest tworzenie zduplikowanych struktur. Powody, dla których może to być dobra rzecz:

  • Struktury są podobne, ale nie takie same. Nawet jeśli 90% struktury jest takie samo we wszystkich kontekstach. To 10%, które dadzą Ci ogromne bóle głowy.
  • Wzory i implementacje mogą się różnić. Kiedy używane są różne języki i frameworki, zbyt trudno jest mieć taką samą implementację we wszystkich z nich
  • Współużytkowane struktury stają się zależnością, którą należy zarządzać. Posiadanie współzależności znacznie komplikuje rozwój, ponieważ zmiana, która jest wielka w jednym kontekście, jest fatalna w innym. Trzeba więc wiele wysiłku, aby skoordynować rozwój tej wspólnej zależności
  • Różne konteksty mają różne wdrożenia. Nawet jeśli uda ci się współużytkować te same struktury danych i ten sam kod sprawdzania poprawności we wszystkich kontekstach, może się zdarzyć, że nowa wersja jednego kontekstu zostanie wdrożona, podczas gdy inne są w starej wersji, więc sytuacje, w których występuje desynchronizacja w wersjach, nadal muszą być skierowana

Chociaż zasada DRY jest niesamowita, myślę, że udostępnianie struktur danych między kontekstami lub warstwami stwarza więcej problemów niż rozwiązuje. Zwłaszcza jeśli projekt rośnie na tyle, że różni ludzie pracują w różnych kontekstach.

Euforyk
źródło
5

Myślę, że @Euphoric wymienia kilka dobrych powodów, aby nie powielać twojego kodu. Jeśli jednak musisz to zrobić, zaleciłbym użycie generowania kodu.

Znajdź kanoniczną formę danych

Aby to zrobić skutecznie, musisz najpierw odkryć, jaka jest kanoniczna forma danych. Czy to Twój schemat SQL lub klasy w programie Java?

Wyprowadzaj z niego (automatycznie) inne formularze

Następnie opracuj sposób generowania wszystkich innych form z kanonicznej. Na przykład, zakładając, że twoją kanoniczną formą jest schemat SQL, możesz z tego łatwo wygenerować kod JavaScript, Java i Python (SQL jest łatwo analizowany i jest dobrym kandydatem na źródło kanoniczne).

Uwzględnij różnice

Sekcje generowanego kodu powinny być łatwe do oznaczenia jako „nie dotykaj” - w ten sposób można uwzględnić wymagane różnice między wszystkimi różnymi reprezentacjami (na przykład: niestandardowy kod napisany dla interfejsu użytkownika JS i zaplecza Java), które muszą być zachowane podczas regeneracji.
Weź przykład z Git; kiedy otwiera edytor aby wpisać wiadomość commit plik zawiera już jakiś tekst, ale ma # -------- >8 --------znacznik, aby wiedzieć, gdzie swoje treści końce, a gdzie jej zaczyna automatycznie generowany tekst.

Mimo to, jeśli możesz - unikaj takiego powielania. Jest to PITA, nawet jeśli większość kodu jest generowana automatycznie.


Ta odpowiedź to trochę opowieści zamiast „oto kilka najlepszych praktyk” - to, co opisałem, jest dokładnie tym, co kiedyś zrobiłem, gdy miałem taki sam problem jak Ty i potrzebowałem, aby te same dane były reprezentowane w różnych częściach systemu (a raczej w dwóch różnych systemach).

Mael
źródło