[JAVA] Der Grund, warum Dunst bleibt, wenn versucht wird, die Objektorientierung als "Englisch" zu betrachten

0. Fazit

Unterscheiden wir zwischen passiven und automatischen Verben. Das ist es.

1. Einleitung

Sie haben wahrscheinlich gehört, dass objektorientierter, einigermaßen lesbarer Code als Englisch betrachtet werden kann. Um den Code speziell als Englisch zu lesen, lesen Sie wie folgt.

oop↔eng


Gegenstand.Prädikat();//Muster des 1. Satzes
Gegenstand.Prädikat(ergänzen);//2. Satzmuster
Gegenstand.Prädikat(Objekt);//Muster des dritten Satzes
Gegenstand.Prädikat(Objekt, Objekt);//4. Satz Muster
Gegenstand.Prädikat(Objekt,ergänzen);//5. Satzmuster

2. Problem

2-1. Leicht verständliches Problem

Abhängig von der Art des Prädikats (Verbs) kann es jedoch zweifelhaft sein, ob das "Subjekt" wirklich das "Subjekt" ist. Zum Beispiel in Java's "List" (für diejenigen, die es nicht wissen, ist es wie ein Array) list.add(obj); Sie können so schreiben. Dieser Code bedeutet das Hinzufügen von "obj" zur "Listen" -Instanz "Liste". ** Füge niemals list" ga "(irgendwo) obj hinzu **. Daher wird es auf Englisch zu "JVM fügt Liste obj." Hinzu, und Liste ist nicht mehr das Thema. Wenn Sie die englische Korrektheit anstreben, fügt JVM das Listenobjekt hinzu. Ist ebenfalls falsch. Da add nicht das Muster des 4. Satzes annimmt, sollte es gehorsam geschrieben werden als "JVM fügt der Liste obj hinzu". Im Muster des 3. Satzes mit Modifikatoren. Dies ist jedoch ein Problem der natürlichen Sprache und eignet sich nicht zur Berücksichtigung einer einheitlichen Konvertierungsregel in künstliche Sprache. Daher wird angenommen, dass alle anderen Verben weiterhin dem Muster des 4. Satzes und dem Muster des 5. Satzes entsprechen. </ sub> </ sub>

2-2. Praktisch großes Problem

Wenn das Problem in Abschnitt 2-1 gesucht wird, entwickelt es sich zu einem großen Problem, bei dem die Accessoren um 180 Grad geschaltet werden. Das heißt, Getter wird Setter und Setter wird Getter. Zum Beispiel Feld ram Und seine Accessoren getRam(int address), setRam(int address, byte value) Klasse mit OS Vorbereiten und seine Instanz computer Nehmen wir an, Sie haben gemacht.

Betriebssystemklasse und Computerinstanz


public class OS
{
    private byte[] ram;
    public byte getRam(int address){return this.ram[address];}
    public void setRam(int address, byte value){this.ram[address]=value;}
    public OS(int ram_size){this.ram = new byte[ram_size];}
}

class Main{ public static void main(String...args)
{
    OS computer = new OS(64);//Erstellen eines Computers mit 64 Byte RAM
    int i=0;
    for(char each_char : "hello world".toCharArray())
        computer.setRam(i++, (byte)each_char);
        //0~Schreiben Sie "Hallo Welt" an Adresse 10

    for(int j=0; j<11; j++)
    	System.out.print((char)computer.getRam(j));
        //0~Adresse 10(Als char)Anzeige
        //→ "Hallo Welt" wird auf der Konsole angezeigt.
}}

Auf diese Weise können Sie Ihr eigenes Betriebssystem (das nutzlos ist) definieren, einen virtuellen Computer (das nutzlos ist) mit diesem Betriebssystem erstellen und es als Hallo Welt anzeigen.

Hier,

oop


    int i=0;
    for(char each_char : "hello world".toCharArray())
        computer.setRam(i++, (byte)each_char);

Schreibt "Hallo Welt" in den RAM. Wer ist das Thema von "Set Ram"? Wer schreibt (stellt) den RAM ein? ** Hier ist der Code eine große Lüge **. Der Code beantwortet diese Frage, vielleicht "Computer". ** Computer ist das zu schreibende Objekt **, nicht wahr? .. ..

Wenn das Thema von "setRam" wirklich "Computer" ist, computer schreibt (setzt) RAM nach außen. Und das ist nichts anderes als die Funktion von "getRam", "den Inhalt des RAM an den Aufrufer zurückzugeben".

Mit anderen Worten, wenn Sie den ** Code gehorsam interpretieren, wird der Setter zu einem Getter. ** ** ** Wenn Sie eine fortgeschrittene Person sind, die diese Behauptung nicht versteht, denken Sie bitte an den Anfang zurück. Wenn "Computer" "" RAM "schreibt (zu" Anrufer ") Ist RAM auf Computer geschrieben? Oder ist es an den "Anrufer" geschrieben? Lass uns darüber nachdenken. Ich möchte, dass du es dort bemerkst. Ich war an die lächerliche Welt gewöhnt und meine Gefühle waren gelähmt.

