[JAVA] Was ist schließlich Objektorientierung oder nur eine Sache, auf die Sie bei der Programmierung achten müssen?

Einführung

Wenn Sie Programmieren studieren, haben Sie den Begriff objektorientiert wahrscheinlich einmal gehört. Diese objektorientierte, die es schon lange gibt und die noch von vielen Menschen genutzt wird, weiß ich jedoch nicht. Auf einer bestimmten Seite heißt es, dass sie Elemente wie "Kapselung", "Vererbung" und "Polymorphismus" enthält. Aber objektorientierte Befürworter sagen Messaging. [Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83 % 88% E6% 8C% 87% E5% 90% 91% E3% 83% 97% E3% 83% AD% E3% 82% B0% E3% 83% A9% E3% 83% 9F% E3% 83% B3 Selbst wenn Sie sich% E3% 82% B0) ansehen, ist nicht klar, dass der Hintergrund lange anhält und es viele Arten gibt.

Schließlich denke ich, dass viele Menschen ein vages Verständnis dafür haben, dass die folgenden Variablen und Methoden verfestigt sind (für diejenigen, die völlig neu darin sind, Supplement). Bitte zuerst lesen).

public class SandBox {
    int hoge = 10;
    int fuga = 20;
    
    int foo(){
        return hoge;
    }
    int bar(){
        return fuga;
    }
}

Nachdem ich die Programmierung sowohl für Hobbys als auch für Unternehmen fortgesetzt hatte, stellte ich jedoch fest, dass sie objektorientiert ist oder dass der Diskurs vom Typ "Programmierung sollte XX sein" für ** einen Zweck ** existiert. Wenn Sie das wissen, werden Programmiertechniken wie Objektorientierung und "Geben wir einen beschreibenden Variablennamen" sofort eingeführt.

Lesbarer Code

Als ich anfing, als Hobby zu programmieren, verstand ich nicht, warum ich es objektorientiert machen musste. Ich verstand auch die Notizen wie "Geben wir einen Variablennamen, der leicht zu verstehen ist", aber ich hielt es nicht für wichtig. In der Tat brauchen Sie diese nicht, wenn sie kurz sind und Ihre eigenen Programme. Wenn Sie beispielsweise Dateien in einem Ordner sofort umbenennen möchten (am Anfang [Lesen] hinzufügen), ist dieser Code ausreichend.

File a = new File("C:\\Users\\admin\\Documents\\ss");
for(File f : a.listFiles()){
    File b = new File(a, "[Bereits gelesen]"+f.getName());
    f.renameTo(b);
}

Sie müssen sich nicht die Mühe machen, ein Objekt zu erstellen. Es ist nicht erforderlich, einen beschreibenden Variablennamen anzugeben. Das ist nur mühsam, weil Sie es nur einmal verwenden müssen und sich selbst kennen.

Der Grund, warum objektorientierte und variable Namen so kontrovers sind, ist, dass sie für Programme gedacht sind, die von ** Langzeit-Multiplayer ** entwickelt wurden. Von Unternehmen entwickelte Programme werden von einer großen Anzahl von Mitarbeitern in einem großen Unternehmen erstellt und können im Laufe der Jahre angepasst werden. Aus diesem Grund muss der Code lose gekoppelt sein (siehe unten), damit Änderungen von anderen gelesen und verstanden werden können und keine unerwarteten Auswirkungen haben. Wenn Sie denken, "Ich mache es nur alleine als Hobby, es spielt keine Rolle", ist das ein Fehler, und nach einem halben Jahr werde ich die Bedeutung des Codes vergessen, den ich in der Vergangenheit geschrieben habe, also muss ich ihn lose gekoppelt schreiben. es gibt.

Kurz gesagt, Programmiertechniken wie Objektorientierung und "Geben Sie leicht verständliche Variablennamen" dienen dazu, ** "Code zu schreiben, der für andere (auch für Sie in Zukunft) leicht zu lesen und zu schreiben ist" **.

Was ist Objektorientierung?

