Objektorientierung üben...

CB_KeinNameFrei

Lieutenant
Registriert
Juli 2009
Beiträge
934
Mit objektorientiertem Programmieren hatte ich schon immer ein wenig Schwierigkeiten, und zwar hauptsächlich konzeptioneller Natur - was soll ich als Objekt definieren, wo gehört eine Funktion hin die in einem prozeduralen Ansatz völlig für sich allein stehen würde, wie stelle ich abstrakte Konzepte dar und so weiter. Aus diesem Grund will ich mal ein wenig üben.

Könnt ihr mir eine Programmiersprache empfehlen, die voll objektorientiert ist, aber gleichzeitig nicht tagelange Arbeit erfordert um allein eine Entwicklungsumgebung einzurichten, und die gut dokumentiert und zu lernen ist? Also sprich, nicht Java ;)

Ich habe (bzw. hatte vor Jahren mal :D) grundlegende Kentnisse in C/C++ und Python, habe aber immer nur prozedural damit programmiert. C++ ist natürlich objektorientiert, aber da hat mich immer extrem aufgeregt, dass man quasi gar nichts machen kann, ohne einhundert externe Bibliotheken einzubinden, von denen niemand einem erklärt was wo drin ist und wo man sie herbekommt. Idealerweise hätte ich gerne etwas komfortableres als das. Würde es denn mit Python gehen? Wobei ich das eher als Skriptsprache im Kopf habe...
 
Wenn dir Java mit JDK und Eclipse zu schwer ist solltest du dir evtl. überlegen ob du nicht da ansetzen willst mit dem Lernen...verstehe nicht wo das Problem sein soll.
JDK herunterladen und installieren, Eclipse herunterladen und entpacken, Eclipse starten, neues Projekt, Klasse anlegen und fertig.

Davon ab kannst du auch Java per Hand kompilieren und einen Editor wie Notepad++ nutzen zum coden, wenn es dir mehr Spaß macht .

Ansonsten C# mit Visual Studio Express, da brauchst du nur das installieren und dann kannst du loslegen. Projekte musst du aber auch da anlegen...
 
Python ist auch eine Scriptsprache. Dadrin Objektorientiert zu programmieren ist ein Graus ...
Edit: Falschinformation, wieder was gelernt. Das kommt davon, wenn man Python nur aus den ganzen 3D-Animationsprogrammen kennt ...

Für den Einstieg empfehle ich C#. Die Programmiersprache nimmt dir viel ab und dank .NET-Framework sind alle Bibliotheken schon in der Sprache selbst enthalten. Ist ähnlich wie Java, nur dass es sofort funktioniert - Dafür nur auf Windows wirklich gut. Also für nen Linux-Nutzer eher weniger empfehlenswert.
 
Zuletzt bearbeitet:
Wenn man noch nie im Leben Java programmiert hat, ist es eben nicht einfach mit Eclipse installieren getan. ;) Die Sprache ist mächtig, aber eben auch ein riesen-Moloch. Wenn ich eine vollkommen neue Sprache lernen muss, um die konzeptionelle Seite der Objektorientierung zu üben, dann sollte die Sprache möglichst einfach und eingängig gehalten sein. Ich möchte kein Videospiel entwicklen und auch keine berufliche Karriere draus machen, sondern einfach mal in ein paar Stunden mir selbst ein paar Fragen beantworten.

Deswegen hab ich auch die anderen genannt, die ich zumindest schonmal gesehen habe. Ist zwar auch schon wieder mindestens 6 Jahre her, aber das geht wahrscheinlich trotzdem flotter...
 
Dann nimm C#, wirst nur trotzdem nicht schneller vorankommen wenn du die Sprache nicht kennst, denn ob du nun die Standardbibliotheken von Java nimmst oder die von .NET in C# nutzt, macht nicht wirklich einen Unterschied, einlesen müssen wirst du dich in beiden Fällen.
Ansonsten hast du so ziemlich das gleiche was die Klassen an sich angeht.
 
