Zalety klasycznego OOP w porównaniu z językiem Go-like

13

Dużo myślałem o projektowaniu języka i o tym, jakie elementy byłyby konieczne dla „idealnego” języka programowania, a studiowanie Google Go skłoniło mnie do zakwestionowania wielu powszechnie znanej wiedzy.

W szczególności Go wydaje się mieć wszystkie interesujące korzyści z programowania obiektowego bez faktycznej struktury języka zorientowanego obiektowo. Nie ma klas, tylko struktury; nie ma dziedziczenia klas / struktur - tylko osadzanie struktur. Nie ma żadnych hierarchii, żadnych klas nadrzędnych, żadnych jawnych implementacji interfejsu. Zamiast tego reguły rzutowania oparte są na luźnym systemie podobnym do pisania kaczego, tak że jeśli struct implementuje niezbędne elementy „Czytnika” lub „Żądania” lub „Kodowania”, możesz go rzutować i używać jak jeden.

Czy jest coś w OOP zaimplementowanym w C ++ oraz Javie i C #, które jest z natury bardziej wydajne, łatwiejsze w utrzymaniu, w jakiś sposób potężniejsze, z którego musisz zrezygnować, przechodząc do języka takiego jak Go? Jakie korzyści musisz poświęcić, aby zyskać prostotę, jaką reprezentuje ten nowy paradygmat?

EDYCJA
Usunięto „przestarzałe” pytanie, na które czytelnicy wydawali się nadmiernie rozłączać i rozwścieczać.

Pytanie brzmi: co ma do zaoferowania tradycyjny paradygmat obiektowy (z hierarchiami itp.), Który często występuje w implementacjach języka wspólnego, czego nie da się zrobić tak łatwo w tym prostszym modelu? Innymi słowy, czy gdybyś dzisiaj zaprojektował język, czy istnieje powód, dla którego chciałbyś uwzględnić koncepcję hierarchii klas?

tylerl
źródło
1
Czy OOP sprawiło, że programowanie proceduralne stało się przestarzałe? Nienawidzę brzmieć pedantycznie lub że mówię do ciebie, ale to było pierwsze zdanie, które przyszło mi do głowy. Go zapewnia nowy (ish) paradygmat. Dzięki eksperymentom użytkownicy dowiedzą się, w czym jest dobry, a w czym nie jest dobry (jak we wszystkich paradygmatach i językach), a my otrzymamy setki świetnych produktów (wraz z uczciwym udziałem złych produktów) napisanych w Go . Przynajmniej taka jest moja opinia
Jamie Taylor,
1
Istnieje kilka interesujących odczytów, gdy Google dla OOP nie żyje . Polecam sieć umrze, gdy umrze OOP
Andomar,
OOP ma tak niewielką wartość, że nie warto marnować czasu.
SK-logic
1
Zgadzam się z poprzednim komentarzem, nie koncentrujcie się zbytnio na OOP. Poza tym OOP nie oznacza C ++ ani Java. Spróbuj przeczytać abit na ltu.org
AndreasScheinert
C ++, Java i C # nie są „klasycznymi” językami OOP. Jeśli istnieje klasyczny język OOP, myślę, że jest to Smalltalk.
kevin cline

Odpowiedzi:

16

Nie ma nowego paradygmatu. Orientacja obiektowa to wzorzec używany do pisania programów, który nie jest nawet jasno zdefiniowany. Różne języki zapewniają różne cechy typowe dla orientacji obiektowej (definiowanie nowych typów, enkapsulacja, hierarchie typów, polimorfizm, przekazywanie wiadomości i inne), ale mogą nie zapewniać innych. W takich przypadkach programiści muszą je naśladować, jeśli zajdzie taka potrzeba.

Wiele języków udostępniających te funkcje nie ma odpowiednika koncepcji klas - na przykład Javascript i Common Lisp. Implementacja zapewniana przez języki podobne do Java (oparte na klasach, z pojedynczym dziedziczeniem, interfejsami, wysyłką opartą na typach) jest tylko jedną z możliwości i niekoniecznie najlepszą.

