Gibt es einen Unterschied beim Lernen von OOP in verschiedenen Programmiersprachen? [geschlossen]

9

Ich möchte OOP lernen. Ich kenne Python und ich weiß sehr wenig über OOP.

Aber als ich in Foren nach "OOP lernen" suchte, sah ich einen Mann, der sagte: "Python ist so neu, dass man OOP auf Python nicht lernen kann. Man sollte Java lernen und dann OOP auf Java verstehen."

Ist es wahr? Gibt es einen Unterschied beim Verständnis von OOP in verschiedenen Programmiersprachen? Möchten Sie es auf Java, C #, C ++, Perl oder Python lernen?

user2783998
quelle
12
"Python ist so neu, dass man OOP auf Pyton nicht lernen kann. Man lernt Java und versteht dann OOP auf Java." Das macht für mich keinen Sinn. Wenn Sie OOP mit Python lernen möchten, sehe ich keinen Grund, warum nicht. Tue es!
FrustratedWithFormsDesigner
13
Ist Python nicht älter als Java? Ich glaube, dass es so ist, aber ich könnte um ein paar Jahre abwesend sein.
Jimmy Hoffa
2
@ JimmyHoffa Es ist in der Tat. 91 vs. 95 laut Wikipedia.
Evicatos
2
@ JimmyHoffa: Komm schon, das kann doch nicht wahr sein, oder? Wir alle wissen, dass Java die erste OO-Sprache überhaupt war. "Sun kündigt laut Javas Neuheit an" ... - Was die Frage betrifft ... warum bist du entschlossen, OO zu lernen? Das wird dir früh genug aufgezwungen. Python ist ein ausgezeichneter Ausgangspunkt, um Einblicke in die Vorteile mehrerer Programmierparadigmen zu erhalten.
links um den

Antworten:

10

Ein Objekt als theoretisches Konstrukt ist sehr einfach: Es ist eine Struktur, die Daten, Funktionen oder beides speichert. Die Idee ist, dass diese Strukturen ein Gefühl von "Selbst" haben, das in den meisten Sprachen außerhalb von Python impliziert ist. Dies wird als "Deskriptor" bezeichnet und gibt dem Objekt einen Selbstreferenzpunkt, der Daten (Variablen oder Felder) und Funktionen (normalerweise als Methoden bezeichnet) an das betreffende Objekt bindet. Die Idee ist, dass Sie speziell eine Variable oder Methode verwenden, die zu dieser bestimmten Instanz gehört (zugewiesener Speicherblock normalerweise darunter), anstatt zu einem größeren, allgemeineren Konstrukt.

Objektsysteme variieren in Bezug auf zwei große Kategorien: Vererbung und Zugriff.

Einige, wie Java oder C ++, haben Klassen deklariert, die als "Blaupausen" für Objekte dienen, die dann zugewiesen werden. Diese Klassen und ihre Objekte können nach der Instanziierung nicht mehr strukturell geändert werden. Sie können ihren Inhalt in dem Sinne überschreiben, dass sich Variablen ändern können, ihre Struktur jedoch statisch ist. Sie können beispielsweise keine neuen Methoden zu HashMap in Java hinzufügen. Sie können die Schnittstelle erweitern (im Grunde teilweise implementierte Klassen, die als Verträge dienen) oder eine Unterklasse erstellen, um die zusätzlichen Methoden oder Variablen zusammen mit allen ursprünglichen Variablen und Methoden der jeweiligen Klasse abzurufen.

Andere klassenbasierte Sprachen, von denen Ruby am häufigsten zitiert wird, ermöglichen es Ihnen, eine vorhandene Klasse einfach zu öffnen und Methoden nach Belieben hinzuzufügen. Dies ist ein Streitpunkt und wird von vielen als sehr, sehr gefährlich angesehen.

Javascript ist noch lockerer. Objekte sind nichts anderes als eine Sammlung von Slots für Variablen oder Funktionen. Sie können geändert oder überschrieben werden, wenn der Programmierer dies für erforderlich hält. Sie können sogar willkürlich als "Prototypen" für andere Objekte geklont werden, wodurch alle ihre Fähigkeiten weitergegeben werden.

Die Zugangskontrolle ist der andere große Unterschied zwischen den verschiedenen Sprachen.

Einige Sprachen wie Java haben sehr streng erzwungene Zugriffsmodifikatoren wie "privat" und "geschützt", die genau definieren, welche Klassen und Unterklassen eine bestimmte Variable oder Methode verwenden können.

Andere, wie z. B. Python, sind weniger formal und verwenden die Konvention eines Unterstrichs vor dem Methoden- oder Variablennamen, um anzuzeigen, dass es privat ist.

