Czy jest jakaś różnica w uczeniu się OOP w różnych językach programowania? [Zamknięte]

9

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?

użytkownik2783998
źródło
12
„Python jest tak nowy, że nie możesz uczyć się OOP na Pytonie. Uczysz się Java, a następnie rozumiesz OOP na Javie” To nie ma dla mnie sensu. Jeśli chcesz nauczyć się OOP za pomocą Pythona, nie widzę żadnego powodu, dlaczego nie. Idź po to!
FrustratedWithFormsDesigner
13
Czy Python nie jest starszy niż Java? Wydaje mi się, że tak, ale mógłbym być za kilka lat.
Jimmy Hoffa
2
@JimmyHoffa To prawda. 91 vs. 95 według Wikipedii.
Evicatos
2
@ JimmyHoffa: no dalej, to nie może być prawda, prawda! Wszyscy wiemy, że Java była pierwszym językiem OO w historii. „Słońce głośno zwiastuje nowość Javy” ... - Co do pytania ... dlaczego jesteś zdecydowany nauczyć się OO? Wkrótce zostanie to narzucone. Python jest doskonałym punktem wyjścia, aby uzyskać wgląd w zalety wielu paradygmatów programowania.
leftaroundabout

Odpowiedzi:

10

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.

Inżynier świata
źródło
To może być trochę zbyt techniczne na to pytanie.
Zeroth,
@zeroth, a także zbyt szczegółowe. Parametr „self” (lub „this”) jest daleki od uniwersalnego.
Javier
@Javier Dlatego powiedziałem, że jest to jawne w Pythonie i niejawne gdzie indziej.
Inżynier światowy
Pytanie dotyczy nauki OOP i myślę, że omawianie, w jaki sposób napisany jest język, aby zrealizować pewne pojęcia, takie jak Encapsulation, gdzie mamy privatedla 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ć.
Derek W
@WorldEngineer Nie mówię o byciu jawnym / niejawnym (również Python nie jest niczym niezwykłym), ale o po prostu istnieniu jako koncepcji. Niektóre języki wysyłają polimorficznie wszystkie parametry, a nie tylko pierwszy. Niektórzy używają innych wskazówek dla konkretnej wersji, a główny styl może nie uprzywilejować argumentu jako „to”.
Javier
18

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.

„Python jest tak nowy, dlatego nie możesz uczyć się OOP na Pytonie. Uczysz się Java, a następnie rozumiesz OOP na Javie”

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 ...

Paul Glover
źródło
1
Tak, ale Python 1.0 był dopiero w 1994 roku. Java była w fazie rozwoju jeszcze przez jakiś czas, zanim została wydana. Ale zgadzam się, że Python ma OO i MOŻESZ nauczyć się koncepcji OO. Absurdalne jest twierdzenie inaczej.
chubbsondubs
2
@chubbsondubs Tak, to jeszcze przed Javą! ;)
Izkata
1
Aby zapewnić tylko lekki kontrapunkt, oparte na klasach OOP (C ++, Java, Python i wiele innych) jest dość różne od OOP opartego na prototypach (JavaScript jest jedynym językiem, który tego używa). Nadal są OOP i mają te same podstawy i służą wielu tym samym celom, ale wiele osób uważa klasy za część tego, co uważają za OOP, podczas gdy JavaScript ich nie ma i jest zdecydowanie obiektowy.
KRyan
@KRyan: Na wszelki wypadek istnieje jeszcze jeden oparty na prototypach język OO o nazwie Self.
Jerry Coffin
ActionScript ma zarówno prototypy, jak i klasy.
OrangeDog
8

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.

Zeroth
źródło
4
Pod względem OOP Java i C ++ różnią się od siebie tak bardzo, jak oba różnią się od Pythona.
Gort the Robot
W pewnym stopniu wynika to jednak ze zmieniającej się wiedzy o projektowaniu języka i różnych ograniczeń.
Zeroth,
I szczerze mówiąc, 90% koncepcji OOP przenosi się między nimi dobrze, prawie niewidocznie.
Zeroth,
Tak, zgadzam się. Uważam, że trochę zabawnie jest myśleć, że Java i C ++ są „takie same” pod względem OOP.
Gort the Robot
4

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 ....)