Wenn Du Python schon leidlich beherrscht, bietet sich das doch an. Was an der Implementierung grauselig sein soll, weiß ich nicht. Aber das war ja auch erst mal nur eine Aussage.

Python ist halt eher pragmatisch, denn dogmatisch. Um Dich mit Objektorientierung vertraut zu machen, aber IMHO dicke hinreichend. Es gibt auf jeden Fall jede Menge Tutorials im Netz...
 
CB_KeinNameFrei schrieb:
Wenn man noch nie im Leben Java programmiert hat, ist es eben nicht einfach mit Eclipse installieren getan. ;)
Du musst noch das Java SDK installieren, aber damit ist es dann auch getan. Es spricht aber auch nichts dagegen, nur das Java SDK zu installieren und erstmal nur per Texteditor Programme zu schreiben.
Das dicke Plus an Java ist auch die verdammt gute Dokumentation und dass man relativ "einfach" programmieren kann. Man muss sich nicht mit Speicherverwaltung oder Pointern rumschlagen.
Du kannst dir z.B. auch mal ein Uni-Skript zum lernen angucken
http://www-ai.math.uni-wuppertal.de...che_Einf--uehrung/01_Skript_zur_Vorlesung.php
oder ein ziemlich gutes und ausführliches Buch
http://openbook.galileocomputing.de/javainsel/

Falls du aber defnitiv nicht mit Java arbeiten willst dann eben das schon genannte C#.
 
Okay, dann probier ich mal Python aus, und wenn das nicht will bzw. sich als grauselig herausstellen sollte, dann darf C# ran :) Wurde ja von fast allen hier genannt. Danke für die Vorschläge!
 
Man übt Objektorientierung nicht mit Sprache X. Man setzt sich hin mit Papier und Bleistift. Deine ganze Abstraktionsebene ist vollkommen unabhängig von der Programmiersprache. Es macht viel mehr Sinn, so etwas handschriftlich zu skizzieren, z.B. als Mind Map. Wenn das Papier-Konzept steht kann man 10 Sprachen auf eine Dartscheibe tackern und dann blind einen Pfeil werfen um festzulegen, welche man jetzt nimmt.
 
CB_KeinNameFrei schrieb:
was soll ich als Objekt definieren, wo gehört eine Funktion hin die in einem prozeduralen Ansatz völlig für sich allein stehen würde

In eine statische Klasse mit einem sinnvollen Namen. Der Zugriff geht dann:

<Return-Type> MeinStatischeKlasse.meineFunktion(<Input>);

In ein Objekt gehört eine Methode, wenn sie von den Objekteigenschaften abhängig ist (Member-Variablen).

Achja, ich würde an deiner Stelle Java nehmen und Eclipse. Wenn dir das allen Ernstes als unkomfortabel erscheint, ... naja, dann weiß ich auch nicht.
 
Zuletzt bearbeitet:
Daaron hat hier wohl den ersten wirklich sinnvollen Hinweis an den TE gegeben.

Für beliebiges 0815-Programm mag das Vorgehen nach dem Motto "ich nehme mir meine Lieblingssprache und fang einfach mal an" gut funktionieren. Dieser Ansatz ist jedoch bei ernsthaften Projekten zum Scheitern verurteilt (und wenn mehr als eine Person dran arbeitet, dann ebenso). Stichwort hier ist Software-Entwurf (wofür man selbstverständlich eine korrekte Spezifikation benötigt).
 
Daaron schrieb:
Man übt Objektorientierung nicht mit Sprache X. Man setzt sich hin mit Papier und Bleistift. Deine ganze Abstraktionsebene ist vollkommen unabhängig von der Programmiersprache.


Stimmt vollkommen. Es gibt imho dennoch keinen Grund, das angeeignete Wissen im gleichen Schritt nicht auch technisch umzusetzen. Vor allem zu Beginn halte ich es für motivierend, Dinge eben gleich in Aktion sehen zu können. Davon abgesehen ist eine Programmiersprache genauso ein beschreibender Formalismus wie Stift und Papier, wenn auch weniger abstrakt - ich finde schon, dass man Objektorientierung mit einer Programmiersprache _üben_ kann.
 
Zuletzt bearbeitet:
Daaron schrieb:
...Wenn das Papier-Konzept steht kann man 10 Sprachen auf eine Dartscheibe tackern und dann blind einen Pfeil werfen um festzulegen, welche man jetzt nimmt.

Dann nehme ich Basic.
 
Zuletzt bearbeitet:
Du bist ein Opfer der wissenschaftlichen Korrektheit. Gleiche Problem wie in Mathe.
Überall werden Formeln und Beispiele hingeschmiert, mit der Meinung ein Anfänger lernt so am Besten.
Trotz ewiger extrem hoher Durchfallquoten macht sich keiner die Mühe die bisherigen Methoden anzuzweifeln.

Was ich damit sagen will, vergiss den Code, leg das Zeug erst mal zur Seite und lerne wie man lernt.
Überlege dir das Konzept und stelle es dir vor.

Was sind Objekte? In Java ist ein Objekt nix anderes als die "Kopie" einer Klasse, samt deren Feldern und Methoden.
Bei jedem new... wird einfach so eine "Kopie" einer Klasse in eine Variable gesteckt, über die man dann an deren Inhalt kommt.
Denke in Kisten, nicht in Code :>

In der Java API Doku rumschnüffeln ist besser als Anfänger Programmier Bücher zu büffeln. Wenn du genau hinschaust, siehst du wie Java strukturiert ist. Alles besteht aus Klassen (Objekten) die "kopiert" werden, oder per Vererbung erweitert werden. Erbt eine Klasse von einer anderen, so hat sie ihre eigenen Methoden und die der Oberklasse.

Und in Java gibt es keine wirklichen Funktionen, man simuliert sie nur indem man den Methoden ein static davor schreibt.
Was heißt das? Erstellt man von einer Klasse ein Objekt, also mit new..., dann ist es eine Kopie die unabhängig von den anderen Kopien ist, will heißen man kann in jedem Objekt Daten ändern ohne dass sie sich gegenseitig beinflussen können. Setzt man ein static davor, macht man diese Unabhängigkeit kaputt - man verlässt die Objektorientierung. Alle Änderungen an den Variablen sind dann in einer Box, alle Zugriffe darauf ändern direkt den Wert - egal von wo. Stell dir ein Logfenster vor. Will man aus allen Objekten in das gleiche Fenster schreiben, so wird das Fenster mit static programmiert. Kontrollmittel ob und wie sich etwas verhält hat man in Java mit "final" und "static".

Und das ist bei langem Code sehr übel, deswegen Objekte. Wenn da etwas nicht funktioniert, dann nur innerhalb eines kleinen Umfeldes. Ohne Objektorientierung kann alles mögliche an jeder Stelle alles mögliche verändern. Z.b. man hat 10.000 Funktionen die alle in das Logfenster schreiben. Dann taucht ein Fehler in der Log auf - tja, welche Funktion hat nun Mist gebaut? Mit Objekten peilt der Compiler das das sofort, dann müsste man keine 10.000 Funktionen durchgehen, sondern nur die 10 Methoden in dem Objekt.

