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 User
typ 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 class
deklaracji. Baza danych potrzebowałaby User
deklaracji 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 User
typ 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?
źródło
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ż powtarzanieUser
4 razy w 4 różnych językach. W środowiskach rozproszonych problem stanowi sprzężenie. DRY nie jest.Odpowiedzi:
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:
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.
źródło
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).
źródło