「サブクラス化するのは、スーパークラスの実装をよく知っているときに限るべきだ」

Rubyでは、サブクラスで親クラスのprivateメソッドやインスタンス変数を上書きしてしまい、見付けづらいバグを出すことがあります。

このことについて、オライリーの『プログラミング言語Ruby』P248では、次のように述べています(P250も参照)。

Rubyでサブクラス化するのは、スーパークラスの実装をよく知っているときに限るべきだ。クラスのパブリックAPIだけが必要で、その実装は不要なら、クラスを継承するのではなく、カプセル化と委譲によってクラスの機能を拡張すべきだ。

えー。RailsではActiveRecord::BaseやActionController::Baseを継承しないと何もできないのに。

私はRailsのソースはちょくちょく眺めていますが、すべて把握するのは手に負えないし、初心者には「Railsのソース見ろ」は無理な話だし、どうしたものか。

私の経験では、Railsのコントローラで@templateという変数を作って、「何でエラーが出るんだろう」としばらく悩んだことがあります。