Das CS-Programm meiner Schule vermeidet jede Erwähnung von objektorientierter Programmierung, deshalb habe ich einige Lektüre allein gemacht, um es zu ergänzen - insbesondere die objektorientierte Softwarekonstruktion von Bertrand Meyer.
Meyer weist wiederholt darauf hin, dass Klassen möglichst viele Informationen über ihre Implementierung verbergen sollten, was sinnvoll ist. Insbesondere argumentiert er wiederholt, dass Attribute (dh statische, nicht berechnete Eigenschaften von Klassen) und Routinen (Eigenschaften von Klassen, die Funktions- / Prozeduraufrufen entsprechen) nicht voneinander zu unterscheiden sind.
Wenn zum Beispiel eine Klasse Person
das Attribut hat age
, behauptet er, dass es unmöglich sein sollte, anhand der Notation zu erkennen, ob sie Person.age
intern so etwas wie return current_year - self.birth_date
oder einfach so entspricht return self.age
, wo self.age
sie als konstantes Attribut definiert wurde. Das macht für mich Sinn. Er behauptet jedoch weiterhin Folgendes:
Die Standard-Client-Dokumentation für eine Klasse, die als Kurzform der Klasse bezeichnet wird, soll nicht offenbaren, ob ein bestimmtes Merkmal ein Attribut oder eine Funktion ist (in Fällen, in denen es sich um eines handeln könnte).
Das heißt, er behauptet, dass selbst in der Dokumentation der Klasse nicht angegeben werden sollte, ob ein "Getter" eine Berechnung durchführt oder nicht.
Diesem folge ich nicht. Ist die Dokumentation nicht der einzige Ort, an dem es wichtig wäre, die Benutzer über diese Unterscheidung zu informieren? Wenn ich eine mit Person
Objekten gefüllte Datenbank entwerfen würde, wäre es dann nicht wichtig zu wissen, ob es sich Person.age
um einen teuren Aufruf handelt oder nicht , damit ich entscheiden könnte, ob eine Art Cache dafür implementiert werden soll oder nicht? Habe ich falsch verstanden, was er sagt, oder ist er nur ein besonders extremes Beispiel für die OOP-Designphilosophie?