[1260] 疑りぶかいあなたのための「オブジェクト指向再入門」を読んで
投稿者:SE
2009/05/15 14:06:45
疑りぶかいあなたのための「オブジェクト指向再入門」を読みました。
部分的に同意できる所もありますが、オブジェクト指向の「本質」はマルチプル
インスタンスだと言うのは全く違うと思います。
その論理で行くと、マルチプロセスやマルチスレッドはオブジェクト指向になると
思いますが、これらはオブジェクト指向云々以前から存在する、別の話だと思います。
オブジェクト指向プログラミングの利点は、
「変更がしやすい」事と「変更しても以前の機能が失われない」事です。
簡単に説明します。
先入れ後出し形式のデータ(スタック)をクラス化したとします。
エラー処理を考慮しなければ、大体以下のようになるでしょう。
-----------------------------------------------------------
public class Stack {
private String[] data = new String[100];
private int index = 0;
public Stack(){
}
public void put(String val){
data[index] = new String(val);
index++;
}
public String get(){
String ret = "";
index--;
ret = data[index];
return ret;
}
}
-----------------------------------------------------------
例えばこれを修正して、大文字に変換して返す物を使いたいとします。
-----------------------------------------------------------
public class UpperStack extends Stack {
public String get(){
return super.get().toUpperCase();
}
}
-----------------------------------------------------------
そして、大文字で取得したい場所では、このUpperStackを使うようにします。
ここで重要なのは、基のクラスのStackには全く修正が入らない事です。
そのため、変更により以前の機能のまま使用したい場所には影響がありません。
ちなみに、Stackに別名の大文字で返すメソッドを追加すると言う方法もありますが、
基のソースに修正が入るため、デグレートの危険が発生します。
やたらに継承をしたくない場合は、それでも構いませんが、以下の方式はダメです。
-----------------------------------------------------------
public class Stack {
private String[] data = new String[100];
private int index = 0;
public Stack(){
}
public void put(String val){
data[index] = new String(val);
index++;
}
public String get(boolean up){
String ret = "";
index--;
if(up){
ret = data[index].toUpperCase();
}else{
ret = data[index];
}
return ret;
}
}
-----------------------------------------------------------
なぜダメかは、構造化プログラミングを行っていて、度重なる修正で
スパゲッティープログラム化しているのを見た事のある人なら分かるでしょう。
これを使用している所で、変更の必要ない既存部分にも手が入り、処理にも分岐が
入って複雑化するためです。
適切にオブジェクト指向プログラミングされていれば、修正が入っても劣化せず、
むしろ抽象化され使いやすいクラスになっていきます。
オブジェクト指向プログラミングの目的はこれだけです。
カプセル化、継承や多態化もこれを実現するための手段に過ぎません。
そのため「オブジェクト指向の目的は、再利用性を高める事」は正しいです。
しかしこの場合の再利用性は、関数化などの話ではなく、変更の時の使いやすさを
指しています。
新人が誤解するので「オブジェクト指向はマルチプルインスタンス」と言う記述は
修正か注意書きをしてほしいです。