Was bedeutet objektorientiert?

6 Antworten

Vom Beitragsersteller als hilfreich ausgezeichnet

Anstatt von objektorientiert, kannst du noch statisch programmieren.

Objektorientiert, heißt einfach, dass du für alles Objekte erstellst, diese modelierst du mit Klassen. So geht das immer weiter.

Bei statischem programmieren musst du keine Objekte erzeugen, sondern kannst Funktionen direkt über die Klasse aufrufen.

Woher ich das weiß:Berufserfahrung – Anwendungsentwickler (vorwiegend .NET)

ezrtaheraahrer 
Beitragsersteller
 11.08.2020, 15:06

was sind Objekte? also beim Programmieren

0
BlazedTowel  11.08.2020, 15:11
@ezrtaheraahrer

Objekte, sind halt Objekte.^^ Sie haben Eigenschaften und Methoden. Du kannst dir das vorstellen wie ein Objekt in der Realität. Beispielsweise erstellst du eine Klasse "Mensch". Diese Klasse hat als Eigenschaft einen Namen und ein Alter.

So erstellst du nun ein Objekt, der Klasse "Mensch" (Pseudocode):

Mensch mensch1 = new Mensch();

auf die Eigenschaften könnte man jetzt bspw. so drauf zugreifen:

mensch1.Name = "Peter";
mensch1.Alter = 43;

Genauso gut könnte er noch die Mehtode "laufen" haben:

mensch1.Laufe();

Man kann es schwer erklären, ohne einen Praxisbezug zu haben. Wenn du anfängst zu programmieren, dann erschließt sich das meiste ziemlich schnell von selbst.

1
ezrtaheraahrer 
Beitragsersteller
 11.08.2020, 15:12
@BlazedTowel

also wie eine Infotabelle? der Mensch1 ist das Objekt und name und Alter die Attribute/Variablen?

0
BlazedTowel  11.08.2020, 15:19
@ezrtaheraahrer

Genau, der "mensch1" ist das Objekt und "Name" und "Alter" sind die Attribute. Aber nicht falsch verstehen -> Name und Alter sind an sich auch Objekte

1
ezrtaheraahrer 
Beitragsersteller
 11.08.2020, 15:21
@BlazedTowel

also sind klassen nur nützlich, wenn man seinen variablen keine selbsterklärenden Namen gibt?

0
BlazedTowel  11.08.2020, 15:25
@ezrtaheraahrer

Hab ausversehen als richtige Antwort geantwortet:

Nein, Klassen stellen das Gerüst für ein Objekt bereit. Also zu dem Code-Beispiel oben, würde die Klasse so aussehen:

public class Mensch
{
  public string Name { get; set; }  
  public int Alter { get; set; }  

  public void Laufe()
  {
    //Mensch läuft
  }
}

So würde die Klasse in C# modeliert aussehen.

1

Stell dir vor, du willst ein Auto in einem Spiel programmieren. Du bräuchtest die Variable veloc für die Geschwindigkeit, müsstest eine Funktion für die Beschleunigung func accel() und das Bremsen func brake() schreiben.

Da die Funktionen ja die Geschwindigkeit ändern sollen, müsstest du die Variable veloc global definieren, was bei komplexen Code selten eine gute Idee ist.

Die Funktionen und Variablen leben also selbstständig für sich, obwohl ein Auto in der Realität ja eigentlich nur ein Objekt ist. In der objektorientierten Programmierung versuchst du dies nun auch im Programm umzusetzen.

Du definiert z. B. eine Klasse car und schreibst in diese Klasse eben alles, was zu einem Auto dazugehört. Dies beinhaltet dessen Eigenschaften und auch Funktionen.

Du würdest also in dieser Klasse eine private Variable car.veloc definieren, welche nur von Funktionen in der Klasse selbst verändert werden kann, z. B. durch die Funktionen car.accel() und car.brake(). So stellst du sicher, dass nur über die Klassenfunktionen diese Variable verändert werden kann.

Eine Klasse ist aber nicht existent, sondern vielmehr eine platonische Idee. Wenn du ein "echtes" Auto in deinem Programm erzeugen willst, dann musst du erst eines aus dieser Klasse als Instanz erzeugen, z. B.

meinAUTO = car()

Jetzt kannst du dein Auto z. B. mit meinAUTO.accel() beschleunigen.

Objektoriente Programmierung macht deinen Code übersichtlicher und sicherer. In deinem Programm existieren Objekte, welche über ihre Funktionen miteinander interagieren und kommunizieren können, so wie im echten Leben.


weckmannu  11.08.2020, 15:05

Hilfreicher wäre, wir bekommen den Code für ein konkretes Beispiel.

Mit obiger Antwort kann ich leider nicht viel anfangen. Trotzdem vielen Dank für die Bemühung.

1
neutrino666  11.08.2020, 15:10
@weckmannu

Code für welche Sprache? Wenn man Antworten allgemeiner fasst, läuft es eben auf Pseudocode hinaus. Die spezielle Umsetzung hängt dann von der jeweiligen Programmiersprache ab.

In Python sieht es sehr einfach aus:

class MyClass:

 x = 5

p1 = MyClass()

print(p1.x)

Oben findet man die abstrakte Klasse mit einer Variablen. Unten wird die Instanz p1 dieser Klasse erstellt und verwendet.

0
ezrtaheraahrer 
Beitragsersteller
 11.08.2020, 15:11

kann man nicht auch einfach die Variable vauto nennen? dann braucht man ja die klasse nicht, man weiß ja so schon was gemeint ist

0
neutrino666  11.08.2020, 15:43
@ezrtaheraahrer

Unbedingt musst du nicht mit Klassen arbeiten. Aber in komplexen Programmen verliert man schnell die Übersicht und oft arbeiten auch mehrere unterschiedliche Programmierer zusammen.

In kleineren Programmen mit nur einem Objekt würde ich auch keine Klasse erstellen, aber du hast ja auch mal mit mehrere Objekten einer oder verschiedener Klassen zu tun. Du willst in deinem Programm vielleicht eine Straße mit vielen Autos und Busen simulieren.

Klassen sind einfach dann übersichtlicher und sicherer, weil du weißt, dass eine Variable nur über eine Klassenfunktion geändert worden sein kann. Bei globalen Variablen könnte diese in jeder Funktion oder jedem Teilprogramm geändert worden sein. Ein Blick auf die definierte Klasse sagt dir auch immer, was so ein Objekt später dann für Eigenschaften oder Funktionen haben kann.

1
ezrtaheraahrer 
Beitragsersteller
 11.08.2020, 15:54
@neutrino666

kannst du mir ein Python Anfängerprojekt vorstellen, bei dem Klassen nützlich sind? Würde sowas gerne so früh wie möglich lernen.

0
neutrino666  11.08.2020, 16:08
@ezrtaheraahrer

Es gibt ja genügend Beispiele im Internet, wie hier z. B.:

https://python101.pythonlibrary.org/chapter11_classes.html

Hinter class... folgt die Klassendefinition. Mit def legst du die Funktionen in der Klasse fest und mit self.color wird z. B. die Variable color in der Klasse erzeugt.

Es gibt nun auch die Möglichkeiten eigene Konstruktoren der Klasse festzulegen. Definierst du keinen, wird ein Standardkonstruktor eingesetzt (du benötigst Konstruktoren, wenn du ein Objekt zu der Klasse erstellen wirst; hier werden dann die Klassenvariablen für das Objekt initialisiert; in manchen Programmiersprachen wie C++ setzt man auch Destruktoren ein, um die Objekte wieder aus dem Speicher zu löschen).

Die Definition des Konstruktors findest du unter def __init__.

In dem Beispiel hat deine Klasse nun 3 Variablen mit color, doors und tire und mit drive und brake zwei Funktionieren. Mit car = Vehicle("red", 3, 6) im Hauptprogramm rufst du nun den Konstruktor der Klasse auf, der dir dann das Objekt car zu der Klasse Vehicle erzeugt, mit all seinen Variablen und Funktionen.

Nun kannst du über car.drive(), car.brake() und car.color auf die Variablen und Funktionen zugreifen. Manchmal empfiehlt es sich sogar noch Funktionen für das Ändern von Variablen zu schreiben. Du würdest dann eine Funktion in der Klasse mit z. B. def changecolor... definieren und dann über diese Klassenfunktion die Klassenvariable verändern.

1

Python ist eine Multiparadigmensprache. OOP beutetet nicht anderes, daß Daten und auf ihnen anwendbare Operationen (Methoden) zusammengefasst werden.

Und ja, Pyhton ist in weiten Teilen durchaus OOP-lastig, weil Datentypen wie Strings eben Methoden zu deren Manipulation mitbringen.

Leider ist die OP sehr umfangreich und ich kann nicht alle vor/Nachteile darlegen. Deshalb nur zwei mir wichtige Punkte.

