SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

japan.internet.com翻訳記事

階層化アーキテクチャと依存性注入・依存性逆転

アプリケーションを階層化して構築する考え方の紹介

  • X ポスト
  • このエントリーをはてなブックマークに追加

緩やかに結合したアプリケーションアーキテクチャを構築するには、アプリケーションを単にいくつかの異なる層に分けるだけでは済みません。本稿の最初の部分では、階層化アーキテクチャをもっとスマートなやり方で利用できるようにするための設計原則について説明します。さらに、このプロジェクトに依存性注入を取り入れてプラグ可能なアプリケーションアーキテクチャを実現する方法を具体的に示します。

  • X ポスト
  • このエントリーをはてなブックマークに追加

はじめに

 大多数の開発者は階層化アーキテクチャアプローチの価値を理解しています。階層化アーキテクチャの中核的な考え方は「責任の分割」です。各層はそれぞれ限定的な量の仕事について責任を負います。ある特定の層で遂行すべきでない仕事は、それを処理するのにふさわしい層に委任されます。

 しかし残念ながら、階層化アーキテクチャを支持している人でも、階層間に必要以上の結合を持ち込んでしまうことがよくあります。階層間の結合度が高くなると、アーキテクチャの変更や拡張が難しくなり、結果として脆弱なアプリケーションになりがちです。

 本稿では、堅牢性やテスト容易性(testability)という点で問題のある手法を使って構築されたプロジェクトを例にとり、アプリケーションの柔軟性とテスト容易性を高めるのに役立つ原則とテクニックとリファクタリング方法をいくつか適用します。

 本稿の最初の部分では、階層化アーキテクチャをもっとスマートなやり方で利用できるようにするための設計原則について説明します。さらに、このプロジェクトに依存性注入を取り入れてプラグ可能なアプリケーションアーキテクチャを実現する方法を具体的に示します。

手近な事例

 まずは手近な例で考えてみましょう。私は自分の会社の従業員情報を表示するために、図1のような画面を開発するよう頼まれました。これはごく「単純な」画面なので、私はすぐにリスト1のようなコードを書き上げました(念のため言っておきますが、これが現実の例であれば、私は決してこんなコードは書きません)。

図1 いかにも簡単に作成できそうに見える画面
図1 いかにも簡単に作成できそうに見える画面
リスト1 最初のユーザーインターフェイス
public partial class 
   ViewEmployeesTightlyCoupled : Page
{
   private const string ConnectionString = 
      "data source=(local);Integrated Security=SSPI;" + 
      "Initital Catalog=NorthWind";
   private SqlConnection connection;
   protected void Page_Load(object sender, EventArgs e)
   {
      if (! IsPostBack)
      {
         PopulateGridFrom(MapFrom(GetAllEmployees()));
      }
   }
   private DataTable GetAllEmployees()
   {
      using (connection = new 
         SqlConnection(ConnectionString))
     {
         SqlCommand command = connection.CreateCommand();
         command.CommandText = "SELECT * FROM Employees";
         command.CommandType = CommandType.Text;
         connection.Open();
         using (SqlDataReader reader = command.ExecuteReader(
            CommandBehavior.CloseConnection))
         {
            DataTable results = new DataTable();
            results.Load(reader);
            return results;
         }
      }
   }
   private List<Employee> MapFrom(DataTable employeeData)
   {
      List<Employee> employees = new List<Employee>();
      foreach (DataRow employeeRow in employeeData.Rows)
      {
         employees.Add(MapFrom(employeeRow));
      }
      return employees;
   }
   private void PopulateGridFrom(List<Employee> employees)
   {
      this.employeesRepeater.DataSource = employees;
      this.employeesRepeater.DataBind();
   }
   private Employee MapFrom(DataRow row)
   {
      return new Employee(Convert.ToInt32(
         row["EmployeeId"]), row["LastName"].ToString(), 
         row["FirstName"].ToString(), row["Title"].ToString(),
         Convert.ToDateTime(row["BirthDate"]), 
         Convert.ToDateTime(row["HireDate"]));
   }
}

 リスト1は、私がわざと問題のある方法で記述したコードです。コードの内容をよく読んでみると、いろいろな問題が見えてくるのではないでしょうか? このコードはアプリケーションアーキテクチャのいくつかのルールに違反しています。

  • 接続文字列がハードコーディングされている
  • ユーザーインターフェイス側がデータベーステーブルの詳細を知らなければならない
  • ユーザーインターフェイス側がデータベースデータをドメインオブジェクトにマップしなければならない
  • 抽象ではなく実装にコーディングしている

 最後の項目のことはしばらく忘れてください。まずは最初の3つの項目について、階層化アーキテクチャによる改善に取り組みます。

次のページ
階層化アーキテクチャによる責任の分割

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
japan.internet.com翻訳記事連載記事一覧

もっと読む

この記事の著者

japan.internet.com(ジャパンインターネットコム)

japan.internet.com は、1999年9月にオープンした、日本初のネットビジネス専門ニュースサイト。月間2億以上のページビューを誇る米国 Jupitermedia Corporation (Nasdaq: JUPM) のニュースサイト internet.comEarthWeb.com からの最新記事を日本語に翻訳して掲載するとともに、日本独自のネットビジネス関連記事やレポートを配信。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

Jean-Paul S. Boodhoo(Jean-Paul S. Boodhoo)

.NET 1.0のベータ1から.NET Frameworkに従事してきた.NET開発のエキスパートで、アプリケーションのアーキテクチャ作成と設計と開発で7年以上の経験がある。アジャイルプラクティスと実際的なビヘイビア駆動開発(BDD)テクニックを通じてチームの成功を支援する独立コンサルタントとして活躍している。BDDを.NETに応用する記事をVisual Studio Magazine、DevX、MSDNに寄稿。ポッドキャス...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/1622 2007/09/04 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング