ブログトップ 記事一覧 ログイン 無料ブログ開設

Strategic Choice

2011-08-08

[]単一責任原則

The Single Responsibility Principle

Uncle Bob

単一責任原則

ロバート・C・マーティン

どういうこと?

良いデザインの基本原則を、強いて1つ選ぶとすれば、それは「単一責任原則(SRP:Single Responsibility Principle)」です。

変更する理由が同じものは集める、変更する理由が違うものは分ける。

1つのサブシステムやモジュール、クラス、関数などに、変更する理由が2つ以上あるようではいけない、ということです。

たとえば?

ルール、レポート、データベースに関わるメソッドを持つクラスがあります。

public class Employee {
	// ルール:給与計算
	public Money calculatePay()...
	// レポート:作業時間報告書
	public String reportHours()...
	// データベース:保管
	public void save()...
}

3つのメソッドが1つのクラスに集められていることを特に問題と思わず、むしろ望ましいと思うプログラマもいるかもしれません。結局のところ、クラスというのは、同じ変数を操作するメソッドの集まりなのだから、と考えるわけです。

しかし、上のクラスが問題なのは、3つのメソッドがまったく違った理由によって変更される可能性があるということです。

calculatePayメソッドは、給与計算に関わるビジネスルールが変わる度に、reportHoursメソッドは、レポートのフォーマットが変わる度に、saveメソッドは、DBAがデータベーススキーマを変更する度に、変更を加える必要があります。3つも変更理由があるEmployeeクラスは、非常に不安定な存在となってしまいます。

さらに重要なのは、Employeeに依存するクラスがすべて、Employeeの変更に影響されるということです。Employeeの変更波及範囲が大きくなっているのです。

どうすれば?

良いシステムデザインとは、システムのコンポーネントがそれぞれ独立してデプロイできるようになっているデザインです。独立してデプロイできるというのは、あるコンポーネントに変更を加えたからといって、別のコンポーネントの再デプロイは不要であるという意味です。

しかしEmployeeが、別のコンポーネントの数多くのクラスによって利用されるのだとしたら、Employeeに変更を加える度に、他のコンポーネントの再デプロイが必要になります。それだとコンポーネントデザインの大きな利点が失われてしまいます。

よって、以下のようにクラスを分割します。

public class Employee {
	public Money calculatePay()...
}

public class EmployeeReporter {
	public String reportHours(Employee e)...
}

public class EmployeeRepository {
	public void save(Employee e)...
}

関連

[]怒れるアーキテクトとしてビジネスと対立するな

The Business Vs. The Angry Architect

Chad LaVigne

怒れるアーキテクトとしてビジネスと対立するな

チャド・ラヴィーニュ

どういうこと?

自己過信が度をすぎると、ビジネスの人々に尊大な態度を取るようになります。

自分の知識を過信して、話を聞くよりも話をすることに夢中なります。さらに、「技術に優れた理解を持つ自分に、あえて反論を挑む愚かな人々」と相手を見下し、皮肉を言い、短気になり、そして怒るのです。

そんなことをすれば、アーキテクトとしてのキャリアは終了です。

どうして?

ビジネスは、アーキテクトの存在理由です。この事実を見失ってはなりません。アーキテクトはビジネスにサービスを提供するために生きているのであって、その逆ではないのです。

どうすれば?

ビジネス側の話を聞き、理解することは、問題を解決するための重要なスキルです。

ビジネスドメインのエキスパートに、敬意を示さなければなりません。近づきにくい人間だと思われてはいけないのです。「自分が賢いので、誰も自分より価値のあることを言えない」という態度を取れば、そのうち避けられるようになってしまいます。それは、コミュニケーション崩壊のきっかけを作り、自分で自分のチームを壊しているということです。

ビジネスの進め方に意見してもかまいませんが、いやみな感じで話して人目を引こうとする「不機嫌な天才」を演じてはなりません。相手は本当にうんざりしてしまいます。優れたアーキテクトになるために大切なことは、仕事に情熱を傾けることです。さまざまな怒りで熱くなりすぎることではありません。

意見の不一致を受け入れて仕事を進めることを覚えまます。どのような方法であれ、ビジネスとよい関係を結び、自分のエゴで関係を損ねないようにすることです。そうすれば、生産性の高いアーキテクトになれるはずです。

関連