JavaRush /Java-Blog /Random-DE /OOP-Prinzipien

OOP-Prinzipien

Veröffentlicht in der Gruppe Random-DE
Hallo! Haben Sie sich jemals gefragt, warum Java so konzipiert ist? In dem Sinne, dass Sie darauf basierende Klassen erstellen – Objekte, Klassen haben Methoden usw. Aber warum ist die Struktur der Sprache so, dass Programme aus Klassen und Objekten bestehen und nicht aus etwas anderem? Warum wurde der Begriff „Objekt“ erfunden und in den Vordergrund gerückt? Funktionieren alle Sprachen auf diese Weise und wenn nicht, welche Vorteile bietet es Java? Wie Sie sehen, gibt es viele Fragen :) Versuchen wir, jede davon in der heutigen Vorlesung zu beantworten.

OOP-Prinzipien:

  1. Nachlass
  2. Abstraktion
  3. Verkapselung
  4. Polymorphismus

Was ist objektorientierte Programmierung (OOP)?

Natürlich besteht Java aus einem bestimmten Grund aus Objekten und Klassen. Dies ist keine Laune seiner Schöpfer oder gar ihre Erfindung. Es gibt viele andere Sprachen, die auf Objekten basieren. Die erste derartige Sprache hieß Simula und wurde bereits in den 1960er Jahren in Norwegen erfunden. Simula führte unter anderem die Konzepte „ Klasse “ und „ Methode “ ein. Prinzipien der objektorientierten Programmierung - 2
Kristen Nygaard und Ole Johan Dahl – Schöpfer von Simula
Es scheint, dass Simula nach Programmierstandards eine alte Sprache ist, aber ihre „Familien“-Verbindung zu Java ist mit bloßem Auge erkennbar. Höchstwahrscheinlich können Sie den darauf geschriebenen Code leicht lesen und allgemein erklären, was er tut :)
Begin
  Class Rectangle (Width, Height); Real Width, Height;

   Begin
      Real Area, Perimeter;

      Procedure Update;
      Begin
        Area := Width * Height;
              OutText("Rectangle is updating, Area = "); OutFix(Area,2,8); OutImage;
        Perimeter := 2*(Width + Height);
              OutText("Rectangle is updating, Perimeter = "); OutFix(Perimeter,2,8); OutImage;
      End of Update;

      Update;
      OutText("Rectangle created: "); OutFix(Width,2,6);
      OutFix(Height,2,6); OutImage;
   End of Rectangle;

       Rectangle Class ColouredRectangle (Color); Text Color;

  Begin
      OutText("ColouredRectangle created, color = "); OutText(Color);
      OutImage;
        End of ColouredRectangle;


         Ref(Rectangle) Cr;
   Cr :- New ColouredRectangle(10, 20, "Green");
End;
Das Codebeispiel ist dem Artikel Simula – 50 Jahre OOP entnommen . Wie Sie sehen, unterscheiden sich Java und sein Vorfahre nicht so sehr voneinander :) Dies liegt daran, dass das Erscheinen von Simula die Geburt eines neuen Konzepts markierte – der objektorientierten Programmierung. Wikipedia gibt die folgende Definition von OOP: Objektorientierte Programmierung (OOP) ist eine Programmiermethode, die auf der Darstellung eines Programms als Sammlung von Objekten basiert, von denen jedes eine Instanz einer bestimmten Klasse ist und die Klassen eine Vererbungshierarchie bilden. Meiner Meinung nach ist es sehr erfolgreich. Sie haben vor kurzem begonnen, Java zu lernen, aber es gibt kaum Wörter darin, die Ihnen unbekannt sind :) Heute ist OOP die am weitesten verbreitete Programmiermethode. Neben Java werden OOP-Prinzipien in vielen gängigen Sprachen verwendet, von denen Sie vielleicht schon gehört haben. Dies sind C++ (es wird aktiv von Computerspielentwicklern verwendet), Objective-C und Swift (sie schreiben Programme für Apple-Geräte), Python (am gefragtesten im Bereich maschinelles Lernen), PHP (eine der beliebtesten Webentwicklungssprachen), JavaScript (einfacher gesagt, was sie nicht damit machen) und viele andere. Was sind eigentlich diese „Prinzipien“ von OOP? Lassen Sie uns es Ihnen genauer erzählen.

