[JAVA] Kenntnis der Objektorientierung für ein halbes Jahr Programmierung

Einführung

Hallo, es ist @ itti1021, das für den MakeIT AdventCalendar2018 19 Tage verantwortlich ist. Morgen wird @ yozakura121 posten.

Um eine kurze Selbsteinführung zu geben, habe ich vor etwa einem halben Jahr angefangen, Programmieren mit JavaScript zu studieren, ein Einführungsbuch über Java gelesen und mich kürzlich für PHP interessiert. (Ich möchte dieses Jahr eingrenzen)

Zuerst dachte ich daran, Code in Java zu schreiben, aber ich hatte nicht die Zeit und das Selbstvertrauen, ihn interessant zu machen, also hörte ich auf. ~~ Ich sage nicht, dass dieser Artikel interessant war. ~~

Was machst du dann? Deshalb möchte ich meine aktuelle Wahrnehmung der Objektorientierung aufschreiben. Ich habe es geschrieben, um daraus einen Artikel zu machen, aber es ist im Moment nur meine persönliche Meinung, also sei bitte sanft.

Inhalt

Was ist Objektorientierung?

Objektorientiert ist das Konzept der Komponentisierung, das in der Systementwicklung verwendet wird. ** ** ** Mit anderen Worten, die Idee ist, das Programm für den Menschen verständlicher zu machen, indem Dinge, die tatsächlich existieren, in Teile unterteilt oder ersetzt werden, die als Objekte bezeichnet werden.

Es soll die reale Welt imitieren, und wenn sich die reale Welt ändert, werden die entsprechenden Teile modifiziert oder ersetzt. Dies reduziert den Zeitaufwand für die Programmierung und verringert die Diskrepanzen bei der Multiplayer-Entwicklung.

Grundelemente in der Objektorientierung

Objektorientiert hat Elemente wie Klassen, Felder, Methoden und Instanzen, und dieses Mal werde ich auf die obigen vier eingehen.

Eine Klasse ist eine vom Programmierer definierte Gruppe von Objekten mit einem eindeutigen Namen, z. B. eine ** Konstruktionszeichnung **, die für Menschen leicht zu sehen und zu handhaben ist. Die Klasse verfügt über nachfolgend beschriebene Felder und Methoden, die beschreiben, wie es aussieht und wie es für das Thema funktioniert. (Felder und Methoden haben andere Namen, diesmal werden sie jedoch weggelassen.) Menschenklasse, Flugzeugklasse, Takoyaki-Klasse usw.

-** Feld **

Beschreiben Sie die Eigenschaften der Klasse ** und **. In der menschlichen Klasse werden beispielsweise das Augenfeld, das Nasenfeld, das Mundfeld usw. eingestellt.

-** Methode **

Beschreibe die ** Bewegung ** und ** Reaktion ** dieser Klasse. Wenn es sich um eine menschliche Klasse handelt, legen Sie die Laufmethode, die Schlafmethode, die Essmethode usw. fest.

Es ist eine ** Entität **, die tatsächlich in der aus der Klasse generierten Programmierung behandelt wird. Sie können eine menschliche Instanz aus der menschlichen Beispielklasse erstellen.

Was Sie objektorientiert sein wollen

Was ist das (Feld) Was kann getan werden (Methode) Schimmel (Klasse) Erstellen Sie eine Entität (Instanz) mit Indem Sie dies verschieben, wird die reale Welt in der virtuellen Welt reproduziert, die als Programm bezeichnet wird.

Eigentlich ein bisschen Java Code

Vorerst habe ich alle Elemente eingeführt, aber da der Text allein langweilig ist, werde ich den Java-Code veröffentlichen, der dem Inhalt von hier entspricht. (Detaillierte Zusagen wie Kompilierungsfehler und Instanziierung sowie Spielspezifikationen werden nicht berücksichtigt. Außerdem werden sie gegebenenfalls weggelassen.) ~~ Es ist schwer zu schreiben ~~ Bitte vergib mir, weil es vom Hauptthema abweicht.

スライム

Jeder weiß (?) Es ist ein Schildmonster eines berühmten Spiels. Hier ist der Java-Code zur Darstellung von Schleim mit den oben genannten vier Elementen.

Slime.java


//Klasse
public class Slime {
    //Feld
    String name = "Schleim"; // SchleimA,SchleimB,SchleimC 名前を宣言
    int hp = 5; //HP deklarieren
    int mp = 0; //MP deklarieren