Javier
źródło
2
Ironicznie statyczne, oparte na klasach OOP nie jest tym, co Alan Key początkowo sugerował jako OOP. Ale wiele „uczenia się” OOP dotyczy uczenia się projektowania / kodowania, które nie jest ściśle ograniczone do konkretnej implementacji OOP
Daniel Gratzer
2
Warto również spojrzeć na CLOS: Nie sądzę, że wiele języków / frameworków oferuje wiele metod.
Giorgio
2
@ jozefg: racja, Alan Kay powiedział kiedyś: „Właściwie stworzyłem termin„ obiektowy ”i mogę powiedzieć, że nie miałem na myśli C ++.”
Javier
1
@Giorgio Właściwie Dylan może dostarczyć nieco prostszą wersję CLOS (nie ma sposobu na określenie, kiedy uruchamiana jest metoda multimethod, ale znacznie łatwiejsze podejście)
Daniel Gratzer
4

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.

chubbsondubs
źródło
Nie liczyłbym C ++ w rodzinie Smalltalk. Smalltalk oparty jest na Simuli, a Alan Kay celowo zignorował większość zmian w Simula-II, podczas gdy C ++ opiera się na tym. C # jest dziwny, został zaprojektowany przez użytkowników C ++ i projektantów Pascal tak, aby był jak Java.
Jörg W Mittag
1

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.

Derek W.
źródło
1

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.

public class Game {
    public int secretNumber;
    public int tries;

    public Game(int tries, int secretNumber) {
        this.tries = tries;
        this.secretNumber = secretNumber;
    }

    public void guess(int myNumber) {
        if(myNumber > secretNumber)
            System.out.println("Your guess is too high!");
        else if (myNumber < secretNumber)
            System.out.println("Your guess is too low!");
        else
            System.out.println("You win!!");
        tries = tries - 1;
        if(tries == 0) {
            System.out.println("No more tries: you lose :(");
        }
    }

    public static void main(String[] args) {
        Game game = new Game(10, 47);
        while(true) {
            // how do I read a newline again? Something with BufferedInputStreamReader?
            // how do I convert a String to a number?
        }
    }
}

Jestem doświadczonym programistą i nawet mam trudności. Ponadto spójrz na to, co musisz wyjaśnić potencjalnemu uczniowi w tym prostym programie:

  • Metody statyczne
  • Widoczność (publiczna vs. prywatna). Zawsze należy oznaczać pola jako prywatne.
  • this. notacja odnosząca się do zmiennych, gdy są one maskowane przez inne osoby
  • Konstruktor przypomina metodę, ale nie jest metodą.
  • System.outto outputStream. I tak, to pole, ale to staticpole.
  • Czasami można pominąć nawiasy klamrowe, jeśli istnieje tylko jedna instrukcja
  • String[]jest tablicą. Jest to specjalny rodzaj obiektu, ale z drugiej strony nie do końca.
  • intjest prymitywnym typem. To jest wyjątkowe.
  • Potrzebujesz wielu metod ramowych

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ąc g.guess(35)i zwracając ciąg znaków.

Ułatwia to naukę języka i zrozumienie podstawowych pojęć związanych z OOP.

parasietje
źródło
0

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.

Obrabować
źródło
Ideą kodu jest przekazywanie wiadomości. Również brak źródła.
Użytkownik
1
OOP nie dotyczy klas.
Jörg W Mittag
1
Oryginalny pomysł użytkownika Alana Kay'a dotyczył wiadomości, ale od tego czasu praktyka OO przekształciła się w projektowanie przez rzeczownik lub klasy przedmiotów. Na przykład dr Kay stwierdził również, że Java nie jest obiektowa, ponieważ nie obsługuje późnego wiązania. @ Jorg lol ya ya
Rob
0

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.

  • Czy powinna istnieć wywóz śmieci?
  • Czy mogę dodawać metody do liczb całkowitych?
  • Czy używam klas lub prototypów?
  • Jak obiekty odbijają się na sobie?

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ć

  • OOP nie dotyczy języków imperatywnych
  • OOP nie dotyczy klas

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.

Użytkownik
źródło