Nie mogę wymyślić lepszego miejsca wśród rodzeństwa SO, aby postawić takie pytanie. Początkowo chciałem zapytać „Czy python jest czystym językiem OO?” ale biorąc pod uwagę problemy i pewien dyskomfort, jaki ludzie odczuwają, próbując zdefiniować termin, postanowiłem zacząć od uzyskania jasnej definicji samego terminu.
Byłoby raczej uczciwe zacząć od korespondencji dr Alana Kay, który wymyślił ten termin (zauważ inspirację w analogii biologicznej do komórek lub innych żywych obiektów).
Istnieją następujące sposoby podejścia do zadania:
- Podaj analizę porównawczą, wymieniając języki programowania, które mogą wykazywać (lub nie potrafią tego zrobić), pewne właściwości unikalne i wystarczające do zdefiniowania tego terminu (chociaż Smalltalk, Scala,
Javaitd. - to możliwe przykłady, ale IMO w ten sposób nie wydaje się tak naprawdę kompletne ani owocne ) - Podaj formalną definicję (lub blisko niej, np. W bardziej akademickim lub matematycznym stylu).
- Podaj filozoficzną definicję, która całkowicie opierałaby się na semantycznym kontekście konkretnego języka lub doświadczeniu programowania a priori (musi istnieć pewna szansa na skuteczne wyjaśnienie przez społeczność).
Moja obecna wersja: „Jeśli określony język programowania ( formalny ), który może ( gramatycznie ) rozróżniać operacje i operandy, a także wnioskować o typie każdego operandu, czy ten typ jest obiektem (w sensie OOP), czy nie, wówczas wywołujemy taki język jest językiem OO, o ile istnieje co najmniej jeden typ w tym języku, który jest przedmiotem. Wreszcie, jeśli wszystkie typy języka są również obiektami, definiujemy taki język jako czysty (silny) język OO. ”
Byłbym wdzięczny za każdą możliwą poprawę. Jak widać, właśnie uzależniłem definicję od terminu „obiekt” (często w pełni określany jako klasa obiektów).
[EDYTOWAĆ]
Ponadto używam (na szczęście dobrze rozumianego) pojęcia typu jak w językach pisanych na maszynie. Programowanie typu danych lub programowanie zorientowane na typ jest nie tylko interpretacją składniową (tekstu programu, tj. Jak traktować pewne wartości literałów i zmiennych danych - coś, co ewoluuje w bezpieczeństwo typu), ale można je przypisać gramatyce języka i studiować formalnie (z wykorzystaniem logiki matematycznej) jako tak zwane systemy typów . Zauważ, że wymaganie od określonego systemu typów tak zwanego typu uniwersalnego jest jednym ze sposobów określających czystość języka OO (istnieją sposoby rozszerzenia tego semantycznie).
NB
jak odpowiedzieć :
- pomaga, jeśli podasz książkę lub odniesienie, które wspierają / wyjaśniają twoje rozumienie terminologii i pojęć (zwykle dobra definicja obejmuje lub odwołuje się do wszystkich pojęć zależnych oprócz elementarnych).
- jeśli to możliwe, wskaż wciętą kategorię swojej odpowiedzi / definicji, jeśli nie jest jasne inaczej (patrz wyżej: 1 - według przykładu językowego, 2 - logiki matematycznej, 3 - opisu technicznego i filozofii programowania)
- Klasyfikacja jest ważne (a także dlatego, że określenie czysta-oo, wchodzi określenie OO) odpowiadając Spróbuj unmix elementów OO paradygmatu innych dobrze znanych sposobów (i w żadnym wypadku nie mylić / pokrywają się je, na przykład zwykle elementy programowania modułowej mogą być pokryte / wcielony w programowanie OO): spróbuj odróżnić OOP od (w tym lub będącego częścią) programowania funkcjonalnego, programowania logicznego (szczególnie silnie wyspecjalizowanego), typów danych Abstarct (ADT), modułowego, metaprogramowania (generics i czas makroekspresji LISP), Kontrakty (np. Eiffel), aspektowe (AO), (różnica między klasyfikacją deklaratywną i funkcjonalną, a także historyczne definicje struktury Dijkstry są jasne)
na trudność podania formalnej definicji : co zaskakujące, bardzo łatwo jest podać matematyczny opis OOP w postaci pewnego logicznego (formalnego) systemu (najprawdopodobniej opartego na typie) i definiowania jednej koncepcji po drugiej. Można nawet spróbować zrobić coś bardziej praktycznego poprzez stosowanie tego formalizmu do kontroli bezpieczeństwa typ lub nowych aspektów projektu język niż tylko abstrakcyjnego rozrywki lub ćwiczeń (również odnośników formułowania OOP w intuicjonistycznej Type Theory , zależnych rodzaju , niezależnie, w formalizmach fol jak lambda rachunku i po prostu za pomocą teorii kategorii). Najważniejsze jest to, że nic dziwnegotakie sformułowania IMO są silnie stronnicze (błędne) przez najprawdopodobniej początkowo niepełne zrozumienie OOP (w inżynierii komputerowej), a następnie stają się prawie niedostępne (a więc prawie nie przyczyniają się wstecz do świata programowania - być może z wyjątkiem pewnego procentu znalezienie aplikacji z powrotem ze świata formalnego przez bycie zintegrowane z popularnymi językami ).
Tak, trudno jest podać dokładnie „dobrą” definicję, a nie tylko definicję. Ale jestem pewien, że pytam o to tutaj z powodu twojego doświadczenia i bezpośredniego zaangażowania, chłopaki.
źródło
Odpowiedzi:
OO, według Alana Kay chodzi o przekazywanie wiadomości i to wszystko. Przekonasz się, że cechy, takie jak polimorfizm i enkapsulacja, faktycznie pochodzą z przekazywania wiadomości.
Teraz ta postawa jest w rzeczywistości bardzo ekstremalna, ponieważ w zasadzie oznacza, że kwalifikują się tylko Smalltalk i języki.
Myślę, że można zdefiniować OO jako budowanie systemu na bytach, które całkowicie otaczają ich stan i które są wymienialne ze względu na ich nieodłączne cechy polimorficzne. Można zatem argumentować, że język wyłącznie OO zapewnia, że te dwie podstawowe cechy są zawsze spełnione. To, co czyni języki OO „nieczystymi”, to mechanizmy pozwalające na tworzenie konstrukcji niespełniających tych kryteriów, takie jak:
Z drugiej strony, czystość języka IMHO jest bardziej słabością niż siłą. OO nie jest srebrną kulą. Nie ma jednego paradygmatu.
źródło
Podchodziłbym do tego, definiując go jako język, który wykorzystuje konstrukcje OOP i nic więcej (w taki sam sposób, w jaki czysty język FP używa czystych funkcji z niezmiennymi danymi i niczym więcej).
W szczególności:
functionObject.call(param1,param2)
environment.getValue("myThing")
Lub umieścić zmienną w obiekcie klasyZauważ, że wciąż pozostawia to wiele otwartych opcji:
źródło
globalVariableName
do uzyskania dostępu do zmiennej globalnej jest innym semantycznym niż wywołanie metody na obiekcie, co byłoby jedynym sposobem na uzyskanie dostępu do nielokalnej wartości w czystym OOP.Dyskusja na temat tak zwanych języków OO zawsze była nieco sprana. To znaczy:
Pojęcie projektowania obiektowego sprowadza się do 3 rzeczy:
1) to czysty program, można go osiągnąć w dowolnym języku programowania. Jednak niektóre języki mają przydatne funkcje, takie jak class / struct i prywatne słowa kluczowe.
2) jest głównie projektowaniem programu, choć nie można go w pełni osiągnąć bez obsługi języka, ponieważ potrzebujesz mechanizmów językowych, takich jak prywatny / statyczny, aby zabezpieczyć się przed przypadkowym użyciem.
3) dotyczy głównie projektowania programu. Istnieją zwykle trzy różne zależności: „obiekt X zawiera obiekt Y”, „obiekt X jest rodzajem Y”, a „obiekt X współdziała z obiektem Y”. Istnieje wiele funkcji językowych pomocnych w tych zależnościach: dziedziczenie / polimorfizm, abstrakcyjne klasy podstawowe i tak dalej.
Teraz, jeśli spojrzymy na powyższe, widzimy, że ledwo potrzebujesz żadnych funkcji językowych, aby pisać programy OO. Funkcje sprawiają, że jest to o wiele łatwiejsze.
Powyższych celów nie można osiągnąć za pomocą jakiejś mętnej logiki wstecznej: tylko dlatego, że używasz słowa kluczowego class, twój program nie otrzymuje automatycznie modułowej konstrukcji. Tylko dlatego, że używasz dziedziczenia, nie oznacza to automatycznie, że zależność twoich obiektów ma sens. Język z funkcjami OO nadal pozwalałby na takie rzeczy jak
class TheWholeBloodyProgram
„Animal inherits Cat”.Niestety temat dobrego projektowania obiektowego jest rzadko omawiany w tego rodzaju dyskusjach. Programiści, którzy mają pranie mózgu, patrzą tylko na składnię i ignorują takie rzeczy, jak na przykład „C ++ ma prymitywne typy danych, więc twój program C ++ nie jest OO”, a następnie zaczynają pisać wręcz okropny program w swoim ulubionym języku, bez żadnej wskazówki projektowanie programów, jak nigdy dotąd.
Aby odpowiedzieć na pytanie: bardzo niewielu, jeśli jakieś języki mają wsparcie dla prawidłowego projektowania programu OO. Dowiedz się, które języki mają pewne funkcje związane z OO, nie ma znaczenia, dopóki programista nie wie, co oznacza projektowanie obiektowe. Programista twierdzący, że niektóre języki są obiektowe, najprawdopodobniej nie zrozumiał koncepcji OO jako całości. Zapytaj przyszłego programistę OO, jak projektują programy OO. Jeśli najpierw zaczną krzyczeć słowa kluczowe w języku, możesz spokojnie założyć, że nie znają projektowania OO.
Być może istnieje jakieś fantazyjne narzędzie wysokiego poziomu UML znacznie powyżej surowego kodu źródłowego, które zmusza programistę do pisania programów tylko z dobrym projektowaniem obiektowym, ale wątpię w to. Najlepszym narzędziem do programowania OO jest najprawdopodobniej ludzki mózg i zdrowy rozsądek.
źródło
Nie, nie ma formalnej ani nawet użytecznej definicji i nigdy nie będzie. Dla niektórych osób OOP oznacza „uniwersalną klasę podstawową” i „należy stosować semantykę referencyjną, najlepiej z urządzeniem do wyrzucania elementów bezużytecznych” - a można nawet spierać się o składnię, jedną z najmniej istotnych rzeczy, jakie kiedykolwiek wymyślono.
Ostatecznie najpierw musisz odpowiedzieć na pytanie „Co to jest przedmiot?”. Bardziej ograniczeni będą nalegać na odziedziczenie po jakiejś bezsensownej uniwersalnej klasie bazowej i niepotrzebnie zostaną przydzieleni do śmieciarza, aby się zakwalifikować. Ale wolę znacznie bardziej przydatną definicję. Celem OOP jest posiadanie niektórych danych i niektórych funkcji, które można wywołać na tych danych. Więc
W tym przypadku nawet się
int
kwalifikuje. W końcu, kiedy piszesz kod szablonu w C ++, który akceptuje prymitywy lub obiekty, trudno jest argumentować, że prymitywy różnią się w jakikolwiek istotny sposób.Vector v1, v2; v1 + v2;
Zamiast tego nie ma nic istotnie odmiennegoint v1, v2; v1 + v2;
(oprócz gównianej semantyki inicjalizacji, trzeba przyznać). Ponadto pozwala to obiektom na lambdy i takie rzeczy, ponieważ utrzymują one stan - swoje przechwytywania - i oferują funkcję w tym stanie, aby wywołać lambda.Na szczęście możemy również klasyfikować wskaźniki wolnych funkcji jako obiekty, ponieważ oba zawierają stan (adres) i funkcję w tym stanie (aby ją wywołać). Dlatego powinna być dozwolona funkcja bezpłatna - nawet gdybyś powiedział, że wszystkie funkcje bezpłatne są w rzeczywistości wskaźnikami funkcji globalnych.
źródło
Możesz o tym myśleć negatywnym przykładem. Java nie jest czysto obiektowym językiem, ponieważ istnieją również prymitywne typy, które nie są obiektami. Są to liczby całkowite, podwójne, tablice i tak dalej. W czystym języku obiektowym semantyka obiektów jest dostępna na wszystko.
Pojawia się również pytanie, jak duża część języka jest zamknięta na modyfikację, nawet w ramach obiektowych. W java nie można zdefiniować nowych podklas dla niektórych klas, takich jak String lub Class.
Które języki są czyste? Jedynym kandydatem, który przychodzi na myśl, jest smalltalk.
źródło