Letztendlich ist Python eine absolut legitime Sprache, um objektorientiert zu programmieren. Sie setzt sie einfach nicht so streng durch wie einige der anderen.

Weltingenieur
quelle
Könnte für diese Frage etwas zu technisch sein.
Zeroth
@zeroth und auch zu spezifisch. Der Parameter 'self' (oder 'this') ist alles andere als universell.
Javier
@ Javier Deshalb habe ich gesagt, dass es in Python explizit und anderswo implizit ist.
Welt Ingenieur
Die Frage bezieht sich auf das Erlernen von OOP, und ich denke, es ist ziemlich wichtig zu diskutieren, wie eine Sprache geschrieben wird, um bestimmte Konzepte wie Encapsulation zu erreichen, die wir privatefür Java und underscore ( __) für Python haben. Ich denke, die Abstraktionsebene von Python könnte es für Anfänger etwas schwieriger machen, aber definitiv nicht unmöglich. Java formuliert es für den Programmierer, wodurch einige Konzepte möglicherweise leichter haften bleiben.
Derek W
@WorldEngineer Ich spreche nicht davon, explizit / implizit zu sein (auch Python ist diesbezüglich nicht ungewöhnlich), sondern davon, einfach als Konzept zu existieren. Einige Sprachen führen einen polymorphen Versand für alle Parameter durch, nicht nur für den ersten. Einige verwenden andere Hinweise für die jeweilige Version, und der Hauptstil privilegiert ein Argument möglicherweise nicht als "dies".
Javier
18

Das Erlernen von OOP- Prinzipien ist überhaupt nicht sprachspezifisch. Wenn Sie also mit "OOP lernen" meinen, "lernen, was die Terminologie bedeutet, was OOP ist und warum ich es möglicherweise verwenden möchte", spielt die Sprache keine Rolle.

Wenn Sie "lernen, wie man mit OOP entwickelt" meinen, dann gehen verschiedene Sprachen unterschiedlich damit um, aber alle teilen die gleichen Prinzipien. Wenn Sie so etwas wie ich sind, lernen Sie es am besten, indem Sie es einfach tun. Wählen Sie eine objektorientierte Sprache mit einem guten Tutorial oder Buch, das die objektorientierten Aspekte abdeckt und darüber verfügt. Wenn Sie die Prinzipien des objektorientierten Designs nicht kennen, können Sie sie in jeder anderen OO-Sprache verwenden.

"Python ist so neu, dass man OOP auf Pyton nicht lernen kann. Man lernt Java und versteht dann OOP auf Java."

Das macht mir nur den Kopf weh. So viel Falsches in einem Satz.

Python stammt aus dem Jahr 1989.

http://python-history.blogspot.com/2009/01/brief-timeline-of-python.html

Java bis 1995.

http://www.oracle.com/technetwork/java/javase/overview/javahistory-index-198355.html

Sie können Ihre eigenen Schlussfolgerungen über die Gültigkeit dieses Ratschlags ziehen ...

Paul Glover
quelle
1
Ja, aber Python 1.0 war erst 1994. Java war einige Zeit in der Entwicklung, bevor es auch veröffentlicht wurde. Aber ich stimme zu, dass Python OO hat und Sie die Konzepte von OO lernen können. Es ist absurd, etwas anderes zu sagen.
Chubbsondubs
2
@chubbsondubs Ja, das ist noch vor Java! ;)
Izkata
1
Um nur einen leichten Kontrapunkt bereitzustellen, unterscheidet sich klassenbasiertes OOP (C ++, Java, Python und viele andere) ziemlich von prototypbasiertem OOP (JavaScript ist die einzige mir bekannte Sprache, die dies verwendet). Sie sind immer noch OOP und haben die gleichen Grundlagen und dienen vielen der gleichen Ziele, aber viele Leute betrachten Klassen als Teil dessen, was sie als OOP betrachten, während JavaScript sie nicht hat und definitiv objektorientiert ist.
KRyan
@KRyan: Falls es Sie interessiert, gibt es eine andere prototypbasierte OO-Sprache namens Self.
Jerry Coffin
ActionScript hat sowohl Prototypen als auch Klassen.
OrangeDog
8

Ich denke, die Person, die Sie zitieren, zeigte einfach Sprachchauvinismus.

In Wirklichkeit gibt es einen Unterschied zwischen OOP- Konzepten und der Implementierung von OOP. Poetisch ist dies am besten zu verstehen, wenn Sie einige der Konzepte von OOP besser verstehen.

