Ich höre oft Leute sagen: "Ich bin es leid, die Getter / Setter-Methode einzeln zu schreiben, aber warum sollte ich sie schreiben? Wo soll ich sie schließlich schreiben?", Also schrieb ich sie als Artikel.
(100% Garantie, dass Masakari fliegen wird)
Darüber hinaus werden Wörter mit ähnlichen Eigenschaften wie Felder, Instanzvariablen, Eigenschaften und Elementvariablen hier nicht ordnungsgemäß verwendet, sondern gemeinsam als Felder bezeichnet. Darüber hinaus werden Methoden, Elementfunktionen usw. auch gemeinsam als Methoden bezeichnet.
Zunächst werde ich kurz erklären, wie das Konzept der Getter / Setter-Methode geboren wurde.
Eine Eigenschaft objektorientierter Programme ist der Polymorphismus. Dies ist zum Beispiel
Es ist die Natur.
Mit anderen Worten, Sie programmieren für die Schnittstelle, nicht für die Implementierung. Dies ermöglicht es, die Kosten für die Softwareentwicklung zu senken.
Wenn Sie ein Programm für eine Schnittstelle schreiben, dh ein Programm, das die Abhängigkeit von der Implementierung so weit wie möglich beseitigt, ist es am wichtigsten, den konkreten Implementierungsteil unzugänglich zu machen (Kapselung). Felder sind nur in der internen Implementierung enthalten, daher müssen wir eine alternative Methode bereitstellen, um zu verhindern, dass direkt von außen auf sie zugegriffen wird. Dies erzeugt das Muster "Vorbereiten einer Methode zum Erfassen der Daten von außen oder einer Methode zum Ändern der Daten von außen für ein bestimmtes Feld". Die diesem Muster entsprechende Methode wurde später als "Getter / Setter-Methode" bezeichnet.
Das Schreiben eines Beispiels für die Verwendung der Getter / Setter-Methode in Java sieht folgendermaßen aus
class User{
private String name;
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
}
Dies ist die, die Sie oft sehen.
Übrigens denke ich, dass Smalltalk das Konzept der Kapselungs- und Getter / Setter-Methoden am besten widerspiegelt. Dies liegt daran, dass in Smalltalk das Zugriffsqualifikationsmerkmal einer Instanzvariablen (in Java usw.) nicht von protected geändert werden kann.
Object subclass: #User
instanceVariableNames: 'name'
User>>name
^ name
User>>name: aName
name := aName
Hier unterscheidet sich die Setter / Getter-Methode von Smalltalk oder seiner OOPL-Reihe vom üblichen Stil und hat die Form name, name: wie im obigen Beispiel. (Es ist wirklich schön ...)
Die Getter / Setter-Methode hat auch den Nachteil, dass der Code redundant wird. Wenn Sie im folgenden Beispiel nur drei Felder definieren, wird der Code aufgebläht.
class User{
private String name;
private int age;
private boolean isAdmin;
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
public int getAge(){
return age;
}
public void setAge(int age){
this.age = age;
}
public boolean getIsAdmin(){
return isAdmin;
}
public void setIsAdmin(boolean isAdmin){
this.isAdmin = isAdmin;
}
}
In einigen Fällen ist es besser, keine Getter / Setter-Methode zu definieren.
PI (Persistence Ignorance) ist ein Muster der Klasse, das sich "nur als Struktur verhält". Alias POJO (einfaches altes Java-Objekt). Mit diesem Muster kann der obige Java-Code wie folgt umgeschrieben werden:
class User{
public String name;
public int age;
public boolean isAdmin;
}
In einer einfachen Struktur verhält sich das Feld selbst wie eine Schnittstelle, sodass keine redundanten Setter / Getter-Methoden geschrieben werden müssen, und es ist in Ordnung, es so in einem objektorientierten Programm zu schreiben.
Dieses Muster wird häufig in Modellklassen und dergleichen verwendet.
Mit ActiveRecords wie Ruby on Rails und Laravel können Sie dynamisch auf Felder zugreifen, die nicht in Ihrem Code definiert sind.
Zum Beispiel in Laravel
class User extends Model{
}
$user = User::first();
$user->id; //1 oder so
$user->name; //ogiwara
In solchen Fällen ist es natürlich nicht erforderlich, die Getter / Setter-Methode einzeln zu definieren.
Übrigens, auch wenn es nicht im Code definiert ist, wenn es PHP ist, ist @property usw. PHPDoc Wenn Sie es einschreiben, erhalten Sie Unterstützung von IDE usw., schreiben Sie es also wie folgt.
/**
* @property int $id
* @property string $name
*/
class User extends Model{
}
Kotlin, C # usw. haben Sprachspezifikationen, die das Schreiben von Getter / Setter-Methoden erleichtern. Erwägen Sie in Kotlin, dasselbe Benutzermodell zu erstellen, das oben in Java erstellt wurde.
class User{
public name: String
public age: Int
public isAdmin: Boolean
}
Wenn Sie hier die Spezifikationen ändern, z. B. "Um ein Protokoll zu hinterlassen, wenn auf das Namensfeld zugegriffen wird", schreiben Sie einfach wie folgt um.
class User{
public name: String
get(){
println("Auf den Namen wurde zugegriffen")
name
}
public age: Int
public isAdmin: Boolean
}
Mit anderen Worten, "die Verarbeitung kann später für die Erfassung und Änderung von Feldern erweitert werden." Diese Funktion kann wie folgt auch als Felddelegation dienen:
class User{
private realName: String
public name: String
get(){
realName
}
set(value){
realName = value
}
}
Diese Funktion wird in Kotlin, C # unter dem Namen "Getter / Setter" bereitgestellt.
Ich bin sehr zufrieden mit Sprachspezifikationen, die später erweitert werden können, wie Kotlin und C #.
Recommended Posts