OOP-Prinzipien

Das sind die Grundlagen. 4 Hauptmerkmale, die zusammen das objektorientierte Programmierparadigma bilden. Sie zu verstehen ist der Schlüssel, um ein erfolgreicher Programmierer zu werden. Prinzipien der objektorientierten Programmierung - 3

Prinzip 1. Vererbung

Die gute Nachricht ist, dass Sie bereits mit einigen Prinzipien von OOP! vertraut sind. :) Wir sind in Vorlesungen bereits einige Male mit der Vererbung in Berührung gekommen und hatten Zeit, uns damit zu beschäftigen. Vererbung ist ein Mechanismus, der es Ihnen ermöglicht, eine neue Klasse basierend auf einer vorhandenen (übergeordneten) Klasse zu beschreiben. In diesem Fall werden die Eigenschaften und Funktionalitäten der übergeordneten Klasse von der neuen Klasse übernommen. Warum ist eine Erbschaft notwendig und welche Vorteile bietet sie? Zunächst einmal die Wiederverwendung von Code. In übergeordneten Klassen beschriebene Felder und Methoden können in untergeordneten Klassen verwendet werden. Wenn alle Fahrzeugtypen 10 gemeinsame Felder und 5 identische Methoden haben, müssen Sie diese nur in die übergeordnete Klasse einfügen Auto. Sie können sie problemlos in abgeleiteten Klassen verwenden. Solide Vorteile: sowohl quantitativ (weniger Code) als auch qualitativ (Klassen werden viel einfacher). Gleichzeitig ist der Vererbungsmechanismus sehr flexibel und Sie können die fehlenden Funktionen in den Nachkommen separat hinzufügen (einige Felder oder klassenspezifisches Verhalten). Im Allgemeinen gilt wie im normalen Leben: Wir sind alle in mancher Hinsicht unseren Eltern ähnlich, unterscheiden uns aber in mancher Hinsicht von ihnen :)

Prinzip 2. Abstraktion

Das ist ein sehr einfaches Prinzip. Abstraktion bedeutet, die wichtigsten und bedeutsamsten Eigenschaften eines Objekts hervorzuheben und umgekehrt – sekundäre, unbedeutende Eigenschaften zu verwerfen. Erfinden wir das Rad nicht neu und erinnern uns an ein Beispiel aus einer alten Vorlesung über Unterricht. Nehmen wir an, wir erstellen ein Archiv mit den Mitarbeitern des Unternehmens. Um Mitarbeiterobjekte zu erstellen, haben wir eine Klasse geschrieben Employee. Welche Merkmale sind für die Beschreibung in der Firmenakte wichtig? Vollständiger Name, Geburtsdatum, Sozialversicherungsnummer, Steueridentifikationsnummer. Aber es ist unwahrscheinlich, dass wir auf einer Karte dieser Art seine Größe, Augen- und Haarfarbe benötigen. Das Unternehmen benötigt diese Informationen über den Mitarbeiter nicht. Daher Employeewerden wir für die Klasse die Variablen , und festlegen String nameund int ageauf int socialInsuranceNumberfür int taxNumberuns unnötige Informationen wie die Augenfarbe verzichten und diese abstrahieren. Wenn wir aber für eine Agentur einen Katalog mit Fotomodellen erstellen, ändert sich die Situation dramatisch. Um ein Model zu beschreiben, sind uns Größe, Augenfarbe und Haarfarbe sehr wichtig, die TIN-Nummer ist jedoch nicht erforderlich. Daher Modelerstellen wir in der Klasse Variablen String height, String hair, String eyes.

Prinzip 3: Kapselung

