W jakim stopniu architektura oprogramowania zależy od języka?

14

Ucząc się o architekturze oprogramowania i wzorcach projektowych zauważyłem, że w większości przypadków wyjaśniono niektóre cechy języka i specyfikę projektu.

Np. Praktycznie każdy artykuł lub książka na ten temat zilustruje pomysły za pomocą klas i interfejsów. Wszystko, co można łatwo znaleźć na ten temat, wspomina o obiektach i koncepcjach OOP.

Co jeśli język, w którym napisany jest system, w ogóle nie ma takich pojęć? Np. Co się stanie, jeśli użyję języka Python lub węzła, które są dynamicznie wpisywane i nie mają pojęcia interfejsu? Co się stanie, jeśli użyję TypeScript, gdy interfejs jest efemeryczną konstrukcją, która nie istnieje w środowisku wykonawczym? Co jeśli próbuję objąć programowanie funkcjonalne? Czy powinienem zignorować np. SOLID i poszukać innych pojęć odpowiednich dla mojego języka?

Jeśli tak, jakie to są? Niestety wszystkie dobrze przyjęte paradygmaty (o ile mi wiadomo) w pewien sposób odnoszą się do pojęć i typów OOP. Jeśli nie, jakie zasady powinienem stosować, dostosowując ogólne zasady architektury i projektowania do mojego konkretnego języka i przypadku użycia?

Jak ogólnie opisałbyś zależność między architekturą a językiem?

Tristan Tzara
źródło
Napisałem artykuł o architekturze oprogramowania: Zarządzanie złożonością oprogramowania linkedin.com/pulse/…
overexchange
Po pierwsze, tak, architektura oprogramowania jest oparta na technologii, którą masz na myśli. Na przykład: python nie wykorzystuje wielowątkowości, dopóki te wątki nie zostaną powiązane we / wy. Jest to prawdziwe ograniczenie w stosowaniu operacji związanych z wielordzeniowymi procesorami. Po drugie, powinieneś posłuchać tego ... youtu.be/FF-tKLISfPE Po trzecie, powinieneś przeanalizować / pracować nad istniejącymi stabilnymi rozproszonymi produktami korporacyjnymi określonej domeny, które są wdrażane skalowalnie, przez co najmniej 5-6 lat. Jest to organiczne zrozumienie wpływu technologii na projektowanie. Btw..Takie produkty zostały napisane w świecie przed javą, od zera.
nadmierna wymiana
Technologia Wrt ... W świecie Java, aż projekt języka java 5/6/7 był pod kontrolą rzeczywistych założycieli. Od wersji java 8 uważam java za maszynę propagandową, ale nie jako język programowania. Moim zdaniem Java stała się technologią kierownika projektu. Jako początkujący analizowałem / pracowałem nad produktem napisanym przy użyciu C / C ++ / Python
overexchange
Proszę nie używać słowa architektura w swoim pytaniu, jest to mylące. Twoje pytanie dotyczy projektu. Wybór języka zwykle kwalifikuje się jako architektura, twoje pytanie nie ma sensu, jak zostało sformułowane ..
Martin Maat
Również Python i JavaScript nie posiada interfejsy, oni po prostu nie używać osobnego słowa kluczowego je wyznaczają
Caleth

Odpowiedzi:

11

Architektura oprogramowania jest bardzo podobna do architektury domu lub mostu. Most musi utrzymywać ciężar samego siebie i przejeżdżających przez niego pojazdów lub przechodzących przez niego ludzi. Musi wytrzymać pogodę. Materiały użyte do jego zbudowania muszą być zarówno mocne, jak i stosunkowo lekkie.

Istnieje wiele materiałów, których można użyć do budowy domu. Możesz użyć cegły lub sztukaterii. Możesz użyć belek drewnianych lub metalowych. Każdy materiał ma swoje własne cechy pod względem masy, wytrzymałości i tak dalej. Wszystkie te cechy wpływają na architekturę.

W ten sam sposób używany język programowania wpływa na sposób budowania architektury. Twoja architektura będzie wyglądać inaczej w języku programowania, który ma klasy takie jak C ++, niż w języku programowania, który nie ma, podobnie jak C.

Zasady SOLID dotyczą głównie języków obiektowych (tj. Języków posiadających klasy).

Robert Harvey
źródło
4

Architektura zależy od możliwości osiągnięcia jej celów. Wybór języka może ograniczyć możliwości. Każdy kompletny język Turinga ma możliwość wykonania dowolnego zadania programistycznego. Po tym punkcie chodzi o to, jak czytelny dla człowieka język pozwala na rozwiązanie.

Wiele schematów architektury oprogramowania wymaga usunięcia całej wiedzy na temat wyboru technologii z podstawowych reguł biznesowych domeny. Jedynym technicznym wyborem, którego nigdy nie możesz usunąć z rdzenia, jest język, w którym chcesz go wyrazić.

Kiedy książki o architekturze trzymają się informacji o swoich celach, język nie ma znaczenia, o ile jest w stanie osiągnąć cel. Kiedy w książkach dowiesz się, jak osiągnąć te cele, język zacznie mieć znaczenie.

