[JAVA] La raison pour laquelle la brume persiste lorsque l'on essaie de considérer l'orientation de l'objet comme "anglaise"

0. Conclusion

Faisons la distinction entre les verbes passifs et les verbes automatiques. C'est tout.

1. Introduction

Vous avez probablement entendu dire que du code orienté objet et raisonnablement lisible peut être considéré comme anglais. Pour lire spécifiquement le code en anglais, lisez ce qui suit.

oop↔eng


matière.prédicat();//1er modèle de phrase
matière.prédicat(complément);//Modèle de 2ème phrase
matière.prédicat(Objet);//Modèle de troisième phrase
matière.prédicat(Objet, Objet);//Modèle de 4ème phrase
matière.prédicat(Objet,complément);//Modèle de cinquième phrase

2. Problème

2-1. Problème facile à comprendre

Cependant, selon le type de prédicat (verbe), il peut être douteux que le «sujet» soit vraiment le «sujet». Par exemple, dans la Liste de java (pour ceux qui ne savent pas, c'est comme un tableau) list.add(obj); Vous pouvez écrire comme ça. Ce code signifie ajouter «obj» à l'instance «list» «list». ** N'ajoutez jamais list" ga "(quelque part) ʻobj` **. Par conséquent, en anglais, il devient "JVM ajoute list obj.", Et la liste n'est plus le sujet. Si vous recherchez l'exactitude de l'anglais, "JVM ajoute list obj." Est également incorrect. Comme add ne prend pas le modèle de 4ème phrase, il doit être écrit docilement comme "JVM ajoute obj à la liste." Cependant, il s'agit d'un problème de langage naturel et ne convient pas pour envisager une règle de conversion unifiée en langage artificiel. Par conséquent, tous les autres verbes continueront à correspondre aux modèles de 4e et 5e phrase. </ sub> </ sub>

2-2. Gros problème pratique

Si le problème de la section 2-1 est recherché, il se développera en un gros problème dans lequel les accesseurs sont commutés à 180 degrés. Autrement dit, getter devient setter et setter devient getter. Par exemple Champ bélier Et ses accesseurs getRam(int address), setRam(int address, byte value) Classe avec OS Préparer et son instance computer Disons que vous avez fait.

Classe de système d'exploitation et instance d'ordinateur


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);//Création d'un ordinateur avec 64 octets de RAM
    int i=0;
    for(char each_char : "hello world".toCharArray())
        computer.setRam(i++, (byte)each_char);
        //0~Écrivez "bonjour le monde" à l'adresse 10

    for(int j=0; j<11; j++)
    	System.out.print((char)computer.getRam(j));
        //0~Adresse 10(Comme char)afficher
        //→ "hello world" s'affiche sur la console.
}}

De cette façon, vous pouvez définir votre propre système d'exploitation (ce qui est inutile), créer un ordinateur virtuel (ce qui est inutile) avec ce système d'exploitation et l'afficher comme bonjour le monde.

ici,

oop


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

Est en train d'écrire "bonjour le monde" en RAM. Qui est le sujet de «set Ram»? Alors, qui écrit (définit) la RAM? ** Ici, le code est un gros mensonge **. Le code répond à cette question, peut-être "ordinateur". ** ordinateur est l'objet à écrire **, n'est-ce pas? .. ..

Si le sujet de «setRam» est vraiment «ordinateur», computer écrit (définit) de la RAM vers le monde extérieur. Et ce n'est rien d'autre que la fonction de getRam," renvoyer le contenu de la RAM à l'appelant ".

En d'autres termes, si vous interprétez le code ** avec obéissance, le setter devient un getter. ** ** Si vous êtes une personne expérimentée qui ne comprend pas cette affirmation, veuillez repenser au début. Lorsque "ordinateur" "écrit" "ram" (à "l'appelant") Le RAM est-il écrit sur l'ordinateur? Ou est-il écrit à «l'appelant»? Pensons-y. Je veux que vous le remarquiez. J'étais habitué au monde ridicule et mes sentiments étaient paralysés.

** De même, getter devient setter **. Si vous interprétez computer.getRAM (~); directement, Ce n'est rien d'autre que la définition de setter car "'computer'" obtient "" ram "".

3. Cause du problème

Ce problème est survenu parce qu'il y a trop peu d'ingénieurs qui peuvent (respecter) faire la distinction entre les verbes passifs et automatiques. Au moins, Oracle a confondu les verbes passifs avec les verbes automatiques pour expliquer l'orientation des objets. Je dois dire qu'il est correct de ne plus comprendre ** l'orientation de l'objet ** C'est misérable pour la scène. Ce qui suit est cité et traduit en japonais à partir de https://docs.oracle.com/javase/tutorial/java/concepts/object.html.

(Citation)

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).

(Traduction japonaise)

Les objets du monde réel ont deux caractéristiques. «État» et «action». Le chien a "nom", "couleur", "race de chien", "faim" comme état, A «aboyer», «ajouter» et «secouer la queue» comme actions. S'il s'agit d'un vélo, il a comme états "vitesse actuelle", "vitesse de pédalage actuelle" et "vitesse actuelle". Les actions comprennent «changement de vitesse», «changement de vitesse de pédalage» et «fonctionnement des freins».

Dans ce texte, il existe une différence décisive (non, fatale) entre le comportement du chien et celui du vélo. Le comportement d'un chien est "l'action entreprise par le chien", tandis que le comportement d'un vélo est "l'action entreprise par autre chose que soi". Comportement du chien «aboyer», «ajouter» et «secouer la queue» sont tous des ** mots automatiques dont le sujet est le chien **, Comportement du vélo «Changement de vitesse», «changement de vitesse de pédalage» et «activation du frein» sont ** d'autres verbes qui n'utilisent pas le vélo comme sujet **.