Um auf meine eigene Weise zu erklären, was objektorientiert ist? ** Erstellen Sie eine Reihe von Daten und Funktionen (Klasse), während Sie Regeln wie die Kapselung beachten, um "Code zu schreiben, der für andere (auch für Sie in Zukunft) leicht zu lesen und zu schreiben ist". Das ist **. Ich denke nicht, dass dies alles ist, also schauen wir uns als Beispiel die ArrayList-Klasse von Java an.

List<String> list = new ArrayList<String>();
list.add("C");
list.add("A");
System.out.println(list.get(0));//C

Selbst wenn Sie Java nicht kennen (wenn Sie Englisch verstehen), können Sie diesen Code lesen und Sie werden verstehen, dass "ich" C "und" A "zur Liste hinzugefügt habe, um das 0. Element zu erhalten." Es ist wichtig zu wissen, was der Code bedeutet, ohne den Inhalt der Klasse so zu betrachten **, und deshalb werde ich alles unten erklären. Da ein von einem großen Unternehmen erstelltes Programm in einigen Fällen Millionen von Zeilen enthalten kann, ist es unmöglich, den gesamten Code zu erfassen (und natürlich ist es wünschenswert, dass auch ein kleines Programm weniger Code erfasst). ) ist.

Verkapselung

Das wichtigste objektorientierte Merkmal ist die Kapselung. Dies bedeutet "nur die Teile visualisieren, die der Benutzer verwenden muss, und den Rest ausblenden". In Bezug auf die Programmiersprache ist es ** öffentlich ** und ** privat ** entsprechend einzustellen. Beispielsweise enthält die ArrayList-Klasse tatsächlich Methoden wie sureCapacityInternal () und grow () und führt eine komplizierte Verarbeitung durch. Da sie jedoch nicht mit der Seite zusammenhängt, die die Liste verwendet, ist sie privat (privat) und add ( Nur Methoden, die von Benutzern wie) und get () verwendet werden, sind öffentlich. Dies macht ArrayList zu einer sicheren Klasse, die einfach zu verwenden ist, ohne das Innere zu kennen.

Einfacher ausgedrückt zum Beispiel ein Taschenrechner. Wissen Sie, wie die elektronischen Schaltkreise im Taschenrechner aussehen? Die meisten Leute wissen das nicht. Aber jeder kann den Taschenrechner benutzen. Dies liegt daran, dass die interne elektronische Schaltung privat ist und die Tasten und der Bildschirm öffentlich sind. Was ist, wenn der Taschenrechner nicht von einem Gehäuse abgedeckt ist und die elektronischen Schaltkreise freigelegt sind? Wenn Sie mit elektronischen Schaltkreisen bestens vertraut sind, können Sie sie möglicherweise ändern, um sie zu Ihrem eigenen Taschenrechner zu machen. Für die meisten Menschen ist es jedoch unverständlich, und es ist Sekiyama, das durch versehentliches Berühren Probleme verursachen kann. Daher wird nur der Teil, der externe Operationen akzeptiert, öffentlich (öffentlich) gemacht, und die Teile, die nicht berührt werden sollten, wie z. B. elektronische Schaltungen, werden privat (privat) gemacht. Dies ist ** Kapselung **. Wenn Sie es wagen, den Taschenrechner wie ein Programm zu schreiben, sieht er so aus.

public class Calculator{
    /**Die Schaltfläche "1" ist öffentlich*/
    public void button1(){
        //wird bearbeitet
    }
    /**Die Schaltfläche "2" ist öffentlich*/
    public void button2(){
        //wird bearbeitet
    }
    
    ...//Fortsetzung unten
    
    /**Die interne Berechnungsverarbeitung ist privat (privat)*/
    private double calculate(){
        //wird bearbeitet
    }
    
    /**Die Anzeige der Ergebnisse ist öffentlich*/
    public double showResult(){
        //wird bearbeitet
    }
}

