私の学校のCSプログラムでは、オブジェクト指向プログラミングについては一切言及していません。そのため、私はそれを補足するために独力で読んでいます。具体的には、Bertrand MeyerによるObject Oriented Software Constructionです。
Meyerは、クラスが実装に関する可能な限り多くの情報を隠すべきであると繰り返し指摘していますが、これは理にかなっています。特に、彼は、属性(つまり、クラスの静的で計算されていないプロパティ)とルーチン(関数/プロシージャ呼び出しに対応するクラスのプロパティ)を互いに区別できないと繰り返し主張しています。
たとえば、クラスPerson
に属性がある場合、定数属性として定義されている場所またはのようなものに内部的に対応するage
かどうかを表記法から判断Person.age
することは不可能であると主張します。これは私にとって理にかなっています。ただし、彼は次のように主張し続けています。return current_year - self.birth_date
return self.age
self.age
クラスの短い形式として知られるクラスの標準クライアントドキュメントは、特定の機能が属性または関数のどちらであるかを明らかにしないように考案されます。
つまり、クラスのドキュメントでさえ、「getter」が計算を実行するかどうかを指定することを避けるべきだと主張しています。
これ、私は従わない。この区別をユーザーに知らせることが重要になるのは、ドキュメントだけではありませんか?Person
オブジェクトで満たされたデータベースを設計する場合Person.age
、高価な呼び出しかどうかを知ることは重要ではないので、何らかのキャッシュを実装するかどうかを決定できますか?彼が言っていることを誤解していませんか、それとも彼はOOP設計哲学の特に極端な例ですか?