Ist es Wert, dass get-und set-Methoden in der OOP?
Ich habe gesehen, einige Projekte, in denen Klassen mit get-und set-Methoden zum Bearbeiten Daten einfügen. Lassen Sie mich ein Beispiel hier :
class Student extends dbClass
{
private $TableID;
private $FullName;
private $Gender;
private $Address;
function setTableID($Value)
{
$this->TableID = $Value;
}
function getTableID()
{
return $this->TableID;
}
function setFullName($Value)
{
$this->FullName = $Value;
}
function getFullName()
{
return $this->FullName;
}
function setGender($Value)
{
$this->Gender = $Value;
}
function getGender()
{
return $this->Gender;
}
function setAddress($Value)
{
$this->Address = $Value;
}
function getAddress()
{
return $this->Address;
}
function UpdateStudent()
{
$sql = "UPDATE INTO usertable SET
FullName = '".$this->getFullName()."',
Gender = '".$this->getGender()."',
Address = '".$this->getAddress()."'
where TableID='".$this->getTableID()."'";
$this->query($sql);
}
}
Oben ist die Beispiel-Klasse, die ich gesehen habe. Und unten ist der Prozess, wie Sie es nutzen :
$student = new Student;
$student->setTableID = 1;
$student->setFullName('My Name');
$student->setGender('Male');
$student->setAddress('this is my address');
$studen->UpdateStudent();
Ist es Wert, auf diese Weise? Ich persönlich denke, seine nutzlos zu-Satz-Feld und dann abrufen und aktualisieren von Datensätzen. Es dauert wirklich eine Menge Zeit, um es für jedes Modul. Was ist der beste Weg zu handhaben solchen Sache?
Gibt es irgendeine Sicherheit besorgt, es zu tun auf diese Weise?
Access-Modifier (wie
möglich, Duplikat der Ist es wirklich so falsch nicht mit setter und Getter?
private
) werden oft falsch interpretiert, als Sicherheits-feature. In Ihrem aktuellen C++ - Inkarnation waren Sie eigentlich vorgesehen ist zum begrenzen der ABI (nicht-API) Exposition; was nicht relevanten PHP-und Script-Sprachen wirklich. Erfordern setter und Getter, ist damit oft auch ein Nebeneffekt, aber es ist nicht sehr objektorientiert. Siehe auch PHP Getter und setter: übel oder notwendiges übel? und Java: Getter und setter sind bösemöglich, Duplikat der Ist es wirklich so falsch nicht mit setter und Getter?
InformationsquelleAutor Salman Khimani | 2012-05-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Kommt es an.
Abstraktion ein Feld vom Benutzer bereitstellen, indem eine "intelligente" Eigenschaft (D. H. getter und/oder setter) hat zwei Nachteile:
Und es hat einen Vorteil:
Wenn dieser Vorteil ist sinnvoll (z.B. Sie schreiben einen wiederverwendbaren software-Bibliothek), dann macht es großen Sinn zum schreiben von Eigenschaften anstelle von nackten Felder. Wenn nicht, Sie werden die Arbeit für Sie keinen nutzen.
Können Sie überschreiben die Magie
__get
und__set
Funktionen (vielleicht in einer Basis-Klasse, so können Sie Erben die überschreibung) die automatische Weiterleitung Eigenschaft, die die Zugriffe auf Ihre Getter und setter. Vereinfachte code:Caveat emptor: Seit
__get
und__set
überschrieben werden, werden die__isset
und__unset
sollte überschrieben werden!Nein, gar keine (solange Sie nicht einfügen bugs versehen).
Menschen sind sehr schlecht im Vorhersagen der Zukunft. Wenn Sie den Buchungskreis, gehen für Getter und setter und schaue nicht zurück.
InformationsquelleAutor Jon
In Sprachen, die nicht über Eigenschaften (public-member-Variablen", die eigentlich dazu führen Funktionsaufrufe) getter/setter anstelle von public-Variablen wird in der Regel empfohlen. Ansonsten kann man nicht hinzufügen von Logik (z.B. beim setzen einer variable) später, wenn die Leute schon mit Ihrem schlicht-Feld.
Da PHP ist eine solche Sprache (leider) die Antwort ist ja, verwenden Sie.
InformationsquelleAutor ThiefMaster
Machen setter-und Getter hilft Durchsetzung der OOP Kapselung. Im nicht sicher, für PHP, sondern für viele andere Sprachen (Java, C++), eine gute IDE (eclipse/netbeans) wird automatisch generiert, diese setter und Getter für Sie.
Kann es nicht sofort offensichtlich ist für einfache Typen, aber wenn jede Art von komplexer Verarbeitung durchgeführt werden, dann wird es noch deutlicher.
Ich denke, es ist in der Tat helfen, wenn jede Art von Logik/Verarbeitung notwendig ist, um den Wert zu speichern.
Ja, aber Sie sind immer noch eine böse Abhilfe. In python können Sie die Nutzung öffentlicher vars zum Beispiel, und erstellen Sie einfach ein Eigenschaften (die den Zugriff auf benutzerdefinierte get - /Set-Funktionen) wenn Sie jemals brauchen zusätzliche Logik. In C# Sie erstellen Eigenschaften und entweder lassen Sie den compiler erstellen, die "einfach" getter/setter für intern (Sie sehen Sie nie, und Sie sind nicht die eigentlichen Funktionen können Sie direkt aufrufen) und wenn Sie jemals brauchen, benutzerdefinierte Logik implementieren Sie einfach die Funktionen auf Ihrem eigenen. Allerdings ist der Zugriff auf die Eigenschaft - egal ob es get - /Set-Methoden oder nicht - erfolgt immer über
obj.prop
wie eine variableGenaugenommen private vars dont existieren in Python, aber das ist nur ein detail 🙂 ich verstehe deinen Punkt, aber in den Sprachen, die ich in der Regel Programm, ich bevorzuge, Sie zu halten. Im Allgemeinen bin ich immer gerne zu haben, Getter/setter für alle Attribute, die festgelegt werden können/bekam, so dass die Klasse die Schnittstelle einheitlich für diejenigen, die Logik und diejenigen, die nicht. Dies hält auch die Klasse zukunftssichere, so dass Sie nicht haben, die Klasse zu wechseln-Schnittstelle in die Zukunft.
InformationsquelleAutor Brady
Einem Beispiel, warum manchmal die Verwendung von get-und Set-Methoden:
Ich habe code, der legt einen Wert in 200 verschiedenen Dateien:
Stellen Sie sich der Kunde hat plötzlich eine neue Anforderung: "alle Katze die Namen muss vorangestellt werden, die von 'Süß'
Nun müssen wir alle Erklärungen von Katzen und ersetzen Ihre Aufgaben:
Auf der anderen Seite, Wenn wir eine setter-Methode alles, was wir tun müssen, ist fügen Sie den code hinzu, um 'Süß' an einem Ort:
InformationsquelleAutor Peter verleg