candied_orange
źródło
Ładne punkty w twojej odpowiedzi, ale jestem pewien, że historycznie architektura oprogramowania była wdrażana z trendami TECHNOLOGII.
nadmierna wymiana
@overexchange celem dobrej architektury jest tworzenie oprogramowania, które przetrwa obecny trend, będąc gotowym na następny.
candied_orange
Architekty produktów, przynajmniej w świecie oprogramowania pośredniego, nie były w stanie myśleć poza RPC / RMI / CORBA aż do lat 90. Widziałem klasyczne projekty oparte na wywołaniach remore zorientowanych na procedury. Następnie ServiceOArch zmienił trend oprogramowania pośredniego pod względem architektury.
nadmierna wymiana
2
@CandiedOrange to teoria. W praktyce widziałem wielu ludzi, którzy robią coś, co czasem nazywa się „rozwojem napędzanym szumem” - po prostu rób to, o czym mówi ich obecny krąg rówieśników w czasie projektowania, abyś mógł wziąć udział w tej rozmowie.
marstato
@marstato Zgoda. Najlepszym przykładem jest wykorzystanie Spring / Springboot w obecnym trendzie do każdego nowego projektu, nie wiedząc, dlaczego?
nadmierna wymiana
1

Architektura jako termin ma bardzo konkretne znaczenie, które jest bardzo związane z architekturą w świecie fizycznym, a jej sednem jest sztuka i praktyka budowania rzeczy, to, jak rzeczy są tworzone i składane. Biorąc to pod uwagę, gdy architektura jest dobrze wykonana, myślę, że język jest ściśle powiązany z architekturą, podobnie jak dobrze zaprojektowany budynek powinien być ściśle poinformowany przez materiał, z którego jest zbudowany.

W oprogramowaniu wybory architektoniczne powinny być dokonywane w sposób zgodny z właściwościami języka. Jeśli budujesz system z językiem zorientowanym obiektowo, to spodziewałbym się, że architektura systemu również będzie zorientowana obiektowo. Jeśli budujesz system z funkcjonalnym językiem, oczekiwałbym, że architektura tego systemu również będzie funkcjonalna.

Ma sens?

RibaldEddie
źródło
Dzięki za twoją odpowiedź! czy przypadkiem znasz jakieś zasoby, opracowujące architekturę oprogramowania w odniesieniu do dynamicznie typowanych lub funkcjonalnych języków? tbh wszystko, co widziałem, działa na przykład w Javie od razu po wyjęciu z pudełka, ale wymagałoby pewnej adaptacji do np. js. jakie są możliwe wytyczne, aby dostosować wspólne wzorce architektury do słabo typowanego języka? czy w ogóle należy tego spróbować, czy też powinno być zupełnie inaczej?
Tristan Tzara,
martwiłem się, że jeśli ktoś używa np. Javy, istnieje wiele najlepszych praktyk i wzorców dla architektury, ale nie widziałem żadnego dla języków innego rodzaju. zastanawiałem się więc, jak je traktować
Tristan Tzara,
w zasadzie, czy np. SOLID nadal obowiązuje w takim przypadku? jak można to dostosować, jeśli tak? co należy zrobić, jeśli nie?
Tristan Tzara,
Zasady SOLID są bardzo zorientowane obiektowo. Myślę jednak, że kodują zasady wyższego rzędu, które mogą mieć zastosowanie do dowolnego systemu oprogramowania, niezależnie od języka. Ale podstawowe zasady są dokładnie takie: powinieneś je poznać i zrozumieć, zanim zbudujesz znacznie poza karmnikiem dla ptaków.
RibaldEddie
@TristanTzara Programowanie obiektowe zostało wynalezione przed i bez języka obiektowego. Możesz to zrobić w dowolnym języku ogólnego przeznaczenia. Nawet te, które nie mają zajęć.
candied_orange
1

Na początek powiedziałbym, że nawet język, w którym myślisz, ma głęboki wpływ na to, co możesz sobie wyobrazić. Jest powód, dla którego PASCAL został stworzony przez Niklausa Wirtha, a C przez Briana Kernighana i Dennisa Ritchie.

Na wyższym poziomie umiejętność wyrażania pewnych pojęć (i brak innych) skieruje twoją myśl i sprawi, że dojdziesz do pewnych rozwiązań, które niekoniecznie byłyby tą samą inną osobą, z innym pochodzeniem, wymyślone.

Wreszcie, wszystkie wspomniane pojęcia można zaimplementować w dowolnym języku ogólnego przeznaczenia. Tyle, że mogą nie mieć wsparcia składniowego, a implementacja może być uciążliwa. Możesz napisać zorientowany obiektowo kod asemblera x86, jeśli jesteś wystarczająco zaangażowany (lub wystarczająco szalony), tak jak możesz to zrobić w C. W rzeczywistości, pierwsze implementacje C ++ były preprocesorami, które skompilowały Twój kod C ++ w C (i zniekształcone nazwy symboli zostały wykonane debugowanie o wiele więcej zabawy).

wariat
źródło