Wenn wir so denken, können wir sehen, dass "Einkapselung" im täglichen Leben universell vorhanden ist. Sie können das Fernsehgerät bedienen, ohne zu wissen, welche Art von Signal die Fernbedienung des Fernsehgeräts sendet. Sie können ein Auto fahren, ohne das Motordesign zu kennen. Auch wenn Sie die Details der Jahresendanpassung nicht kennen, können Sie die Jahresendanpassung erhalten, indem Sie die Dokumente an die Buchhaltungsabteilung senden. Auf diese Weise können Sie in einer komplizierten Gesellschaft leben, indem Sie eine Black Box erstellen, in der "Sie wissen, was zu tun ist und welche Ergebnisse zurückgegeben werden, ohne das Innere zu kennen", und ein umfangreiches Programm leicht verständlich ist. Wird sein. Am Anfang erwähnte ich, dass objektorientierte Befürworter "Messaging" sagen, aber Außenstehende senden einfach "Nachrichten" und empfangen die zurückgegebenen "Nachrichten" **, ohne das Innere zu kennen. ** Es ist wichtig, programmieren zu können.

Eng und locker gekoppelt

Die starke Verbindung zwischen jedem Element ist eine enge Verbindung, und die schwache Verbindung ist eine lose Verbindung. Im Allgemeinen ist es besser, eng gekoppelte Elemente in Klassen zu gruppieren und lose miteinander zu verbinden. Was wäre zum Beispiel, wenn die Rechnerklasse einen Code für die Datumsberechnung hätte? Einige Leute denken vielleicht: "Es ist besser, eine Klasse zu haben, die alles kann!", Aber die Datumsberechnung unterscheidet sich erheblich von der normalen numerischen Berechnung, z. B. durch Teilen des Datums und Berücksichtigen des möglichen Jahres. Ich werde. Wenn in der Rechnerklasse Code für die Datumsberechnung vorhanden ist, werden daher beim Bearbeiten des Inneren der Klasse nicht verwandte Methoden und Variablen angezeigt, was verwirrend ist. Gleiches gilt für den Benutzer. Es ist besser, es in eine Taschenrechnerklasse und eine Datumsberechnungsklasse zu unterteilen. Und machen Sie die Klassen lose gekoppelt. Wenn sich der Status der Rechnerklasse beispielsweise auf das Verhalten der Datumsberechnungsklasse auswirkt, kann dies Auswirkungen auf die Datumsberechnungsklasse haben, obwohl Sie nur die Rechnerklasse reparieren wollten, und es kann ein unerwarteter Fehler auftreten. .. Wenn Sie das Verhalten der Datumsberechnungsklasse abhängig vom Status der Rechnerklasse wirklich ändern möchten, erstellen Sie eine Methode, um die erforderlichen Parameter aus der Rechnerklasse abzurufen, und erstellen Sie eine Methode, um sie in der Datumsberechnungsklasse zu erhalten, um die Zusammenarbeit zu "visualisieren".

Polymorphismus (Polymorphismus)

Polymorphismus ist, dass die äußere Oberfläche dieselbe ist und die interne Verarbeitung auf verschiedene Arten geändert werden kann. Betrachten Sie beispielsweise eine TV-Fernbedienung. Verschiedene Unternehmen wie Sharp und Panasonic stellen Fernsehgeräte her, und die Fernbedienung verfügt auch über verschiedene interne elektronische Schaltkreise, hat jedoch dieselbe Kanalumschalttaste und Lautstärketaste und die Bedienung ist dieselbe. Auf diese Weise hat ** Polymorphismus ** den gleichen externen Aspekt von "welche Art von Funktion er hat", selbst wenn die interne Implementierung unterschiedlich ist. Wenn Sie die Fernbedienung wie ein Programm schreiben, verwenden Sie die folgende [Schnittstelle](https://qiita.com/lamrongol/items/74f62fcbea9cf7e96c4d#%E3%82%A4%E3%83%B3%E3%82% BF% E3% 83% BC% E3% 83% 95% E3% 82% A7% E3% 83% BC% E3% 82% B9-Schnittstelle).

public interface RemoteController{
    public void channel1();
    public void channel2();
    ...//Fortsetzung unten
    public void volumeUp();
    public void volumeDown();
    ...//Fortsetzung unten
}

Auf diese Weise wird dem Verfasser mitgeteilt: "Sie können die interne Implementierung ändern, versprechen jedoch, diese Art von Funktion zu haben", und der Benutzer kann sie als Fernbedienung verwenden, unabhängig davon, um welchen Hersteller es sich handelt. Konkret haben beispielsweise die ArrayList-Klasse und die HashSet-Klasse von Java ganz unterschiedliche Elemente, aber beide erben die Collection-Schnittstelle, sodass die ** iterator () -Methode unabhängig von der internen Implementierung verwendet wird. Sie können sehen, dass Sie die Elemente in Ordnung bringen können.

Übrigens, wenn Sie Objektorientierung durchführen, denken Sie vielleicht: "Ich verstehe die Schnittstellenvererbung, aber die Klassenvererbung?". Die Klassenvererbung verhält sich jedoch unerwartet, ohne die Details der übergeordneten Klasse zu kennen. Je tiefer die Hierarchie wird, desto mehr Variablen werden auf mehrere Ebenen verteilt, und es wird schwierig, ihnen zu folgen. Variablen mit demselben Namen werden dupliziert und verwirrt. Daher ist es besser, sie nicht häufig zu verwenden. Tatsächlich sagen Java-Ersteller, dass Klassenerweiterungen so weit wie möglich vermieden werden sollten ).