** In ähnlicher Weise wird Getter Setter **. Wenn Sie computer.getRAM (~); direkt interpretieren, Dies ist nichts anderes als die Definition von Setter, weil "'Computer'" "RAM" "bekommt.

3. Ursache des Problems

Dieses Problem trat auf, weil es zu wenige Ingenieure gibt, die zwischen passiven und automatischen Verben unterscheiden können. Zumindest hat Oracle passive Verben mit automatischen Verben verwechselt, um die Objektorientierung zu erklären. Ich muss sagen, dass es richtig ist, die Objektorientierung nicht mehr zu verstehen. Es ist miserabel für die Bühne. Das Folgende wird aus https://docs.oracle.com/javase/tutorial/java/concepts/object.html zitiert und übersetzt.

(Zitat)

Real-world objects share two characteristics: They all have state and behavior. Dogs have state (name, color, breed, hungry) and behavior (barking, fetching, wagging tail). Bicycles also have state (current gear, current pedal cadence, current speed) and behavior (changing gear, changing pedal cadence, applying brakes).

(Japanische Übersetzung)

Objekte der realen Welt haben zwei Eigenschaften. "Staat" und "Aktion". Der Hund hat "Name", "Farbe", "Hunderasse", "Hunger" als Staat, Hat "bellen", "hinzufügen" und "den Schwanz schütteln" als Aktionen. Wenn es sich um ein Fahrrad handelt, hat es als Zustände "aktuellen Gang", "aktuelle Trittgeschwindigkeit" und "aktuelle Geschwindigkeit". Zu den Aktionen gehören "Gangwechsel", "Pedalgeschwindigkeit ändern" und "Bremsbetrieb".

In diesem Text gibt es einen entscheidenden (nein, tödlichen) Unterschied zwischen Hundeverhalten und Fahrradverhalten. Das Verhalten eines Hundes ist die "Handlung, die ein Hund von selbst ausführt", während das Verhalten eines Fahrrads die "Handlung ist, die etwas anderes als sich selbst unternimmt". Hundeverhalten "bellen", "hinzufügen" und "den Schwanz schütteln" sind alles ** automatische Wörter, deren Thema der Hund ist **, Fahrradverhalten "Gangwechsel", "Ändern der Trittgeschwindigkeit" und "Aktivieren der Bremse" sind ** andere Verben, die das Fahrrad nicht als Subjekt verwenden **.

Ein als Fahrradverhalten angegebenes Beispiel ist tatsächlich "** Betrieb ** für ein Fahrrad".

Selbst wenn Sie das "Verhalten" eines Hundes mit dem "Betrieb" eines Fahrrads verwechseln und sagen: "Dies ist ein Beispiel für die Objektorientierung", wäre dies für einen Anfänger unverständlich. ** Die aktuelle Situation ist, dass die Objektorientierung nur verstanden werden kann , wenn der Unterschied zwischen "Aktion" und "Operation" vergessen wird und die Anweisungen zum Abrufen und Setzen falsch sind. In diesem Fall muss ich sagen: " Es ist besser, nicht zu verstehen **" (Ohne zu wissen, dass das Subjekt.predikat (Objekt) eine Lüge ist) ** Das Verständnis der Objektorientierung kann sogar als eine Art Gehirnwäsche bezeichnet werden **.

4. Lösung

4-1. Theorie

Durch Ändern der passiven Verbmethode in passiv oder Verschieben der Instanz zum ersten Argument kann der objektorientierte Code korrekt als Englisch gelesen werden. Kapitel 4 wird dies erklären.

Wie in Kapitel 3 gezeigt, hat die Kultur, die nicht zwischen passiven und automatischen Verben unterscheidet, zu einer Verwechslung zwischen Subjekt und Objekt geführt. Wenn Sie tiefer graben, gibt es eine Kultur, in der das Objekt eines anderen Verbs als Subjekt in der Objektorientierung betrachtet wird. ・ ・ ・ ① Ursprünglich ist das Thema des automatischen Wortes "aktiver Schauspieler" (z. B. bellender Hund) </ sub> </ sub>, Das Thema des anderen Verbs ist "Operator" (z. B. Person, die den Gang des Fahrrads wechselt) </ sub> </ sub> Das Objekt des anderen Verbs wird "passiver Akteur" (z. B. ein Fahrrad, das den Gang wechseln kann **) </ sub> </ sub>. ・ ・ ・ ② Zusammenfassend (1) und (2): "Wenn im objektorientierten Bereich ein passives Verb erscheint, besteht das Problem, dass die passive Nase und die Subjektnase umgekehrt sind."

