>関数等に切り出されて一箇所にまとめられていれば修正するのは一箇所です。
>ここまではオブジェクト指向は関係ありません。
ここがミソです。1つの関数を考えた場合はそうですが、関数群で考えると違います。
例えばファイル操作を考えてみましょう。
クラスなら以下のようになるとします。
class File{
public void open(){}
public void read(){}
public void write(){}
public void close(){}
}
これなら明確です。ファイルからメモりに変わっても簡単に変更できるでしょう。
しかしCの構造化なら関数同士の関連はありません。
そのため、もしかしたらread()は業務ロジックに組み込まれ関数化されていないかもしれませんし、
write()は3つに分割されているかもしれません。例がファイルなのでそんな簡単な間違いは
しないと言うかもしれませんが、もしこれが業務ロジックなら簡単に判断出来ないかもしれません。
これが関数化(プロセス中心アプローチ(POA)または、データ中心アプローチ(DOA))と、
クラス化(オブジェクト中心アプローチ(OOA))の違いです。
POA、DOA、OOAの特徴と違いについては、以下のサイトがよく分かります。
(分かりにくい表現もありますが)
http://itpro.nikkeibp.co.jp/article/COLUMN/20061019/251255/
ちなみに簡単に変更できた例は、
メモリ上で頻繁に検索するデータが100件から6万件に変わった時の事でした。
検索にキャッシュやヒストリー機能などあらゆる機能を組み込み高速化しましたが、
修正したクラスは1つです。もしCの構造化で組んでいたら、修正箇所と影響範囲を
調べるだけで嫌になっていたと思います。
Loggerのようないわゆる「横断的関心事」はOOに適さないので例としては良くないと思いますが、
普通のLoggerは、staticのフィールド変数として作成して直接使用するため、Logger自体を
メソッドの引数にして使用する事は少ないと思います。
敢えてLoggerを例にするとすると、
void write(Logger l){}
なら、
class Logger{
void write(){}
}
にすべきと言う事です。
>