ゆーたんのつぶやき

株式会社ノークリサーチにてIT関連のシニアアナリストとして活動しています。

継承の束縛を解消するもの



継承はOOPの最大の特徴の一つではありますが、得てして
それが開発時、特に機能追加などの変更が発生した場合
の障害になることも多々あります。


この障害を解決してくれるものは何だろう?と考えていて
昨今のトレンドも踏まえると、以下の二つがその代表的な
もののような気がしました。


まず一つ目はAOPの「DI(Dependency Injection)」です。
ログ出力機能などの例が良く出されますが、複数のクラス
に跨って実装される機能を大元のクラスに実装し、継承を
使って対処しようとすると、多重継承の必要が出てきてし
まったりなど厄介なことになります。DIは単にログ出力の
ためのメソッド呼び出しを呼び出し元クラスのソースコー
ド内に記述せずに済むとういコード上の利便性だけでなく、
この継承との不整合を解消してくれるという点に大きな意
味があると理解しています。


ところがDIだけでは解決できない問題があります。それは
クラスを外部から操作するインターフェース側の問題です。
インターフェースも継承が可能ですが、様々なクラスを統
一的に扱うメソッドを一つ作りたいといった場合、そのメ
ソッドの引数として指定するクラスはある特定のインター
フェースを実装させておく必要が生じてしまいます。使う
側のメソッドを一箇所にしたいというニーズのために、わ
ざわざ引数になる可能性のあるクラス全てに特定のインタ
ーフェースを実装させないといけないのは大きな制約と言
えるかと思います。


これを解決してくれそうなのがGroovyなどがサポートして
いる「動的型付け」です。groovyであれば、下記のような
コードを書くことができます。


//「人間」クラスの定義
class Human{
name
age
}

//「車」クラスの定義
class Car{
name
displacement
}


//「モノ」の名前を表示するメソッド
def dispName(substance){
println "名前は" + substance.name
}

//実際にインスタンスを作成してメソッドを呼んでみる
John = new Human(name:"John", age:20)
Porche = new Car(name:"Porche", displacement:3000);

dispName(John);
dispName(Porche);

HumanクラスとCarクラスの間には何の継承関係も共通の
インターフェースもありませんが、dispName()という同
一のメソッドを使って名前を表示させることができます。
こういった柔軟性を持たせることができるのは「動的型
付け」の大きなメリットと言えるかと思います。


「動的型付け」はgroovyに代表されるようなスクリプト
言語の特徴のように捉えられていますが、本来はスクリ
プト言語に限らず実現可能な技術のはずです。


整理をすると、クラスの内部に継承の壁を越えて柔軟な
実装を加えたいというニーズに応えているのが「DI」、
クラスを利用する際に継承の壁を越えて柔軟な呼び出し
を行いたいというニーズに応えているのが「動的型付け」
ということで、クラスの内と外のそれぞれにおいて継承
が抱えている制約を解決していると見なすことができる
のではないかと思います。(もちろん「DI」にしても「動
的型付け」にしても他の活用方法やメリットがたくさん
あります)


継承というOOPの特徴を生かしつつ、この「DI」と「動的
型付け」がうまい具合にJavaの中に取り込まれていくと、
さらに使い勝手の良い言語に進化してくれるのではないか
とひそかに期待しています。