Edytować:
Aby uniknąć dalszych nieporozumień: nie mówię o usługach internetowych i tym podobnych. Mówię o wewnętrznej strukturze aplikacji, nie chodzi o to, jak komputery się komunikują. Chodzi o języki programowania, kompilatory i sposób rozszerzenia paradygmatu programowania imperatywnego.
Oryginalny:
W dziedzinie programowania imperatywnego w ciągu ostatnich 20 lat (lub więcej) widzieliśmy dwa paradygmaty: obiektowy (OO) i zorientowany na usługi (SO) aka. oparty na komponentach (CB).
Oba paradygmaty rozszerzają paradygmat programowania imperatywnego, wprowadzając własne pojęcie modułów. OO nazywa je obiektami (i klasami) i pozwala im łączyć zarówno dane (pola), jak i procedury (metody) razem. SO odróżnia natomiast dane (rekordy, komponenty, ...) od kodu (komponenty, usługi).
Jednak tylko OO ma języki programowania, które natywnie obsługują jego paradygmat: Smalltalk, C ++, Java i wszystkie inne kompatybilne z JVM, C # i wszystkie inne kompatybilne z .NET, Python itp.
SO nie ma takiego języka ojczystego. Występuje tylko w językach proceduralnych lub językach OO: COM / DCOM (binarny, C, C ++), CORBA, EJB, Spring, Guice (wszystkie Java), ...
Te frameworki SO wyraźnie cierpią z powodu braku obsługi ich rodzimych języków.
- Zaczynają używać klas OO do reprezentowania usług i rekordów. Prowadzi to do projektów, w których istnieje wyraźne rozróżnienie między klasami, które mają tylko metody (usługi), a tymi, które mają tylko pola (rekordy). Dziedziczenie między usługami lub rekordami jest następnie symulowane przez dziedziczenie klas. Technicznie rzecz biorąc, nie jest tak ściśle przestrzegany, ale ogólnie programiści powinni tworzyć klasy, aby grały tylko jedną z dwóch ról.
- Używają dodatkowych, zewnętrznych języków do reprezentowania brakujących części: IDL, konfiguracje XML, Adnotacje w kodzie Java, a nawet osadzone DSL jak w Guice. Jest to szczególnie potrzebne, ale nie tylko, ponieważ skład usług nie jest częścią samego kodu usługi. W OO obiekty tworzą inne obiekty, więc nie ma potrzeby takich udogodnień, ale w przypadku SO istnieje to, że usługi nie tworzą ani nie konfigurują innych usług.
- Ustanawiają efekt wewnętrznej platformy na szczycie OO (wczesny EJB, CORBA), w którym programista musi napisać cały kod potrzebny do „sterowania” SO. Klasy stanowią tylko część charakteru usługi, a wiele klas musi być napisanych, aby razem utworzyć usługę. Cała ta płyta kotła jest konieczna, ponieważ nie ma kompilatora SO, który zrobiłby to dla programisty. To jest tak, jak niektórzy ludzie robili to w C dla OO, gdy nie było C ++. Po prostu przekazujesz rekord, który przechowuje dane obiektu jako pierwszy parametr do procedury, która jest metodą. W języku OO parametr ten jest niejawny, a kompilator generuje cały kod, który jest nam potrzebny do funkcji wirtualnych itp. W przypadku SO wyraźnie go brakuje.
- Szczególnie nowsze frameworki intensywnie wykorzystują AOP lub introspekcję, aby dodać brakujące części do języka OO. Nie zapewnia to niezbędnej ekspresji językowej, ale pozwala uniknąć kodu platformy kotła opisanego w poprzednim punkcie.
- Niektóre frameworki używają generowania kodu do generowania kodu płyty kotła. Źródłem informacji są pliki konfiguracyjne w formacie XML lub adnotacje w kodzie OO.
Nie wszystkie zjawiska, o których wspomniałem powyżej, można przypisać SO, ale mam nadzieję, że wyraźnie pokazuje, że istnieje potrzeba języka SO. Skoro ten paradygmat jest tak popularny: dlaczego go nie ma? A może są takie akademickie, ale przynajmniej branża ich nie używa.