Wir sind bereits darauf gestoßen. Kapselung in Java bedeutet, den Zugriff auf Daten und die Möglichkeit, diese zu ändern, einzuschränken. Wie Sie sehen, basiert es auf dem Wort „Kapsel“. In dieser „Kapsel“ verbergen wir einige für uns wichtige Daten, die niemand ändern soll. Ein einfaches Beispiel aus dem Leben. Sie haben einen Vor- und Nachnamen. Jeder, den Sie kennen, kennt sie. Sie haben jedoch keinen Zugriff darauf, Ihren Vor- und Nachnamen zu ändern. Man könnte sagen, dieser Vorgang ist im Passamt „gekapselt“: Nur dort können Sie Ihren Vor- und Nachnamen ändern, und nur Sie können es tun. Andere „Benutzer“ haben nur lesenden Zugriff auf Ihren Vor- und Nachnamen :) Ein weiteres Beispiel ist das Geld in Ihrer Wohnung. Es ist keine gute Idee, sie sichtbar mitten im Raum zu lassen. Jeder „Benutzer“ (eine Person, die zu Ihnen nach Hause kommt) kann die Anzahl Ihres Geldes ändern, d. h. Hole sie ab. Es ist besser, sie in einem Safe einzukapseln. Nur Sie haben Zugriff und nur mit einem speziellen Code. Offensichtliche Beispiele für Kapselung, mit denen Sie bereits gearbeitet haben, sind Zugriffsmodifikatoren ( privateusw. public) und Getter-Setter. Wenn das ageKlassenfeld Catnicht gekapselt ist, kann jeder schreiben:
Cat.age = -1000;
Und der Kapselungsmechanismus ermöglicht es uns, das Feld agemit einer Setter-Methode zu schützen, mit der wir überprüfen können, dass das Alter keine negative Zahl sein darf.

Prinzip 4. Polymorphismus

Polymorphismus ist die Fähigkeit, mehrere Typen so zu behandeln, als wären sie derselbe Typ. In diesem Fall unterscheidet sich das Verhalten von Objekten je nach Typ, zu dem sie gehören. Klingt etwas kompliziert? Lass es uns jetzt herausfinden. Nehmen wir das einfachste Beispiel: Tiere. Erstellen wir eine Klasse Animalmit einer einzigen Methode – voice()und zwei ihrer Nachkommen – Catund Dog.
public class Animal {

   public void voice() {

       System.out.println("Stimme!");
   }
}

public class Dog extends Animal {


   @Override
   public void voice() {
       System.out.println(„Wow-wow!“);
   }
}

public class Cat extends Animal {

   @Override
   public void voice() {
       System.out.println("Miau!");
   }
}
Versuchen wir nun, einen Link zu erstellen Animalund ihm ein Objekt zuzuweisen Dog.
public class Main {

   public static void main(String[] args) {

       Animal dog = new Dog();
       dog.voice();
   }
}
Welche Methode wird Ihrer Meinung nach aufgerufen? Animal.voice()oder Dog.voice()? Die Klassenmethode wird aufgerufen Dog: Woof-woof! Wir haben eine Referenz erstellt Animal, aber das Objekt verhält sich wie Dog. Bei Bedarf kann er sich wie eine Katze, ein Pferd oder ein anderes Tier verhalten. Die Hauptsache besteht darin, Animaleinem Objekt einer bestimmten Nachkommenklasse eine Referenz eines allgemeinen Typs zuzuweisen. Das ist logisch, denn alle Hunde sind Tiere. Das haben wir gemeint, als wir sagten: „Objekte verhalten sich unterschiedlich, je nachdem, um welchen Typ es sich handelt.“ Wenn wir ein Objekt erstellen würden Cat
public static void main(String[] args) {

   Animal cat = new Cat();
   cat.voice();
}
Die Methode voice()würde „Meow!“ ausgeben. Was bedeutet „die Fähigkeit, mit mehreren Typen zu arbeiten, als wären sie derselbe Typ“? Das geht auch ganz einfach. Stellen wir uns vor, wir gründen einen Friseursalon für Tiere. Unser Friseursalon muss in der Lage sein, alle Tiere zu schneiden, daher erstellen wir eine Methode shear()(„Schnitt“) mit einem Parameter Animal– dem Tier, das wir schneiden werden.
public class AnimalBarbershop {

