Index: [Article Count Order] [Thread]

Date:  Sat, 16 Aug 2003 13:49:20 +0900
From:  Kenji HIRANABE <hiranabe@....jp>
Subject:  [XP-jp:04605] 責務,変更,シンプル (was Re: 	「 An ExtremePro)	grammingEpisode 」の翻訳版を
To:  extremeprogramming-jp@....jp
Message-Id:  <3F3DB7D0.172FDF38@....jp>
References:  <20030814110211.0C58.AKASAKA.H@....com>		<200308141221.GJE39494.UBNOVV@....jp>		<20030814195423.158F.AKASAKA.H@....com> <200308151325.JIC76439.ONVUBV@....jp>
X-Mail-Count: 04605

平鍋です.

楽しい議論で盛り上がっていますね.

> > XPでは今分かっているものを、シンプルに実現することに注力する訳ですけど、
> >
> >   シンプル ≒ 自然な役割分担
> >
> > と考えてよいのだとうと思います。
>  個人的な感想から言うと、「自然な役割分担」と思う状態は個人によって差が
> あって、誰もが曖昧さなく納得するのは難しいような気がします。「シンプル」
> というのは、「重複がなく、これ以上リファクタリングすべきコードが残ってい
> ない」と言い換えれば、達成したかどうかが誰でも同じ基準で納得できるような
> 気がします。

なるほど.「シンプル」がより「現実的な」基準ということですね.賛成です.

また,どちらの場合でも,「名前」に注目するとその分割,分担が良いかどうか,
が見えるというケースが多いと思っています.

ちょっと平鍋なりにロジックを作ってみます(未完).

まず,「よい設計」として,次の「ビジネス的価値」基準を出発点とします.

・プログラムの開発・保守のトータルコストが低いこと
・プログラムを早期に出荷すること
・プログラムがビジネス変化に対応すること

このためには,

(1)仕様変更のコスト・タイムが小さい ⇒ extendibility(architecture 連続性)が高い設計
(2)欠陥除去のコスト・タイムが小さい ⇒ testability が高い設計

という2つクライテリアが重要です.(正の変更と負の変更のコスト)

そして,それを支える

(3)プログラムの理解コスト・タイムが小さい ⇒ human-readability(=understandability) が
高い設計

が最も重要です.

--------------------------
(1)は
【Extendibility Principle】(by Meyer)
・Small changes of specification should yeild small change of architecture.
仕様をX軸,アーキテクチャをY軸に取ったとき,その関数が連続関数であること,
つまり少々の仕様変更は少々のアーキテクチャ変更になること.
【Software Design Principle】(by Meyer)
・Build it for change.

(2)はXPの規則でもある【Software Should be Tested】これがなければ
ソフトウェアを「正しい」と言うことができない.
--------------------------

さて,「責務分担」ですが,まず,(3)の
understandability(理解しやすい)を重要としましょう.
これは「説明しやすい」とも捉えられます.そうすると,

(A)現実の世界と直接対応【Direct Mapping Principle】(by Meyer)
(B)シンプルである(直接対応でないが,簡単である)(by Beck)

という2つの分担方針があるか,と思います.どちらの場合にも当てはまる,
責務分担の原則は,次に原則に照らして評価できます.

(A)(B)に共通する原則
--------------------------
【A Good Abstraction Has A Good Name】
・よい抽象化は,よい名前を持つ.(by 平鍋)
--------------------------

ここまでで,もっとも重要な(3)のunderstandabilityという性質については,
(A)(B)の2つの方針があり,どちらでも「良い名前が付けられる」という
ことが一つの条件になりうる可能性を示しました.(実際は,A’として
メタファを使うことができ,これもunderstandabilityを上げます.そして
それでも,現実世界⇒認識世界と置きかえることで,MeyerのDirect Mapping
Principleは機能します)

次に,(A)と(B)は対立するクライテリアとなることがあります.
これは,(1),(2)の正負の変更に対する容易さとコストの
トレードオフになります.....

と,ここまで,書いて,うまくまとまりませんでした(^^;)....ただ,
「テスト可能性」と「変更に対する追随性」でもって,うまくオブジェクト指向
的な「よい設計」を再定義できる気がしています.

old:
よい Separation of Concerns = 自然な責務分割 + 強い凝集度 + 弱いカプリング

new:
よい Separation of Concerns = 変更を伝播させない分割 + テスト可能な分割

以上