Viele Programmierer fühlen sich mit nur wenigen ähnlichen Sprachen wohl, sodass sie ihre Fähigkeiten nicht erweitern müssen oder eine Zeit lang nicht in der Lage sind, fähig zu sein.

Die Frage ist also, ob Python Ihnen die Konzepte von OOP beibringt .

Ich werde sagen, dass Sie dies können, vorausgesetzt, Sie haben eine angemessene Lernunterstützung, die Sie dazu bringt, Dinge auszuprobieren, die Sie normalerweise beim selbstgesteuerten Lernen nicht erforschen würden. Ein Buch oder ein Mentor wäre am besten. Mark Lutz schreibt sehr ausführliche, sehr detaillierte und sehr gute Bücher über Python, und ich würde seine Bücher empfehlen, weil sie Sie dazu bringen werden, mehr zu tun und zu lernen.

Was Sie beachten müssen, ist, dass Pythons Weg weder der einzige noch der einzig richtige Weg ist. Je mehr Programmierparadigmen Sie beherrschen, desto besser werden Sie zum Programmierer. Die Art und Weise, wie Python OOP macht, ist nicht genau so, wie es C ++ oder Java macht, aber die Konzepte lassen sich gut übertragen.

Zeroth
quelle
4
In Bezug auf OOP unterscheiden sich Java und C ++ voneinander, so sehr sich beide von Python unterscheiden.
Gort the Robot
Bis zu einem gewissen Grad ist dies jedoch hauptsächlich auf veränderte Sprachdesignkenntnisse und unterschiedliche Einschränkungen zurückzuführen.
Zeroth
Und ehrlich gesagt übertragen sich 90% der OOP-Konzepte gut zwischen ihnen, fast unsichtbar sogar.
Zeroth
Ja, ich stimme zu. Ich finde es ein bisschen lustig zu denken, dass Java und C ++ in Bezug auf OOP "gleich" sind.
Gort the Robot
4

Ja, OOP-Implementierungen sind sehr unterschiedlich. Die Theorie und die Prinzipien sind zwar die gleichen, aber so viele Leute betrachten nur "echtes OOP" als das, was Java und C ++ tun, dass Sie viele Referenzen erhalten, die "sprachunabhängig" sein sollen, aber tatsächlich klassenbasierte, statisch typisierte Sprachen annehmen .

Das bedeutet nicht, dass diese Referenzen schlecht oder sogar begrenzt sind. Zum Beispiel ist das wegweisende Buch "Design of Patterns: Elemente wiederverwendbarer objektorientierter Software" der "Gang of Four" (GoF) ein Paradebeispiel für eine großartige Arbeit, die "OOP" sagt, wenn es wirklich "statische klassenbasierte OOP" bedeutet.

Meiner Meinung nach können Sie also viel OOP in Python, Javascript, C und vielen anderen Sprachen lernen. Aber einige Leute (vielleicht ein zukünftiger Arbeitgeber), die nach "OOP-Erfahrung" fragen, meinen Java / C ++ / C #. Es wäre also ratsam, auch diese andere Ansicht zu überprüfen.

(und das sind nicht die einzigen zwei Arten von OOP ...)

Javier
quelle
2
Ironischerweise ist statisches, klassenbasiertes OOP nicht das, was Alan Key ursprünglich als OOP vorgeschlagen hatte. Aber viel "Lernen" OOP ist über das Lernen von Design / Codierungssinn, das nicht streng auf eine bestimmte OOP-Implementierung beschränkt ist
Daniel Gratzer
2
Es könnte auch sinnvoll sein, sich CLOS anzuschauen: Ich glaube nicht, dass viele Sprachen / Frameworks Multimethoden anbieten.
Giorgio
2
@jozefg: Richtig, Alan Kay hat einmal gesagt: "Eigentlich habe ich den Begriff" objektorientiert "erfunden, und ich kann Ihnen sagen, dass ich nicht an C ++ gedacht habe."
Javier
1
@Giorgio Eigentlich könnte Dylan eine etwas einfachere Version von CLOS bereitstellen (keine Möglichkeit anzugeben, wann eine Multimethode ausgeführt wird, aber viel einfacher zu erreichen)
Daniel Gratzer
4