Wenn umgekehrt ein passives Verb erscheint, können Subjekt und Objekt wieder umgekehrt werden, indem es in passiv umgeschrieben wird, sodass der korrekte englische Satz vervollständigt wird. Zum Beispiel bicycle.change_gear_to(5); Ist bicycle.is_changed_gear_to(5); Oder bicycle.gear_is_changed_to(5); Wenn ja, kann es als englischer Satz gelesen werden, der ins Japanische übersetzt werden kann als "ein Fahrrad wird in einen Gang von 5 geändert", so dass es auch in Bezug auf die Bedeutung korrekt ist. ・ ・ ・ Passive Methode

Oder sogar im Code bringt es die Instanz an die Position des Arguments. change_gear(of bicycle,to 5); In diesem Fall kann es korrekt als englischer Satz gelesen werden, dem das Thema fehlt (JVM für Java), dh eine Aussage. ・ ・ ・ Zweckbestimmung

4-2. Praxis der passiven Methode

Ein Beispiel für eine Betriebssystemklasse und eine Computerinstanz:

Betriebssystemklasse und Computerinstanz


public class OS
{
    private byte[] ram;
    public byte is_got_ram(int address){return this.ram[address];}
    public void is_set_ram(int address, byte value){this.ram[address]=value;}

    public OS(int ram_size){this.ram = new byte[ram_size];}
}

class Main{ public static void main(String...args)
{
    OS computer = new OS(64);//Erstellen eines Computers mit 64 Byte RAM
    int i=0;
    for(char each_char : "hello world".toCharArray())
        computer.is_set_ram(i++, (byte)each_char);//by jvm
        //0~Schreiben Sie "Hallo Welt" an Adresse 10

    for(int j=0; j<11; j++)
    	System.out.print((char)computer.is_got_ram(j));//by jvm
        //0~Adresse 10(Als char)Anzeige
        //→ "Hallo Welt" wird auf der Konsole angezeigt.
}}

Sicher, obwohl es als englischer Satz richtig gelesen werden kann Dieses Mal enthält der Methodenname viele _, was das Verständnis erschwert. (Insbesondere ist es ein Problem, dass Methoden, die mit beginnen, im Widerspruch zur Regel der Rückgabe eines booleschen Typs stehen.)

Dieses Problem tritt im objektiven Wortlaut (Abschnitte 4-3) nicht auf.

4-3. Übung der Zielformulierung

Ein Beispiel für eine Betriebssystemklasse und eine Computerinstanz:

String code = "

Betriebssystemklasse und Computerinstanz


public class OS
{
    private byte[] ram;
    public byte getRam(int address){return this.ram[address];}
    public void setRam(int address, byte value){this.ram[address]=value;}

    public OS(int ram_size){this.ram = new byte[ram_size];}
}

class Main{ public static void main(String...args)
{
    OS computer = new OS(64);//Erstellen eines Computers mit 64 Byte RAM
    int i=0;
    for(char each_char : "hello world".toCharArray())
        SetRam(of computer,i++, (byte)each_char);
        //0~Schreiben Sie "Hallo Welt" an Adresse 10

    for(int j=0; j<11; j++)
    	System.out.print((char)GetRam(of computer,j));
        //0~Adresse 10(Als char)Anzeige
        //→ "Hallo Welt" wird auf der Konsole angezeigt.
}}

"; code=new P().parse(code);

Das ist leicht zu lesen, Zum Beispiel SetRam(of computer, i++, (byte)each_char) Zu computer.setRam(i++, (byte)each_char) Sie müssen einen Parser P erstellen, um ihn durch zu ersetzen. (Reguläre Ausdrücke akzeptieren die Sprache in Klammern nicht, daher fehlt ihnen die Kraft.)

(5. Nachtrag über Dynamik)

Ich war daran interessiert, während ich nicht studierte. Im Kommentarbereich dieses Artikels stellte er die Idee vor, dass "Objektorientierung mitteldynamisch ist". A.B (C); wird von der Hauptmethode und anderen Aufrufern befohlen, Dies bedeutet, dass "A" keine andere Wahl hat, als "B (C)" zu tun. Dies ist im Wesentlichen dasselbe wie " A yoB (C)do" (nur die Platzierung des Motivs ist unterschiedlich). boy.say (stone.place); kann gelesen werden als "Junge, sag mir, wo der Stein ist!" Oder "Junge kann nicht anders als zu sagen, wo der Stein ist".

In letzterem zu interpretieren Sie können es als boy.be_made_to_say (stone.place); umschreiben

Recommended Posts

Der Grund, warum Dunst bleibt, wenn versucht wird, die Objektorientierung als "Englisch" zu betrachten
Ein Kampf, wenn Sie versuchen, dasselbe wie Javas XOR-Modus in C # zu tun
Verwendung der Getter / Setter-Methode (in Objektorientierung)