    //Methode
    void attack(Hero heroInstance) {
        heroInstance.hp = hp - 1;
        System.out.println(heroInstance.name + "1 Schaden!");
    }
    void run() {
        //wird bearbeitet
        System.out.println(this.name + "Haha wurde langsam wütend!");
    }
}
//Instanziieren Sie vom Anrufer
Slime slimeInstance = new Slime();

Die Schleimklasse ist jetzt eine Schleiminstanz in der virtuellen Welt.

Drei wichtige objektorientierte Funktionen

Darüber hinaus gibt es einen Mechanismus, der die objektorientierte Programmierung erleichtert und Fehler reduziert. Sie sind ** [Verschleierung](# Verstecken-Einkapselung), [Vererbung](# Vererbung-Vererbung), [Polymorphismus](# Polymorphismus-Polymorphismus) **.

Verschleierung (Einkapselung)

Es ist eine Funktion, die das Lesen und Schreiben auf Felder und das Aufrufen von Methoden beschränkt. Selbst in der realen Welt werden Dinge, die schwer zu verwenden sind, wie der Inhalt von Brieftaschen und PCs, und Dinge, die schwer zu sehen sind, durch Tragen oder Einschränken verwaltet. Objektorientiert bedeutet, ** Zugriffskontrolle ** auf die Klasse anzuwenden.

Was passiert also, wenn Sie es nicht verstecken? Es sieht aus wie der Code unten.

Hero.java


//Tapfere Klasse
public class Hero {
    String name = "Mutig"; //Namenserklärung
    int hp = 100; //Erklärte einen tapferen Mann von HP100
    int mp = 50; //MP-Erklärung
    String state = default; //Kein abnormaler Zustand
    //Abkürzung

    void attack(Slime slimeInstance) {
        //Kampfprozess
    }
    void run() {
        //wird bearbeitet
    }
    void useItem(Item itemInstance) {
        //Verarbeitung mit Hunden
    }
    //Abkürzung
}

Priest.java


//Mönchsklasse
public class Priest {
    String name = "Mönch";
    int hp = 70;
    int mp = 100;
    String state = default;

    //Abkürzung
    //Vollständige Wiederherstellung der HP von Behoma Hero
    void healAll(Hero heroInstance) {
        if (this.mp > 9) {
            //Wenn Ihr MP 10 oder höher ist
            heroInstance.hp = -100;
            this.mp = this.mp - 10;
            System.out.println(heroInstance.name + "HP hat sich vollständig erholt!");
        } else {
            System.out.println("Nicht genug MP!");
        }
    }
}

Code zum Erstellen eines Helden mit 100 HP und Verwenden von Behoma (ein Zauber, um HP vollständig wiederherzustellen) für diesen Helden. Wenn Sie dies tun, beträgt die HP des Helden jedoch -100. Dies liegt daran, dass ich mit der healAll-Methode einen Tippfehler gemacht habe.

Priest.java


void healAll(Hero heroInstance) {
    heroInstance.hp = -100; // heroInstance.hp = 100;Tippfehler
}

Ohne diese Zugangskontrolle wird ein Zustand geschaffen, der in der Realität unmöglich ist. Fügen Sie daher zuerst einen Zugriffsmodifikator namens private zum Feld hinzu, damit er nicht von außen verarbeitet werden kann.

Hero.java


public class Hero {
    // int hp = 100;Hinzufügen
    private int hp = 100;
}

Da externe Methoden wie healthAll jedoch nicht so verwendet werden können, wie sie sind, werden die ** getter ** -Methode, die die Feldinformationen der eigenen Klasse an andere Klassen und den von der anderen Klasse empfangenen Wert übergibt, an die eigene Klasse übergeben. Fügen Sie eine ** Setter ** -Methode hinzu, die im Feld angezeigt wird.

Hero.java


public class Hero {
    //HP Erklärung
    private int hp = 100;
>
    //Getter-Methode
    public int getHp() {
        return this.hp; //Übergeben Sie HP an den Anrufer
    }
>
    //Setter-Methode
    public void setHp(int hp) {
        this.hp = hp; //Stellen Sie die vom Anrufer empfangenen HP ein
    }

Diese Getter / Setter-Methode verfügt über einen Zugriffsmodifikator namens public, sodass Sie ihn von überall aus aufrufen können. Außerdem kann die Priest-Klasse die Felder der Hero-Klasse nicht mehr direkt verarbeiten. Schreiben Sie daher die healthAll-Methode neu.

Priest.java


public class Priest {
    void healAll(Hero heroInstance) {
        if (this.mp > 9) {
            // heroInstance.hp = -100;Veränderung
            int putHp = -100
            heroInstance.setHp(putHp);
            this.mp = this.mp - 10;
            System.out.println(heroInstance.getName() + "HP hat sich vollständig erholt!");
        } else {
            System.out.println("Nicht genug MP!");
        }
    }
//Lauf
Hero heroInstance = new Hero(); //Mutige Instanz
Priest priestInstance = new Priest(); //Mönchsinstanz
priestInstance.healAll(heroInstance); //Benutze Behoma als Helden
System.out.println("HP: " + heroInstance.getHp());
//Ausführungsergebnis
HP: -100

Das Ausführungsergebnis hat sich nicht geändert, aber ich konnte es vorerst ausblenden. Und zu diesem Zeitpunkt gibt es bereits zwei Vorteile.

Priest.java


//Beispiel zum Umschreiben
public class Priest {
    void healAll(Hero heroInstance) {
        // heroInstance.hp = -100;Veränderung
        heroInstance.currentHp = -100;
    }

Wenn Sie eine oder zwei Klassen haben, wäre es schwierig, wenn Sie dies in einer groß angelegten Entwicklung tun müssten. Es kann versehentlich an der Stelle geändert werden, an der es normal funktioniert, oder es kann zu Tippfehlern führen.

Das ursprüngliche Problem lösen

Wenn Sie es nur ausblenden, können Sie doch -100 auf die HP des Helden setzen, also fügen Sie der Setter-Methode am Ende eine Gültigkeitsprüfung hinzu.

Hero.java


public class Hero {
    setHp(int hp) {
        // this.hp =PS ändern
        if (hp < 0 || hp > 100) { // 0 ~Andere als 100
            throw new IllegalArgumentException("Der Wert, der in HP eingestellt werden soll, ist abnormal.");
        }
        this.hp = hp;
}

Führen Sie nun den obigen Code aus.

//Lauf
Hero heroInstance = new Hero(); //Mutige Instanz
Priest priestInstance = new Priest(); //Mönchsinstanz
priestInstance.healAll(heroInstance); //Benutze Behoma als Helden
System.out.println("HP: " + heroInstance.getHp());
//Fehleranweisung für das Ausführungsergebnis
"Der Wert, der in HP eingestellt werden soll, ist abnormal."

Egal wie vorsichtig Sie sind, es werden Fehler auftreten. Es bedeutet, sich sorgfältig vorzubereiten und zu verhindern.

Verschleierung ist wichtig, um eine Klasse als ein ** Objekt (Objekt) ** zu erstellen, das von außen nicht gesehen oder umgeschrieben werden kann, und um es in einem Programm zu sammeln, damit es nicht mit der Realität in Konflikt steht.

Zusammenfassung der Verschleierung

Erbe

Wie der Name schon sagt, handelt es sich um eine Funktion, mit der Sie die Elemente, die Sie haben, von Klasse zu Klasse erben können. Nehmen wir zum Beispiel an, Sie möchten einen neuen Blasenschleim herstellen, der Gift aus Schleim enthält. Werde ich zu einem solchen Zeitpunkt von Anfang an wieder eine Klasse schreiben?

バブルスライム

Blasenschleim hat die gleichen Felder und Methoden wie Schleim und wirkt sich giftig auf Angriffe aus. Der Unterschied ist der Inhalt des Angriffs. Blasenschleim ist Schleim (Blasenschleim ist eine Art Schleim). In dieser Beziehung verwendet die Objektorientierung die Vererbung.

BubbleSlime.java


public class BubbleSlime extends Slime { //Schleimklasse erben
    private String name = "Blasenschleim";
    private int hp = 10; //Setzen Sie HP auf 10 zurück

    public void attack (Hero heroInstance) {
        //Beschädigter Teil
        heroInstance.setHp(heroInstance.getHp() - 1);
        System.out.println(heroInstance.getName() + "1 Schaden!");
        //Gifturteil
        boolean result = new java.util.Random().nextBoolean(); //Generiere wahr oder falsch
        if (result) {
            heroInstance.setState(poison); //Wenn das Ergebnis wahr ist, Gift
            System.out.println(heroInstance.getName() + "War ausgeflippt!");            
        }
}

Schreiben Sie nach der Klassendeklaration die erweiterte Klasse (die Klasse, die Sie erben möchten) und schreiben Sie den Unterschied zur erbenden Klasse. Das ist alles was Sie brauchen.

//Lauf
BubbleSlime bubbleSlimeInstance = new BubbleSlime(); //Bubble Slime Instanz
bubbleSlimeInstance.run(); //Lassen Sie Bubble Slime die Run-Methode verwenden
//Ausführungsergebnis
"Blasenschleim hat begonnen zu wachsen!"

Da es die Schleimklasse erbt, können Sie die Ausführungsmethode verwenden, ohne sie in der Blasenschleimklasse zu definieren. Auf diese Weise kann ** derselbe Teil vermieden werden ** und der Code wird leichter zu lesen sein.

Darüber hinaus bietet die Verwendung der Vererbung einen weiteren Vorteil. Angenommen, Sie möchten die Ausführungsmethode der Schleimklasse von "Gleiten!" In "Gleiten!" Ändern.

Slime.java


public class Slime {
    run() {
        //wird bearbeitet
        System.out.println(this.name + "War rutschig!");
    }
}

Wenn Sie eine Bubble-Slime-Klasse ohne Vererbung von Grund auf neu erstellen, müssen Sie die Bubble-Slime-Klasse nach dem Ändern der Slime-Klasse ändern. Wenn diese Zahl auf eins oder zwei steigt, steigt die Anzahl der Beschreibungen, das Vergessen der Korrektur und die Eingabe von Fehlern, und ich denke, dass sie nicht mehr zu handhaben sind, wenn sie zehn oder Hunderte erreichen. Wenn Sie die Vererbung verwenden, können Sie einfach die ursprüngliche Klasse ändern und sie wird in allen geerbten Klassen wiedergegeben.

Zusammenfassung der Vererbung

Es ist gut, dass die Anzahl der Beschreibungen reduziert und die Verwaltung einfacher ist. Mir gefällt es besonders gut.

Polymorphismus

Es ist eine Funktion, die Instanz vage zu erfassen. ~~ Es ist sehr schwer zu verbalisieren, also mit einem Wort, es ist so. ~~

Betrachten Sie nun die frühere Klasse der Schleimklasse. Schleim ist ein Feind, nicht wahr? Definieren wir also die feindliche Klasse.

Enemy.java


public abstract class Enemy {
    private String name; //Deklarieren Sie einen Namen
    private int hp; //HP deklarieren
    private int mp; //MP deklarieren

    abstract public void attack(Hero heroInstance) {}
    abstract public void run() {}

Lassen Sie die Angriffsmethode und die Ausführungsmethode leer, da sich die Beschreibung je nach geerbtem Monster ändert. Wenn Sie die Methode leer lassen, stellen Sie der Klassendeklaration abstrakt vor, um sie zu einer abstrakten Klasse zu machen. Eine abstrakte Klasse ist eine Klasse, die nicht instanziiert (materialisiert) werden kann. Selbst wenn Sie eine Angriffsmethode (Angriffsbefehl) ausgeben, wird nichts unternommen, und selbst wenn Sie einen Feind materialisieren, der nicht einmal eine Erklärung gibt, kann dies nicht gehandhabt werden.

Und erstelle eine neue Drakey-Klasse. bat.jpg

Bat.java


public class Bat extends Enemy { //Erben Sie die feindliche Klasse
    private String name = "Drakey";
    private int hp = 10;
    private int mp = 3;

    public void attack (Hero heroInstance) {
        //Beschädigter Teil
        heroInstance.setHp(heroInstance.getHp() - 3);
        System.out.println(heroInstance.getName() + "3 Schaden!");

}
    public void run() {
        //wird bearbeitet
        System.out.println(this.name + "Ich wurde wütend!");
}

** Vererbungsfluss ** Es wurde durcheinander gebracht, um es zusammenzufassen

(Vererbungsquelle ← Vererbungsziel)

Schleim Feindliche Klasse (abstrakte Klasse, die nicht materialisiert werden kann)    ↑    Slime class    ↑ BubbleSlime-Klasse (Giftprüfung zur Angriffsmethode hinzugefügt)

Drakey Feindliche Klasse (abstrakte Klasse, die nicht materialisiert werden kann)    ↑    Bat class

Es ist geworden.

Bisher sind wir bereit. Was bedeutet es also wirklich, vage zu sein? Nehmen wir als Beispiel Folgendes.

Hero.java


public class Hero {
    public void attack(Slime slimeInstance) {
        slimeInstance.setHp(slimeInstance.getHp() - 5); //5 Schaden an Schleim
    }
    public void attack(Bat batInstance) {
        batInstance.setHp(batInstance.getHp() - 5); //5 Schaden an Drakey
    }

Wenn Sie alle Instanzen streng nehmen, müssen Sie jede Methode entsprechend der Zielinstanz vorbereiten, z. B. die Angriffsmethode für Schleim und die Angriffsmethode für Drache.

Genau genommen sind Schleim und Drache verschiedene Arten, aber sie sind das gleiche feindliche Monster. Behandeln wir es also vage als ** Feind **.

(In Java müssen Typen wie int und String deklariert werden, um welche Art von Variable es sich handelt. Grundsätzlich weist die Slime-Klasse dem Slime-Typ eine Instanz zu, und die Bat-Klasse weist dem Bat-Typ eine Instanz zu, erbt jedoch den Typ der abstrakten Klasse. Es ist zulässig, Klassen einzuschließen, die sind

//Lauf
Enemy slimeInstance = new Slime(); //Schleiminstanz
Enemy batInstance = new Bat(); //Drakey-Instanz

Hero.java


public class Hero {
    public attack(Enemy enemyInstance) {
        enemyInstance.sethp(enemyInstance.getHp() - 5); //5 Schaden an Feinden
}

Wenn Sie auf diese Weise Instanzen desselben Feindtyps erstellen, können Sie alle gemeinsam verarbeiten. Es ist auch effektiv mit der Laufmethode feindlicher Monster.

//Lauf
Enemy[] enemies = new Enemy[3]; //Feind, der erschien
enemies[0] = new Slime(); //Schleim
enemies[1] = new BubbleSlime(); //Blasenschleim
enemies[2] = new Bat(); //Drakey
for (Enemy enemyInstance : enemies) { //Setze die erscheinenden Feinde einzeln in den Feindtyp ein
    enemyInstance.run(); //Verwenden Sie die Ausführungsmethode der im Enemy-Typ enthaltenen Instanz
}
//Ausführungsergebnis
"Der Schleim war rutschig!"
"Blasenschleim rutschte ab und rannte weg!"
"Drakey ist verrückt!"

Der Anrufer ließ jedes Monster dieselbe Laufmethode verwenden, aber jedes Monster verhält sich auf seine eigene Weise. Es ist eine polymorphe Quelle, die mit einem Befehl viele Zustände erzeugen kann.

Zusammenfassung des Polymorphismus

~~ Es war schwer zu verbalisieren, vielleicht habe ich mehr Verdienste? Ich denke···. ~~

Zusammenfassung

** Vielen Dank, dass Sie den Artikel bisher gelesen haben. ** ** ** Ich habe diesmal weggelassen, aber es gibt verschiedene Zusagen sowie Verdienste. Wenn Sie also interessiert sind, überprüfen Sie es bitte. Da ich wenig Wissen und Erfahrung habe, möchte ich Masakari auch fragen, ob ich über etwas spreche.

クロコダイン.jpg

☝️☝️☝️ Ich bin mir sicher, dass ich morgen bin

Recommended Posts

Kenntnis der Objektorientierung für ein halbes Jahr Programmierung
Eine Liste der rawValues für UITextContentType.
Schreiben Sie, was Sie nach einem halben Jahr mit mybatis gedacht haben
Ein halbes Jahr Selbststudium unerfahren gemacht SPA mit Rails + Nuxt.js, also schauen Sie bitte
Objekt orientierte Programmierung
[Für Programmieranfänger] Was ist eine Methode?
Zusammenfassung der einfachen Funktionen von Bootstrap für Anfänger
Ein Memo für mich, dass Objektorientierung etwas ist
Eine Sammlung einfacher Fragen für Java-Anfänger
Objektorientierter Programmierbegriff
Ich habe ein Docker-Image für die japanische Version von SDAPS erstellt
Geben Sie eine Liste der Cron-Einstellungen für alle Benutzer aus.
Einführung in die Programmierung für Studenten: Erstellen von Canvas
Polymorphismus, den auch Anfänger der Objektorientierung verstehen können
Liste der MySQL-Anweisungen für Programmieranfänger * Persönliches Memo
Ich habe versucht, eine Webanwendung aus anderthalb Monaten Programmier-Lerngeschichte zu entwickeln