In der Theorie bringt dir die Objektorientiertheit nichts. Alles, was man theoretisch umsetzten kann, kann man auch mit Hilfe imperativer Sprachen tun. Ich selber habe erst relativ spät mit Objektorientierung angefangen und das hat auch nicht geschadet, bis heute habe ich oftmals auch andere Ideen beim Lösen von Problemen als welche, die direkt mit der OP angefangen haben. Auch Python verwende ich bis heute meistens ohne eigene Klassen zu definieren.

Wozu gibt es die OP also überhaupt?

Grundsätzlich ist sie ein Gedankenmodell welches hilft, Dinge aus der realen Welt als Daten und Funktionen ( welche dann Methoden heißen ) abzubilden.

Das heißt, wir können eine Klasse bilden, typisches Beispiel ist z.B. wir wollen ein Zug simulieren.

Wir können eine Klasse Zug erstellen, die hat dann Eigenschaften wie z.B. Farbe des Zuges, Geschwindigkeit etc.

Class Zug:

farbe = grün

Geschwindigkeit = 0

Und außerdem gibt es Dinge, die so ein Zug machen kann, dass sind dann die Methoden ( also wie gesagt, einfach nur Funktionen innerhalb einer Klasse )

Class Zug:

[...]

# eine Methode der Klasse Zug

def fahre_schneller: Geschwindigkeit += 1

def umlackieren(neueFarbe) : farbe = neueFarbe

Nun können wir mehrere Züge erstellen, denn eine Klasse ist eine Art Bauplan. Diese können unterschiedlich schnell fahren, wir können sie umlackieren etc.

wir erstellen zwei Züge

zug1 = Zug()

zug2 = Zug()

Wenn z.B. zug zwei schneller fahren soll, können wir jetzt zug2.fahre_schneller() aufrufen. Die Variable Geschwindigkeit in zug2 wird dann also erhöht.

Da sieht man bereits einen Vorteil, Datenkapselung. Das heißt, man kann ( wenn man das möchte) nur über eine Methode auf variablen zugreifen. Da können dann z.B. abfragen gemacht werden, also Z.B. bevor die Geschwindigkeit erhöht wird, ist vlt schon die Maximalgeschwindigkeit erreicht? Bei direktem Zugriff auf die Variable in Z.B. einem Array, hätte der Benutzer einfach eine neue Geschwindigkeit eingeben können. Das könnte ein potentielles Sicherheitsproblem sein.

Und dieses Konzept lässt sich auf vieles anwenden. Logischeres Beispiel sind z.B. Benutzer einer Website.

Dann kann man z.B. haben, Benutzer.anmelden() etc.

Diese Art auf Daten und Funktionen eines Objektes zuzugreifen, kann durchaus als relativ intuitiv angesehen werden.

Also Nummer 1 ist Strukturierung. Die OP bietet aber noch viel mehr. Schaue einfach in die offizielle Doku von Python, da ist alles erklärt.

https://docs.python.org/3/tutorial/classes.html

Als weiteren Punkt gibt es so genannte Software Design Pattern. Das sind quasi eine Art Vorgaben, wie man bestimmte Dinge lösen kann und die man immer wieder verwenden kann. Damit kann man z.B. die Wartbarkeit von Code erhöhen, da man einzelne Codefragmente entkoppelt.

https://de.m.wikipedia.org/wiki/Entwurfsmuster

Außerdem, ok, dass ist schon ein dritter Punkt, kann man so genannte UML Klassendiagramme erstellen. Das ist vor allem bei großen Projekten ein Vorteil, da man sich so schneller einen Überblick über ein Projekt verschaffen kann. Man hat dann also ein Diagramm / eine Zeichnung von seinem Programm, welche natürlich besser zu lesen ist, als Code es ist.

Zu aller letzt möchte ich noch darauf hinweisen, dass Python auch funktionale Eigenschaften hat. Python ist ein wahres Multitalent. :)

Ich hoffe ich konnte einen kleinen Überblick geben.

PS: Schaue dir einfach Mal die Wikipedia Seite über OP an, da wird natürlich noch viel mehr genannt.

Nachteile von ob sind z.B.

  • Mehr Overhead, man schreibt oftmals viel Code zum strukturieren, der aber eigentlich keine wirkliche Funktion zum Lösen des Problems hat
  • Möglicherweise geringere Performance

Nein, Klassen stellen das Gerüst für ein Objekt bereit. Also zu dem Code-Beispiel oben, würde die Klasse so aussehen:

public class Mensch
{
  public string Name { get; set; }  
  public int Alter { get; set; }  

  public void Laufe()
  {
    //Mensch läuft
  }
}

So würde die Klasse in C# modeliert aussehen.

Woher ich das weiß:Berufserfahrung – Anwendungsentwickler (vorwiegend .NET)