Und weiter gehts. Abstrakte Klassen...tja was ist das wieder. In Java gibt es zwei "Platzhalter" für Methoden, wo man zum Zeitpunkt der Programmierung nicht weiß was es tun soll. Das sind Interfaces und die abstract Methoden/Klassen. Ist eine Methode abstract, dann auch die Klasse - dies verhindert dass man von unfertigen "Methoden" Objekte erzeugt. Methoden die abstract sind haben nur einen Kopf also "int test();"
Wozu ist das gut? Man will Eine Methode für einen PKW Hersteller schreiben, die Kosten für einen Wagen berechnet der in 1 Jahr gebaut wird. Man hat keine Ahnung was es kosten soll, kann aber schon mal die Struktur festlegen und das einbauen was man weiß. In 1 Jahr programmiert man das in einer Klasse aus, von der man dann wieder Objekte erzeugen kann. Man muss also gar nicht wissen was die 1 Jahr alte Klasse genau tut, man muss nur wissen was noch zu tuen ist :)
Wenn man dann von dieser Klasse erbt, also mit "extends" <abstrakte Klasse>, dann muss man den Kram der abstract ist implementieren, oder es erneut als abstract definieren und so das Problem weiter schieben :>

Interfaces bestehen nur aus solchen unfertigen Methoden, ist also ein Strukturierungsmittel. Abstrakte Klassen sind also eine Mischung aus "vollständigen" Methoden und Methoden Platzhaltern.

Dann weiter zur Rekursion. Man stelle sich vor bei jedem Aufruf der gleichen Methode wird eine neue "box" mit dem gleichen Code daneben gepackt. Der Code läuft von oben nach unten ab, was einmal abgearbeitet wurde, wird nicht erneut aufgerufen. Die Boxen werden so lange aneinander gereiht bis nicht ein Abbruchkriterum kommt, dass den erneuten Aufruf verhindert. Wenn dies passiert, kommt der JoJo Effekt. Die lezte Box überspringt also den Methoden Aufruf, und arbeitet den Code "unter" diesem Aufruf ab bis es zu einem return etc. kommt. Das return gibt einen Wert an die Box links daneben. In dieser Box läuft der Code auch weiter wo er aufhörte, d.h. unter dem Rekursionsaufruf. Das rollt dann rückwärts bis zu ersten Box. Wenn einem dies Klar ist, kann man z.b. eine Zahlenfolge vorwärts oder rückwärts ausgeben. Z.b. wird bei jedem Aufruf eine Variable inkrementiert. Ist der Output vor dem Rekursionsaufruf, wird er sofort ausgegeben. Ist er danach, wird erst die Variable der letzten Box ausgegeben, dann der vorlezten usw. Dieses Prinzip hat später große Bedeutung für Listen, Bäume und sonstigen schwierigeren Kram (PreOrder, PostOrder, InOrder...).

Hoffe du verstehst was ich sagen will. Lerne wie Dinge funktionieren, nicht wie man sie programmiert. Das programmieren ist die einfache Geschichte und dauert nicht lange wenn das Konzept klar ist. Besonders bei der Rekursion wird das klar. Ein Methodenaufruf und paar Variablen knocken im Studium reihenweise Leute aus.
Würden die Proffs auf wissenschaftliche Korrektheit pfeifen und mit Schuhkartons Beispiele bringen, würde kaum wer durchfallen. Wenn das Prinzip dann klar ist, dann man es immer noch wissenschaftlich definieren - aber nicht vorher.
 
Zuletzt bearbeitet von einem Moderator:
Rob, genau solche Ansätze verfolgt man ja, indem man das Problem in einer Mind Map erst einmal grob visualisiert und danach evtl. einen Programmablaufplan oder ein anderes Planungsschema verwendet, um die einzelnen Abschnitte zu konkretisieren.

Leider will kaum jemand den theoretischen Aspekt der Anwendungsentwicklung lernen, ja noch nicht einmal was davon hören. Nein, alles muss sofort in Code gegossen werden, selbst wenn man noch nicht einmal weiß, welche Sprache es werden soll.
 
Ich für meinen Teil finde das Ausarbeiten der Logiken und Konzepten irgendwie spannender als das eigentlich code eintippen danach -,-
Da bin ich demnach wohl eine Ausnahme :D

