Chcę się nauczyć OOP. Znam Python i wiem bardzo mało rzeczy na temat OOP.
Ale kiedy szukam hasła „learn OOP” na forach, zobaczyłem faceta, który powiedział: „Python jest tak nowy, dlatego nie możesz nauczyć się OOP na Pythonie. Powinieneś nauczyć się Java, a następnie zrozumieć OOP na Java”
Czy to prawda? Czy jest jakaś różnica w rozumieniu OOP w różnych językach programowania? lubisz uczyć się na Java, C #, C ++, Perl lub Python?
java
object-oriented
python
użytkownik2783998
źródło
źródło
Odpowiedzi:
Obiekt jako konstrukcja teoretyczna jest bardzo prosty: jest to struktura przechowująca dane, funkcje lub oba. Chodzi o to, że struktury te mają poczucie „jaźni”, które jest ukryte w większości języków poza Pythonem. Nazywa się to „deskryptorem” i daje obiektowi punkt odniesienia, który wiąże dane (zmienne lub pola) i funkcje (zwykle nazywane metodami) z danym obiektem. Chodzi o to, że konkretnie używasz zmiennej lub metody, która należy do tej konkretnej instancji (przydzielony blok pamięci zwykle poniżej), a nie do jakiejś większej, bardziej ogólnej konstrukcji.
Systemy obiektowe różnią się w zależności od dwóch dużych kategorii: dziedziczenia i dostępu.
Niektóre, takie jak Java lub C ++, zadeklarowały klasy, które działają jak „plany” dla obiektów, które następnie zostają przydzielone. Po utworzeniu instancji tych klas i ich obiektów nie można modyfikować strukturalnie. Ich treść może zostać przesłonięta w tym sensie, że zmienne mogą się zmieniać, ale ich struktura jest statyczna. Nie można na przykład dodawać nowych metod do HashMap w Javie. Możesz rozszerzyć interfejs (w zasadzie częściowo zaimplementowane klasy służące jako kontrakty) lub utworzyć podklasę, aby uzyskać dodatkowe potrzebne metody lub zmienne wraz ze wszystkimi oryginalnymi zmiennymi i metodami danej klasy.
Inne języki oparte na klasach, najczęściej cytowanym językiem jest Ruby, pozwalają łatwo otworzyć istniejącą klasę i po prostu dodawać metody według własnego uznania. To kość niezgody i przez wielu uważana za bardzo, bardzo niebezpieczną.
JavaScript jest jeszcze luźniejszy, Obiekty są niczym więcej niż zbiorem miejsc dla zmiennych lub funkcji. Można je zmienić lub zastąpić, ilekroć programista uzna to za konieczne. Mogą nawet zostać arbitralnie sklonowane jako „Prototypy” dla innych obiektów, przekazując w ten sposób wszystkie swoje umiejętności.
Kontrola dostępu jest drugą dużą różnicą między różnymi językami.
Niektóre języki, takie jak Java, mają bardzo ściśle egzekwowane modyfikatory dostępu, takie jak „prywatny” i „chroniony”, które dokładnie określają, jakie klasy i podklasy mogą używać danej zmiennej lub metody.
Inne, takie jak Python, są mniej formalne, wykorzystując konwencję podkreślenia przed nazwą metody lub zmiennej, aby wskazać, że jest ona prywatna.
Ostatecznie, Python jest całkowicie uzasadnionym językiem do programowania w sposób obiektowy, po prostu nie wymusza go tak rygorystycznie jak niektóre inne.
źródło
private
dla Java i podkreślenie (__
) dla Pythona, jest dość ważne. Myślę, że poziom abstrakcji w Pythonie może uczynić go nieco trudniejszym dla początkującego, ale zdecydowanie nie niemożliwym. Java określa to dla programisty, co może sprawić, że niektóre koncepcje będą się nieco łatwiej trzymać.Uczenie się zasad OOP wcale nie jest specyficzne dla języka, więc jeśli przez „ucz się OOP” masz na myśli „dowiedz się, co oznacza terminologia, czym jest OOP i dlaczego mógłbym chcieć go używać”, to język nie ma znaczenia.
Jeśli masz na myśli „naucz się rozwijać przy użyciu OOP”, to tak, różne języki traktują to inaczej, ale wszystkie mają ten sam zestaw zasad. Jeśli jesteś podobny do mnie, nauczysz się tego najlepiej, po prostu robiąc to. Wybierz język zorientowany obiektowo z dobrym przewodnikiem lub książką, która obejmuje aspekty zorientowane obiektowo. Jeśli masz już zasady projektowania obiektowego, będziesz mógł używać ich w dowolnym języku OO.
To tylko boli mnie głowa. Tyle złego stłoczonego w jednym zdaniu.
Python pochodzi z 1989 roku.
http://python-history.blogspot.com/2009/01/brief-timeline-of-python.html
Java do 1995 r.
http://www.oracle.com/technetwork/java/javase/overview/javahistory-index-198355.html
Możesz wyciągnąć własne wnioski na temat ważności tej porady ...
źródło
Myślę, że osoba, którą zacytowałeś, po prostu przejawiała szowinizm językowy.
W rzeczywistości istnieje różnica między koncepcjami OOP a implementacją OOP. Poetycko najlepiej to zrozumieć, gdy lepiej zrozumiesz niektóre koncepcje OOP.
Wielu programistów czuje się komfortowo z kilkoma podobnymi językami, więc nie muszą poszerzać swoich możliwości lub cierpieć z powodu braku umiejętności przez pewien czas.
Pytanie sprowadza się więc do tego, czy Python nauczy Cię koncepcji OOP?
Powiem, że możesz, pod warunkiem, że masz odpowiednie wsparcie uczenia się, które popycha cię do wypróbowania rzeczy, których normalnie nie odkrywałbyś w samokształceniu. Najlepsza byłaby książka lub mentor. Mark Lutz pisze bardzo szczegółowe, bardzo szczegółowe i bardzo doskonałe książki na temat Pythona, a ja poleciłbym jego książki, ponieważ zachęcą cię do zrobienia czegoś więcej.
Musisz pamiętać, że droga Pythona nie jest jedyną drogą, ani jedyną właściwą drogą. Im więcej paradygmatów programistycznych opanujesz, tym lepiej będziesz programistą. Sposób, w jaki Python robi OOP, nie jest dokładnie tym, jak robi to C ++ lub Java, ale pojęcia są przekazywane dobrze.
źródło
Tak, implementacje OOP są bardzo różne. Teoria i zasady są takie same, ale tak wielu ludzi uważa, że „prawdziwe OOP” to, co robią Java i C ++, że otrzymujesz wiele referencji, które powinny być „niezależne od języka”, ale w rzeczywistości zakładają oparte na klasach, statycznie typowane języki .
To nie znaczy, że te odniesienia są złe, a nawet ograniczone; na przykład książka „gang of four” (GoF) „Wzorce projektowe: elementy oprogramowania obiektowego do wielokrotnego użytku” jest doskonałym przykładem wspaniałego dzieła, które mówi „OOP”, gdy tak naprawdę oznacza „OOP oparty na klasie statycznej”.
Tak więc, moim zdaniem: Tak, możesz nauczyć się dużo OOP na Pythonie, JavaScript, C i wielu innych językach; ale niektóre osoby (być może przyszły pracodawca), kiedy pytają o „doświadczenie OOP”, oznaczają Java / C ++ / C #. Mądrze byłoby więc sprawdzić również ten inny widok.
(i to nie są jedyne dwa „typy” OOP ....)
źródło
Programowanie obiektowe to pomysł na to, jak ustrukturyzować język programowania w celu wspierania niskiego sprzężenia, ukrywania informacji (inaczej enkapsulacji), łączenia danych i metod, które działają na tych danych razem, oraz ponownego wykorzystania kodu. Wiele języków realizuje swoje poglądy na te pomysły, dlatego istnieją różnice między językami dotyczące sposobu podejścia do orientacji obiektowej. Na przykład Java pozwala tylko klasie na rozszerzenie 1 klasy. Jednak Python i C ++ pozwalają rozszerzyć dowolną liczbę klas. Java ma konkretne powody swoich ograniczeń. Ograniczenia, które mają korygować rzeczy z C ++, ale także dlatego, że Smalltalk obsługuje tylko jedną klasę bazową.
Języki OO można podzielić na dwie rodziny. Do rodziny Smalltalk (lub opartej na klasach OOP) języków należą C ++, Java, Smalltalk, Ruby, C #, Python, aby wymienić tylko kilka (w tej rodzinie jest mnóstwo). Są to mieszanki języków typu statycznego i dynamicznego i choć różnią się nieznacznie w niektórych pojęciach, są bardzo podobne w sposobie myślenia o OOP. Mam na myśli to, w jaki sposób podchodzą do łączenia, hermetyzacji, wiązania danych i metod oraz ponownego wykorzystywania kodu, a także narzędzia, które zapewniają, aby to zrobić. W tej rodzinie wiele koncepcji jest takich samych.
Druga rodzina to OOP oparty na protoype. Te języki wyglądają zupełnie inaczej w implementacji OOP. Prawdopodobnie najbardziej znanym przykładem tego jest Javascript, ale Javascript skopiował te pomysły ze Scheme i Object LISP. Są to mniej znane języki i zazwyczaj dynamicznie pisane. Nie mogę wymyślić statycznego języka opartego na prototypach, ale to nie znaczy, że go nie ma. Możesz przeczytać o tym tutaj: http://en.wikipedia.org/wiki/Prototype-based_programming . Chodzi o to, że podchodzą do OOP w zupełnie inny sposób niż języki oparte na klasach. Oznacza to, że koncepcje nie są tak przenośne między tymi dwiema rodzinami. To, że znasz OO w jednej rodzinie, nie oznacza, że z łatwością przeniesiesz te pomysły do drugiej rodziny.
Pamiętaj, że większość języków programowania łączy koncepcje z wielu pomysłów. Python i Ruby wprowadzają zarówno OOP, jak i funkcjonalne pomysły programistyczne do swoich języków. I możesz łączyć prototypowe OO z pewnymi rozszerzeniami języków opartych na klasach, dzięki czemu jest to jeszcze bardziej złożone.
źródło
OOP to zasada programowania - to zasadniczo pomysł. Implementacja OOP jest różna w różnych językach programowania - ale filary (abstrakcja, dziedziczenie, enkapsulacja i polimorfizm) OOP są zwykle obecne w jakiś sposób lub formie.
Powiem bez preferencji dla żadnego języka, że Java popycha semantykę nieco mocniej na programistę niż mówi Python.
Na przykład,
Kod Java:
class Cat extends Animal {}
Jest trochę bardziej oczywiste, co robisz z punktu widzenia OOP rzeczy, niż:
Kod Python:
class Cat(Animal):
Jasne, że oba definiują hierarchię klas, w której Cat dziedziczy po Animal. Ale wydaje mi się, że dla programisty dopiero rozpoczynającego pracę w OOP, zastosowanie i implikacje pomysłów na OOP mogą być nieco lepsze w Javie, ponieważ jest to pisane dla programisty.
źródło
Pytasz wprost, jaki jest najłatwiejszy język do nauki pojęć OOP. Myślę, że odpowiedź jest jasna: python .
Aby pokazać, dlaczego tak jest, spójrzmy na typowy program dla początkujących w Javie kontra Python. Stwórzmy prostą grę polegającą na odgadywaniu wyższych wartości.
Jawa
W Javie napiszesz klasę gry.
Jestem doświadczonym programistą i nawet mam trudności. Ponadto spójrz na to, co musisz wyjaśnić potencjalnemu uczniowi w tym prostym programie:
this.
notacja odnosząca się do zmiennych, gdy są one maskowane przez inne osobySystem.out
to outputStream. I tak, to pole, ale tostatic
pole.String[]
jest tablicą. Jest to specjalny rodzaj obiektu, ale z drugiej strony nie do końca.int
jest prymitywnym typem. To jest wyjątkowe.Pyton
Python jest o wiele „czystszy”. Nie ma prymitywnych typów. Konstruktor nie istnieje, istnieje tylko specjalna metoda, która jest wywoływana podczas inicjalizacji.
Nie musisz wchodzić w interakcje z konsolą, ponieważ masz
REPL
. Możesz po prostu zagrać w grę, używającg.guess(35)
i zwracając ciąg znaków.Ułatwia to naukę języka i zrozumienie podstawowych pojęć związanych z OOP.
źródło
Podstawową ideą OOP jest enkapsulacja (co oznacza łączenie lub ukrywanie) zmiennych i metod razem wewnątrz klas (które Python absolutnie obsługuje). Chodzi o zaprojektowanie kodu wokół rzeczowników. Potem coś się dzieje dalej.
Chociaż istnieją różnice w implementacji (na przykład Python nie obsługuje widoczności tak jak Java) i różnice w składni (w Javascripcie musisz dziedziczyć metody samodzielnie), podstawowy projekt pozostaje taki sam.
Myślę jednak, że łatwiej jest uczyć się OOP w języku takim jak Java, ponieważ język tego wymaga, a społeczność jest mniej negatywna niż, powiedzmy, społeczność python.
Ale jest mnóstwo pisania o projektowaniu i praktykach OOP, a czytanie to nie marnowany wysiłek. Nawet kiedy piszę python (co jest dużo), piszę wiele obiektów i używam wielu obiektów z bibliotek stron trzecich.
źródło
Kiedy uczysz się OOP w języku, zaczynasz myśleć w tym języku. Język wpływa na to, co według ciebie można zrobić i jak dodaje smaku OOP.
Niektóre osoby nie mogą wykonywać OOP bez zajęć. Niektórzy muszą w ten sposób zabić swoje przedmioty.
Istnieje rdzeń OOP i oryginalne pomysły na ten temat. Możesz także zajrzeć na Smalltalk, Self, Simula, LISP, Newspeak. A także spojrzenie na typy języków inne niż OOP, takie jak bash, APL, J. Logical Prolog. Haskell (klasy typów). Wszyscy nauczą cię innego myślenia i możesz się tego nauczyć
I na koniec możesz zobaczyć, do czego służy OOP. Przynajmniej będziesz miał inny pomysł na ten temat. Proponuję znaleźć rozmowy Alana Kay .
Jeśli nie patrzysz na języki, ten post jest bezużyteczny.
Jak widać tutaj: nie możemy się zgodzić co do tego, czym jest OOP.
źródło