Objektorientierte Programmierung ist eine Idee zur Strukturierung der Programmiersprache, um eine geringe Kopplung, das Verbergen von Informationen (auch als Kapselung bezeichnet), das Bündeln von Daten und Methoden, die diese Daten zusammen verarbeiten, und die Wiederverwendung von Code zu fördern. Viele Sprachen setzen diese Ideen um, sodass es zwischen den Sprachen Unterschiede gibt, wie sie sich der Objektorientierung nähern. Beispielsweise erlaubt Java einer Klasse nur, eine Klasse zu erweitern. Mit Python und C ++ können Sie jedoch eine beliebige Anzahl von Klassen erweitern. Java hat bestimmte Gründe für seine Einschränkungen. Einschränkungen, die dazu gedacht sind, Dinge aus C ++ zu korrigieren, aber auch, weil Smalltalk nur eine einzige Basisklasse unterstützt.

OO-Sprachen können in zwei Familien eingeteilt werden. Die Smalltalk-Familie (oder klassenbasierte OOP) von Sprachen umfasst C ++, Java, Smalltalk, Ruby, C # und Python, um nur einige zu nennen (es gibt Tonnen in dieser Familie). Dies ist eine Mischung aus statisch und dynamisch typisierten Sprachen, und obwohl sie sich in einigen Konzepten geringfügig unterscheiden, sind sie sich in ihrer Meinung zu OOP sehr ähnlich. Damit meine ich, wie sie sich der Kopplung, Kapselung, Bindung von Daten und Methoden sowie der Wiederverwendung von Code nähern und welche Tools sie Ihnen dafür zur Verfügung stellen. Innerhalb dieser Familie sind viele Konzepte gleich.

Die andere Familie ist die auf Prototypen basierende OOP. Diese Sprachen sehen in ihrer OOP-Implementierung sehr unterschiedlich aus. Das wahrscheinlich bekannteste Beispiel hierfür ist Javascript, aber Javascript hat diese Ideen aus Scheme und Object LISP kopiert. Dies sind weniger bekannte Sprachen, die normalerweise dynamisch typisiert werden. Ich kann mir keine statisch typisierte prototypbasierte Sprache vorstellen, aber das bedeutet nicht, dass es keine gibt. Sie können es hier nachlesen: http://en.wikipedia.org/wiki/Prototype-based_programming . Der Punkt ist, dass sie sich OOP auf eine ganz andere Art und Weise nähern als die klassenbasierten Sprachen. Das bedeutet, dass Konzepte zwischen diesen beiden Familien nicht so portabel sind. Nur weil Sie OO in einer Familie kennen, heißt das nicht, dass Sie diese Ideen leicht auf die andere Familie übertragen können.

Denken Sie daran, dass die meisten Programmiersprachen Konzepte aus vielen Ideen mischen. Python und Ruby integrieren sowohl OOP- als auch funktionale Programmierideen in ihre Sprachen. Und Sie können prototypbasiertes OO mit bestimmten Erweiterungen für klassenbasierte Sprachen mischen, um es noch komplexer zu gestalten.

Chubbsondubs
quelle
Ich würde C ++ nicht in die Smalltalk-Familie aufnehmen. Smalltalk basiert auf Simula, und Alan Kay hat die meisten Änderungen in Simula-II bewusst ignoriert, während C ++ darauf basiert. C # ist seltsam, es wurde von C ++ - Benutzern und Pascal-Designern so entworfen, dass es Java ähnelt.
Jörg W Mittag
1

OOP ist ein Prinzip der Programmierung - es ist im Grunde eine Idee. Die Implementierung von OOP variiert je nach Programmiersprache - aber die Säulen (Abstraktion, Vererbung, Kapselung und Polymorphismus) von OOP sind normalerweise in irgendeiner Form vorhanden.

Ich werde ohne Bevorzugung einer der beiden Sprachen sagen, dass Java die Semantik für den Programmierer etwas härter drückt als Python.

Beispielsweise,

Java-Code: class Cat extends Animal {}

Ist etwas offensichtlicher, was Sie unter OOP-Gesichtspunkten tun, als:

Python-Code: class Cat(Animal):

Sicher definieren beide eine Klassenhierarchie, in der Cat von Animal erbt. Ich bin jedoch der Meinung, dass für einen Programmierer, der gerade erst mit OOP anfängt, die Anwendung und die Auswirkungen von OOP-Ideen in Java möglicherweise etwas besser bleiben, da dies für den Programmierer klar ist.

Derek W.
quelle
1

Sie fragen explizit, welche Sprache am einfachsten ist, um OOP-Konzepte zu lernen. Ich denke, die Antwort ist klar: Python .

Um zu zeigen, warum dies der Fall ist, schauen wir uns das typische Anfängerprogramm in Java vs Python an. Lassen Sie uns ein einfaches Ratespiel mit höheren und niedrigeren Werten erstellen.

Java

In Java schreiben Sie eine Spielklasse.

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?
        }
    }
}