Praktische Ausgabe

Lassen Sie uns nun eine einfache objektorientierte Programmierung durchführen, die auf den oben genannten basiert. Die Sprache ist Java, aber ich werde sie schreiben, damit auch diejenigen, die Java nicht kennen, sie verstehen können. Was wir machen, ist ein Programm, das die "Periode" berechnet. Wenn Sie beispielsweise "2 Monate 18 Tage" und dann "1 Monat 4 Tage" arbeiten, erhalten Sie insgesamt "3 Monate 22 Tage". 30 Tage werden jedoch in 1 Monat umgewandelt. Mit anderen Worten, wenn Sie "1 Monat 24 Tage" und "3 Monate 15 Tage" arbeiten, beträgt die Gesamtsumme "4 Monate 39 Tage", aber 30 Tage werden in 1 Monat umgewandelt. Subtrahieren Sie also 30 von der Anzahl der Tage und addieren Sie 1 zum Monat. Wird "5 Monate 9 Tage" ausgegeben.

Wenn Sie ein Programm ohne Objektorientierung schreiben, sieht es wie folgt aus.

int monthNum = 0;
int dayNum = 0;

//24 Tage im Monat arbeiten
monthNum = monthNum + 1;
dayNum = dayNum + 24;
////Konvertieren Sie 30 Tage in 1 Monat
monthNum = monthNum + dayNum/30;
dayNum = dayNum%30;

//3 Monate 15 Tage arbeiten
monthNum = monthNum + 3;
dayNum = dayNum + 15;
////Konvertieren Sie 30 Tage in 1 Monat
monthNum = monthNum + dayNum/30;
dayNum = dayNum%30;

System.out.println((monthNum/12)+"Jahr"+(monthNum%12)+"Monate"+dayNum+"Tag");//0Jahr5Monate9Tag          

Sie können die Berechnungen weiterhin durchführen, aber der Code ist unübersichtlich und es können Fehler mit Copy-Pemis auftreten. Verwenden wir also die Klasse Duration (was "Dauer" bedeutet) und erstellen den folgenden Code.

Duration durationSum = new Duration(0, 0);

//24 Tage im Monat arbeiten
Duration duration1 = new Duration(1, 24);
durationSum.add(duration1);

//3 Monate 15 Tage arbeiten
Duration duration2 = new Duration(3, 15);
durationSum.add(duration2);

//Automatisch zu String()Wird genannt
System.out.println(durationSum);//0 Jahre 5 Monate 9 Tage

Wie wär es damit. Ich denke, es ist ein ordentlicher Code, den Sie nur durch Lesen verstehen können (wenn Sie Englisch verstehen). Die Duration-Klasse selbst sieht folgendermaßen aus:

Duration.java


/**Klasse "Periode". TAG_OF_MONATstage werden automatisch in 1 Monat umgerechnet*/
public class Duration {
  /**Anzahl der Tage, die als ein Monat betrachtet werden sollen*/
  public static final int DAY_OF_MONTH = 30;  
  
  //Machen Sie es privat, damit Benutzer es nicht ohne Erlaubnis ändern können
  private int monthNum;//Anzahl der Monate
  private int dayNum;//Tage
  
  /**monthNum month dayNum day*/
  public Duration(int monthNum, int dayNum){
	//DAY_OF_Der MONATstag wird in 1 Monat umgerechnet
	this.monthNum = monthNum + dayNum/DAY_OF_MONTH;
	this.dayNum = dayNum % DAY_OF_MONTH;
  }