   public void shear(Animal animal) {

       System.out.println(„Der Haarschnitt ist fertig!“);
   }
}
shearUnd jetzt können wir sowohl Objekte Catals auch Objekte an die Methode übergeben Dog!
public static void main(String[] args) {

   Cat cat = new Cat();
   Dog dog = new Dog();

   AnimalBarbershop barbershop = new AnimalBarbershop();

   barbershop.shear(cat);
   barbershop.shear(dog);
}
Hier ist ein klares Beispiel: Die Klasse AnimalBarbershoparbeitet mit Typen Cat, als Dogwären sie vom gleichen Typ. Gleichzeitig haben sie Catein unterschiedliches DogVerhalten: Sie nutzen ihre Stimmen anders.

Gründe für das Auftreten von OOP

Warum ist dieses neue Programmierkonzept – OOP – überhaupt entstanden ? Programmierer verfügten über funktionierende Werkzeuge: prozedurale Sprachen zum Beispiel. Was hat sie dazu bewogen, etwas grundlegend Neues zu erfinden? Erstens die Kompliziertheit der Aufgaben, vor denen sie standen. Wenn vor 60 Jahren die Aufgabe eines Programmierers so aussah: „Berechnen Sie eine mathematische Gleichung so und so“, hört es sich heute vielleicht so an, als ob „7 verschiedene Enden für das Spiel STALKER implementieren, je nachdem, welche Entscheidungen der Benutzer in den Spielmomenten A, B, C, D getroffen hat.“ , E, F und Kombinationen dieser Lösungen.“ Wie Sie sehen, sind die Aufgaben in den letzten Jahrzehnten deutlich komplexer geworden. Das bedeutet, dass die Datentypen komplexer geworden sind. Dies ist ein weiterer Grund für die Entstehung von OOP. Das Beispiel mit der Gleichung lässt sich leicht mit gewöhnlichen Grundelementen lösen, hier werden keine Objekte benötigt. Aber es wird schwierig sein, das Problem mit den Enden des Spiels überhaupt zu beschreiben, ohne einige von Ihnen erfundene Klassen zu verwenden. Gleichzeitig ist es jedoch recht einfach, es in Klassen und Objekten zu beschreiben: Wir benötigen natürlich die Game-Klasse, die Stalker-Klasse, die Ending-Klasse, die Player’s Decision-Klasse, die Game Moment-Klasse und so weiter. Das heißt, auch ohne mit der Lösung eines Problems zu beginnen, können wir uns leicht „Skizzen“ seiner Lösung in unserem Kopf vorstellen. Die zunehmende Komplexität von Problemen hat Programmierer gezwungen, das Problem in Teile zu unterteilen. Aber in der prozeduralen Programmierung war das nicht so einfach. Und sehr oft war das Programm ein „Baum“ aus einer Reihe von Zweigen mit allen möglichen Optionen für seinen Betrieb. Abhängig von bestimmten Bedingungen wurde das Programm entlang der einen oder anderen Verzweigung ausgeführt. Für kleine Programme war diese Option praktisch, aber die Aufteilung einer großen Aufgabe in Teile war sehr schwierig. Dieses Bedürfnis wurde zu einem weiteren Grund für die Entstehung von OOP. Dieses Konzept gab Programmierern die Möglichkeit, ein Programm in eine Reihe von „Modulen“ von Klassen zu unterteilen, von denen jedes seinen eigenen Teil der Arbeit erledigte. Alle miteinander interagierenden Objekte bilden die Arbeit unseres Programms. Darüber hinaus kann der von uns geschriebene Code an anderer Stelle im Programm wiederverwendet werden, was ebenfalls viel Zeit spart.
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION