ソフトウェア開発メモ

日々のソフトウェア設計、実装で考えている、気づいた事を書いています。それが真実か否かは保証しません。悪しからず。

機能と責務

 オブジェクト指向によく出てくる(クラス、オブジェクトの)責務という用語について、よくよく考えたら曖昧な用語だと思う。

 

なぜ今迄気づかなかっただろうか?

 

 クラスのリファレンスマニュアルを見ても大抵「この責務とは〜」とは書いてないし、単にメソッド名、属性からあぶり出して行くと機能の羅列か、持っている属性の羅列になる。設計手法の本を読むと、「オブジェクトが持つべき振る舞いとか」ぐらいしか書いていない。

 単一責務の原則「クラスを変更する理由は1つ以上存在してはならない。」という原則も禅問答みたいでよくわからない。理由ってつまり何?という感じ。クラスの凝集度を上げるべきというのは分かるのだけど。

 

 一方、(関数=)機能は分かりやすい。XXXを行う。YYYか否かを判断する。構造化設計でいう機能凝集ですね。
 で、元に戻って責務というと日本語でいう行動するニュアンスが有って、機能とどう違うの?というのが有る。
で関数=機能、オブジェクト=(責務)という視点で、何が違うかというの考える(関数オブジェクトのようなものは話をややこしくするだけで考えない)。

 

決定的な違いは
  インスタンス変数を持つかもたない、持たないという事だ。
 
インスタンス変数は広い意味でのクラスの状態である。数字、文字列、列挙体のようなネィティブ型か、関連するオブジェクトといったものまで。 つまりインスタンス変数(属性、関連オブジェクト)を軸にして提供するサービス=責務という事になる?。
 ただ、これだけだとクラス設計がぶれるので、GRASP等の評価基準をつかって上手にクラスの責務分配を全体最適していく事になる。オブジェクト図を書くなどして。
 

後、http://www.amazon.co.jp/組込みソフトウェア開発のための-オブジェクト指向モデリング-組込みエンジニア教科書-SESSAME-WG2/dp/4798111767を読み返したらほぼ同じ事を書いていましたね。見逃していたorz。


 もう一つ、企業のコラムサイトにも同じ疑問をもっていた人がいて既に言及していた。

 興味がある方は「機能 責務」のキーワードでググってみてください。