  public void add(Duration duration){
	this.monthNum = this.monthNum + duration.getMonthNum();
	this.dayNum = this.dayNum + duration.getDayNum();

	//DAY_OF_Der MONATstag wird in 1 Monat umgerechnet
	this.monthNum = this.monthNum + this.dayNum/DAY_OF_MONTH;
	this.dayNum = this.dayNum % DAY_OF_MONTH;
  }

  //Machen Sie es öffentlich, damit Benutzer es nicht festlegen, sondern abrufen können
  public int getMonthNum(){
	return monthNum;
  }
  public int getDayNum(){
	return dayNum;
  }
  
  @Override
  public String toString(){
	  return (monthNum/12)+"Jahr"+(monthNum%12)+"Monate"+dayNum+"Tag";
  }
}

Ich habe es in den Code geschrieben, aber ich werde Erklärungen hinzufügen. Da es sich um eine Klasse handelt, die den Zeitraum darstellt, enthält sie zunächst die Felder "monthNum" und "dayNum" für Monate und Tage. Im Konstruktor und in der Methode "add ()" wird sie jedoch gehalten, selbst wenn "dayNum" 30 überschreitet. Es wird gesteuert, um automatisch auf einen Monat umzurechnen. Aus diesem Grund machen wir es privat, damit Benutzer dieses Steuerelement nicht brechen und ohne Erlaubnis mehr als 30 Zahlen in "dayNum" eingeben. Andererseits werden die Methoden "getMonthNum ()" und "getDayNum ()" veröffentlicht (** Kapselung **), da die Erfassung selbst frei erfolgen kann. Da "die Anzahl der Tage, die als ein Monat angesehen werden" unabhängig vom Zeitraum auf 30 Tage festgelegt ist, ist "DAY_OF_MONTH" final % AE% E9% A3% BE% E5% AD% 90) in [statisch](https://qiita.com/lamrongol/items/74f62fcbea9cf7e96c4d#static%E4%BF%AE%E9%A3% BE% E5% AD% 90). Und ich möchte den Benutzer wissen lassen, wie viele Tage in einen Monat umgewandelt wurden, damit ich es öffentlich mache. Schließlich implementiert es die Methode toString (). In Java erben alle Klassen von der Object-Klasse, und toString () ist die Methode, über die sie verfügt. Wenn Sie dies implementieren, wird sogar die von Ihnen erstellte Klasse im ** Debug-Modus ** oder System.out.println (obj); angezeigt, so dass es für Menschen leicht zu sehen ist. Die Methode toString () ist eine Art ** Polymorphismus **, da die Implementierung je nach Klasse unterschiedlich ist, da sie häufig vorkommt und wie sie angezeigt wird.

Schließlich

Wie ich am Anfang geschrieben habe, ist das Wichtigste bei der Programmierung ** "Code schreiben, der für andere (auch für mich in Zukunft) leicht zu lesen und zu schreiben ist" **. Denken Sie beim Erlernen von Programmiertechniken oder beim Schreiben von Programmen, die nicht nur objektorientiert sind: "Ist es für andere (auch für mich in Zukunft) wirklich einfach, zu lesen und zu ändern?"

Recommended Posts

Was ist schließlich Objektorientierung oder nur eine Sache, auf die Sie bei der Programmierung achten müssen?
Was ist eigentlich objektorientiert?
Was ist eigentlich objektorientiert?
Punkte, die bei Java beachtet werden müssen, sind gleich
Gradle-Einstellungsnotiz (Multiprojekt für alle in einem) für mich
Eine Einführung in Funktionstypen für objektorientierte Programmierer in Elm
Was ist mit den typischen Änderungen in Apache Wicket 8 passiert?
Was ist ein Ausschnitt in der Programmierung?
[Für Programmieranfänger] Was ist eine Methode?
Achten Sie auf eingebettete Variablen in S2Dao
Eclipse Pleiades All in One für Mac
Was macht [Rails DB: Migrieren]?
Was tun, wenn die bereits verwendete Adresse nach dem Ausführen der Schienen angezeigt wird?