Un exemple donné comme comportement de vélo est en fait "** opération ** applicable à un vélo".

Même si vous confondez le «comportement» d'un chien avec le «fonctionnement» d'une bicyclette et dites: «Ceci est un exemple d'orientation d'objet», ce serait incompréhensible au sens honnête d'un débutant. ** La situation actuelle est que vous ne pouvez comprendre l'orientation de l'objet que lorsque vous essayez d'oublier la différence entre "action" et "opération" et que vous vous trompez de direction pour obtenir et définir . Dans ce cas, je dois dire: " Il vaut mieux ne pas comprendre **" (Sans savoir que le sujet.prédicat (objet) est un mensonge) ** Comprendre l'orientation de l'objet peut même être considéré comme une sorte de lavage de cerveau **.

4. Solution

4-1. Théorie

En changeant la méthode de verbe passif en passive ou en déplaçant l'instance vers le premier argument, le code orienté objet peut être lu correctement en anglais. Le chapitre 4 expliquera cela.

Comme le montre le chapitre 3, la culture qui ne fait pas la distinction entre les verbes passifs et automatiques a conduit à la confusion entre le sujet et l'objet. Si vous creusez plus profondément, il existe une culture dans laquelle l'objet d'un autre verbe est considéré comme le sujet en orientation objet. ・ ・ ・ ① À l'origine, le sujet des paroles automatiques est "acteur actif" (par exemple, chien qui aboie) </ sub> </ sub>. Le sujet de l'autre verbe est "opérateur" (par exemple, personne qui change la vitesse du vélo) </ sub> </ sub> L'objet de l'autre verbe est «acteur passif» (par exemple, une bicyclette qui peut changer de vitesse **) </ sub> </ sub>. ・ ・ ・ ② Pour résumer (1) et (2), "En orienté objet, lorsqu'un verbe passif apparaît, il y a un problème que le nez passif et le nez du sujet sont inversés."

À l'inverse, lorsqu'un verbe passif apparaît, le sujet et l'objet peuvent être inversés à nouveau en le réécrivant en passif, de sorte que la phrase anglaise correcte est complétée. Par exemple bicycle.change_gear_to(5); Est bicycle.is_changed_gear_to(5); Ou bicycle.gear_is_changed_to(5); Si tel est le cas, il peut être lu comme une phrase anglaise qui peut être traduite en japonais par "un vélo est changé en vitesse de 5", donc il est également correct en termes de sens. ・ ・ ・ Méthode passive

Ou même dans le code, cela amène l'instance à la position de l'argument. change_gear(of bicycle,to 5); Dans ce cas, il peut être lu correctement comme une phrase anglaise sans sujet (JVM pour java), c'est-à-dire une déclaration. ・ ・ ・ Libellé de l'objectif

4-2. Pratique de la méthode passive

Pour un exemple de classe de système d'exploitation et d'instance d'ordinateur:

Classe de système d'exploitation et instance d'ordinateur


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);//Création d'un ordinateur avec 64 octets de RAM
    int i=0;
    for(char each_char : "hello world".toCharArray())
        computer.is_set_ram(i++, (byte)each_char);//by jvm
        //0~Écrivez "bonjour le monde" à l'adresse 10

    for(int j=0; j<11; j++)
    	System.out.print((char)computer.is_got_ram(j));//by jvm
        //0~Adresse 10(Comme char)afficher
        //→ "hello world" s'affiche sur la console.
}}

Certainement, bien qu'il puisse être lu correctement comme une phrase en anglais Cette fois, il y a beaucoup de _ dans le nom de la méthode, ce qui le rend difficile à comprendre. (En particulier, c'est un problème que les méthodes commençant par est en conflit avec la règle de retour d'un type booléen)

Ce problème ne se produit pas dans la formulation objective (sections 4-3).

4-3. Pratique de la formulation cible

Pour un exemple de classe de système d'exploitation et d'instance d'ordinateur:

String code = "

Classe de système d'exploitation et instance d'ordinateur


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);//Création d'un ordinateur avec 64 octets de RAM
    int i=0;
    for(char each_char : "hello world".toCharArray())
        SetRam(of computer,i++, (byte)each_char);
        //0~Écrivez "bonjour le monde" à l'adresse 10

    for(int j=0; j<11; j++)
    	System.out.print((char)GetRam(of computer,j));
        //0~Adresse 10(Comme char)afficher
        //→ "hello world" s'affiche sur la console.
}}

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

C'est facile à lire, Par exemple SetRam(of computer, i++, (byte)each_char) À computer.setRam(i++, (byte)each_char) Vous devez construire un analyseur P pour le remplacer par. (Les expressions régulières n'acceptent pas le langage des parenthèses, elles manquent donc de puissance)

(5. Postscript sur la dynamique)

Je m'intéressais à cela sans étudier. Dans la section commentaires de cet article, il a introduit l'idée que "l'orientation objet est moyennement dynamique". ʻA.B (C); est commandé par la méthode principale et d'autres appelants, Cela signifie que "ʻA n'a d'autre choix que de faire B (C) ". C'est essentiellement la même chose que "ʻA yo B (C)" "(seul le placement du sujet est différent). boy.say (stone.place); peut être lu comme "garçon, dis-moi où est la pierre!" ou "garçon ne peut s'empêcher de dire où est la pierre".

A interpréter dans ce dernier Vous pouvez le réécrire comme boy.be_made_to_say (stone.place);

Recommended Posts

La raison pour laquelle la brume persiste lorsque l'on essaie de considérer l'orientation de l'objet comme "anglaise"
Une lutte en essayant de faire la même chose que le mode XOR de Java en C #
Comment utiliser la méthode getter / setter (en orientation objet)