Ich bin ein erfahrener Programmierer und selbst ich habe Schwierigkeiten. Schauen Sie sich außerdem an, was Sie einem potenziellen Schüler für dieses einfache Programm erklären müssen:

  • Statische Methoden
  • Sichtbarkeit (öffentlich gegen privat). Sie sollten Felder immer als privat markieren.
  • this. Notation für den Verweis auf Variablen, wenn diese von anderen maskiert werden
  • Der Konstruktor ähnelt einer Methode, ist jedoch keine Methode.
  • System.outist ein outputStream. Und ja, es ist ein Feld, aber es ist ein staticFeld.
  • Manchmal können Sie die geschweiften Klammern weglassen, wenn nur eine Aussage vorhanden ist
  • String[]ist ein Array. Es ist eine besondere Art von Objekt, aber nicht wirklich.
  • intist ein primitiver Typ. Es ist etwas Besonderes.
  • Sie benötigen viele Framework-Methoden

Python

Python ist viel "reiner". Es gibt keine primitiven Typen. Ein Konstruktor existiert nicht, es gibt nur eine spezielle Methode, die bei der Initialisierung aufgerufen wird.

Sie müssen nicht mit der Konsole interagieren, da Sie eine haben REPL. Sie können das Spiel einfach mit g.guess(35)einer Zeichenfolge spielen und zurückgeben.

Dies erleichtert das Erlernen und Erfassen der grundlegenden OOP-Konzepte.

parasietje
quelle
0

Die Kernidee in OOP besteht darin, Variablen und Methoden innerhalb von Klassen zusammenzufassen (was bedeutet, dass sie gebündelt oder ausgeblendet werden) (was Python absolut unterstützt). Es geht darum, Ihren Code um Substantive herum zu entwerfen. Dann geht es irgendwie weiter.

Zwar gibt es Implementierungsunterschiede (z. B. Python unterstützt die Sichtbarkeit nicht wie Java) und Syntaxunterschiede (in Javascript müssen Sie Methoden selbst erben), das grundlegende Design bleibt jedoch gleich.

Ich denke jedoch, dass es einfacher ist, OOP in einer Sprache wie Java zu lernen, da die Sprache dies erfordert und die Community weniger dagegen ist als beispielsweise die Python-Community.

Aber es gibt jede Menge Schreiben über OOP-Design und -Praktiken, und das Lesen ist keine Verschwendung. Selbst wenn ich Python schreibe (was sehr viel ist), schreibe ich viele Objekte und verwende viele Objekte aus Bibliotheken von Drittanbietern.

rauben
quelle
Die Codeidee ist das Weiterleiten von Nachrichten. Auch keine Quelle.
Benutzer
1
Bei OOP geht es nicht um Klassen.
Jörg W Mittag
1
@Benutzer Alan Kays ursprüngliche Idee war das Versenden von Nachrichten, aber seitdem hat sich die Praxis von OO zu einem Design nach Substantiven oder Klassen von Objekten entwickelt. Zum Beispiel hat Dr. Kay auch festgestellt, dass Java nicht objektorientiert ist, da es keine späte Bindung unterstützt. @ Jorg lol ya ya
Rob
0

Wenn Sie OOP in einer Sprache lernen, beginnen Sie in dieser Sprache zu denken. Die Sprache beeinflusst, was Ihrer Meinung nach getan werden kann und wie und verleiht OOP einen besonderen Geschmack.

  • Sollte es eine Müllabfuhr geben?
  • Kann ich Ganzzahlen Methoden hinzufügen?
  • Benutze ich Klassen oder Prototypen?
  • Wie reflektieren Objekte sich selbst?

Einige Leute können OOP nicht ohne Unterricht machen. Einige müssen ihre Objekte mit dem Prozess töten.

Es gibt einen Kern von OOP und die ursprünglichen Ideen dazu. Sie können sich auch Smalltalk, Self, Simula, LISP, Newspeak ansehen. Und auch ein Blick auf Nicht-OOP-Sprachtypen wie Datenflusssprachen bash, APL, J. Logische Prolog. Haskell (Typklassen). Sie alle werden Ihnen ein anderes Denken beibringen, und das können Sie lernen

  • Bei OOP geht es nicht um imperative Sprachen
  • Bei OOP geht es nicht um Klassen

Und am Ende können Sie sehen, wofür OOP gut ist. Zumindest haben Sie eine andere Idee dazu. Ich schlage vor, Gespräche von Alan Kay zu finden .


Wenn Sie sich die Sprachen nicht ansehen, ist dieser Beitrag nutzlos.

Wie Sie hier sehen können: Wir können uns nicht darauf einigen, was OOP ist.

Nutzer
quelle