Il programma CS della mia scuola evita qualsiasi menzione di programmazione orientata agli oggetti, quindi ho fatto alcune letture per conto mio per integrarlo - in particolare, la costruzione di software orientata agli oggetti di Bertrand Meyer.
Meyer sottolinea ripetutamente che le classi dovrebbero nascondere quante più informazioni possibili sulla loro implementazione, il che ha senso. In particolare, sostiene ripetutamente che gli attributi (cioè le proprietà statiche, non calcolate delle classi) e le routine (proprietà delle classi che corrispondono alle chiamate di funzione / procedura) dovrebbero essere indistinguibili l'uno dall'altro.
Ad esempio, se una classe Person
ha l'attributo age
, afferma che dovrebbe essere impossibile dire, dalla notazione, se Person.age
corrisponde internamente a qualcosa di simile return current_year - self.birth_date
o semplicemente return self.age
, dove self.age
è stato definito come un attributo costante. Questo ha senso per me. Tuttavia, continua sostenendo quanto segue:
La documentazione client standard per una classe, conosciuta come la forma abbreviata della classe, sarà ideata in modo da non rivelare se una determinata caratteristica è un attributo o una funzione (nei casi in cui potrebbe essere).
cioè, afferma che anche la documentazione per la classe dovrebbe evitare di specificare se un "getter" esegue o meno un calcolo.
Questo non lo seguo. La documentazione non è l'unico posto in cui sarebbe importante informare gli utenti di questa distinzione? Se dovessi progettare un database pieno di Person
oggetti, non sarebbe importante sapere se si Person.age
tratta di una chiamata costosa o meno , così potrei decidere se implementare o meno una sorta di cache per esso? Ho frainteso quello che sta dicendo o è solo un esempio particolarmente estremo della filosofia del design OOP?