@ rob-
gute Erklärung und trifft den Nagel auf den Kopf.
In der Lehre habe ich lange gebraucht bis ich das eine oder andere in der OO begriffen habe, obwohl ich eigentlich stark im logischne denken bin. Hätte mir damals jemand das ganze auf die Art erklärt, hätte sich das Blatt schneller gewendet :D

Erst als ich in einer neuen Abteilung war und der Chef dort mir das auf eine andere weise gezeigt hat, hatte ich langsam durchblick...

Das was wir in der Schule hatten, brachte mir nicht mal ein prozent -.-
 
CB_KeinNameFrei schrieb:
Okay, dann probier ich mal Python aus, und wenn das nicht will bzw. sich als grauselig herausstellen sollte, dann darf C# ran :) Wurde ja von fast allen hier genannt. Danke für die Vorschläge!
Mit Python wird es allerdings schwieriger das objektorientierte programmieren zu lernen. Mit Python kann man objektorientiert programmieren, man kann es aber auch lassen. Das heißt, es ist alleine von dir abhängig ob das Programm wirklich objektorientiert wird nicht oder nicht. Das ist bei C++ ähnlich. Du musst dich also erst mit der Theorie der objektorientierten Programmierung befassen bevor du mit Python objektorientiert programmieren kannst.
Java ist da z.B. anders. Da kannst du im Grunde gar nicht anders als objektorientiert zu arbeiten. Wenn du anfängst in Java zu programmieren, wirst du gezwungen dich mit Methoden, Klassen, Abstraktion, Vererbung etc. zu befassen.

Was einem besser liegt muss jeder für sich entscheiden. Daaron kann besser lernen, in dem er sich erst mit der Theorie befasst und dann praktisch tätig wird (das passt dann auch zu deinem Python-Ansatz). Ich lerne besser mit learning-by-doing (und würde mir daher eine konsequent objektorietierte Sprache nehmen und mit der anfangen zu programmieren, um dann immer nachzuschauen, wie man bestimmte Dinge lösen kann). Da hat jeder seine eigenen Vorlieben.
 
Eine der wichtigsten Regeln lautet auch hier: Teile und herrsche.
Mit einem "ich schreib einfach los" - Ansatz kann man Probleme zwar auch lösen, man muss dann aber im Zweifel die Sachen vom Anfang noch 10x umschreiben. Wenn man statt dessen direkt von Anfang an einen vernünftigen Plan aufschreibt, was das Programm tun soll, was es nicht tun soll, wie es gewisse Dinge wohl tun soll,... dann kann man das Programm danach Stück für Stück aufbauen, ohne Segmente laufend neu zu schreiben.
 
Raybeez schrieb:
Mit Python wird es allerdings schwieriger das objektorientierte programmieren zu lernen. Mit Python kann man objektorientiert programmieren, man kann es aber auch lassen. Das heißt, es ist alleine von dir abhängig ob das Programm wirklich objektorientiert wird nicht oder nicht. Das ist bei C++ ähnlich. Du musst dich also erst mit der Theorie der objektorientierten Programmierung befassen bevor du mit Python objektorientiert programmieren kannst.
Java ist da z.B. anders. Da kannst du im Grunde gar nicht anders als objektorientiert zu arbeiten.

Dem kann ich nicht zustimmen. In Python ist das Erlernen objekt-orientierter Programmierung keinen Deut schwieriger als in Java. Täusch dich nicht, bloß weil dein Programm keine Funktionen sondern mur Klassenmethoden enthält, muß das noch lange nicht bedeuten, daß du auch im Sinne von OOP programmiert hast. Ich habe zum Beispiel schon einige Programme gesehen, die im Wesentlichen aus einer einzigen Monsterklasse und ein paar Methoden bestand und der Author überzeugt war, sein Programm wäre objektorientiert. Schließlich kam in seinem Code ja das Schlüsselwort "class" vor.
 
Zurück
Oben