Andrea
źródło
11
+1 za „niekoniecznie najlepszy”. Powołując się na Alana Kay: „Wynalazłem pojęcie obiektowe i mogę powiedzieć, że nie miałem na myśli C ++”. (ani nie miał C # i / lub Java, zgaduję, że pokornie)
herby
1
@herby Widziałem, jak sugeruje to, że systemy agentów (podobne do działania Erlanga) są bliższe ostatecznemu zamiarowi Alana Kaya dla OOP.
CodexArcanum
2
Eee, Common Lisp zdecydowanie ma zajęcia. Ale zazwyczaj klasa CL zawiera dane, a metody są definiowane w „funkcjach ogólnych”. Jako efekt uboczny daje wygodny sposób przeprowadzania wielokrotnej wysyłki, ponieważ metody nie są już ściśle powiązane z „pojedynczą klasą implementacji”.
Vatine
Tak, miałem na myśli to, że nie ma klas w sensie Java
Andrea,
5

Jakie korzyści musisz poświęcić, aby zyskać prostotę, jaką reprezentuje ten nowy paradygmat?

Sprawdzanie typu dla strukturalnego systemu typów jest o wiele bardziej skomplikowane niż zwykłe sprawdzenie, czy klasa podstawowa znajduje się na liście dziedziczenia. Wysyłanie wirtualne staje się nieco trudniejsze i prawdopodobnie mniej wydajne.

Czy taki system zdezaktualizował koncepcję OOP?

Nie. Tak długo, jak możesz stworzyć program w kategoriach „obiektów, które wykonują czynności”, a nie listy instrukcji, zadeklarowanego zestawu reguł lub kaskadowej serii funkcji ... implementacja nie ma znaczenia. Podobnie zmiana systemu typów nie unieważnia żadnej z powszechnych zasad OO.

Nadal możesz pracować na typie podstawowym i nie przejmować się jego rzeczywistym typem. Nadal możesz rozszerzać typy bez ich modyfikowania. Nadal możesz sprawić, że typ zrobi tylko jedną rzecz. Nadal możesz dostarczać drobnoziarniste interfejsy. Nadal możesz dostarczać abstrakcje swoim typom.

To, jak pozwala język, nie ma tak naprawdę znaczenia.

Telastyn
źródło
W rzeczywistości, Go sprawia, że wszystkie te rzeczy OOP łatwiejsze i dodaje kilka dodatkowych możliwości jak rozszerzenie typu dostarczenie nowego interfejsu stosowania istniejących instancji (tak długo, jak nie trzeba nowych członków danych, oczywiście).
Jan Hudec
4

Myślę, że twój pomysł na OOP jest trochę niepoprawny:

Wymyśliłem termin „Programowanie obiektowe” i to {Java i C ++} nie jest tym, o czym myślałem.
- Alan Kay .

Wybór typowania (nominalne podtypy, strukturalne lub kaczych - lub ich kombinacja) jest w dużej mierze ortogonalny w stosunku do OOP. Dziedziczenie i klasy są całkowicie ortogonalne względem OOP. Jeśli poświęcisz trochę czasu na grę z io , zobaczysz to.

Teraz możesz zapytać, które systemy typów są „lepsze”, a jakie są sposoby ponownego użycia i kombinacji kodów. I spróbuj określić zalety i wady między wyborami dokonanymi w Simula (i później w C ++, Java i C #) a tymi dokonanymi w Go. Ale to są różne i odrębne pytania.

Ostatecznie OOP jest bardzo niejasną koncepcją i wszystkie próby jego wdrożenia mają różnorodne smaki. Ale żeby naprawdę uprościć, powiedziałbym, że podstawową ideą OOP jest komponowanie systemów podsystemów SOLID . Teraz to absolutnie zaciera linię dla innych paradygmatów, ale spekuluję, że to jest powód, dla którego języki wieloparadygmowe ostatnio zyskały na popularności i dlaczego Google podjęło własną próbę w tym przypadku dzięki Go.

back2dos
źródło
2
Pytanie dotyczy pojęć, niekoniecznie tego terminu. Jeśli możesz wymyślić lepszą nazwę niż „OOP”, aby odwoływać się do koncepcji hierarchii klas i wszystkich związanych z tym przycinania, możemy użyć tego zamiast tego.
tylerl
@tylerl: Mylisz co najmniej dwa pytania w jedno. Jednym z nich jest to, czy podtypowanie strukturalne jest lepsze niż podtypowanie nominalne. Drugim jest to, czy kompozycja jest lepsza niż dziedziczenie. Te pytania są wzajemnie ortogonalne. Myślę, że ostatecznie „najlepszy” język nie jest dla ciebie wyborem. Spekulowałbym, że Go ma po prostu inny zestaw problemów, ale zobaczymy, czy Google doda te funkcje „z powrotem”, czy nie.
back2dos
Chciałbym tylko jeden język, który ma większość możliwości C ++, ale był mniejszy i prostszy. C ++ jest jedynym językiem oprócz C realistycznym dla jąder i daje niezwykle przydatne narzędzia, takie jak destruktory i STL. I ważna zasada „jeśli go nie użyjesz, nie zapłacisz za to”. OO, właściwie użyte, jest niezwykle potężne. Ale generyczne i inne koncepcje inne niż OO są również niezwykle potrzebne. C daje ci prawie nic, a Go wyrzuca prawdziwe OO za dziwne nowomodne pomysły.
Erik Alapää,
1

OOP nie jest przestarzały.

Jak powiedziała Andrea, zaproponowano wiele koncepcji jako alternatywy dla klas (np. Typklasy Haskell). OOP ma jedną wielką zaletę: naucza się go w wielu miejscach, a kultura OOP jest w dużej mierze dzielona przez programistów.

Umożliwia to bogatszą komunikację w zespole. O fabrykach można mówić łatwiej niż o prego- nomorfizmach zygohistomorficznych . OOP strukturyzuje sposób, w jaki będziesz organizować i komunikować się o swoim programie za pomocą często używanych diagramów. To potężny atut.

Simon Bergot
źródło
1
Myślę: nauczony w wielu miejscach. W rzeczywistości nie jest to zaleta.
AndreasScheinert,
@AndreasScheinert dlaczego nie miałoby to być zaletą?
Simon Bergot,
Ponieważ, aby dokonać oceny, powinieneś znać przynajmniej 1 alternatywę równie dobrą. Jest to kwestia nawyku, ludzie lubią pozostać w strefie komfortu, co prowadzi do stagnacji.
AndreasScheinert,
@AndreasScheinert użyj odpowiedniego narzędzia do pracy. Oop nie działa we wszystkich scenariuszach .... nie ma nic wspólnego z ich strefą komfortu
pqsk
1

Nie, nie ma tu nic nowego, a OOP nie jest przestarzałe. C ++ ma także niejawne interfejsy w postaci szablonów, ale ludzie nadal używają funkcji wirtualnych. Potrzebujesz jawnych interfejsów, aby poradzić sobie np. Z interfejsami binarnymi lub interfejsami, w których drugi kod po prostu nie jest znany w czasie kompilacji.

Można argumentować, że jest to po prostu przypadek wnioskowania w porównaniu z jawnym stwierdzeniem, co nie jest niczym więcej niż „nowym paradygmatem” i jest po prostu wygodniejsze.

DeadMG
źródło