TOPシステム開発> .NETにおけるもう1つのフレームワーク
.NET
.NETが目指したものは何か

第2回:開発の視点からみた.NET
著者:マイクロソフト  松崎 剛   2007/3/13
1   2  3  4  次のページ
.NETにおけるもう1つのフレームワーク

   「第1回:あらためて「.NET」を考える」では.NETという言葉の全体像として、オープンでネットワーク化されたコネクテッド(Connected)な社会を意識した.NETという観念的な意味に加え、モジュール性の確保、非ビジネスロジック実装からの開発者の解放、セキュリティの確保などの側面を全体的な視点で説明しました。

   前回は実行基盤を中心として.NETの具体的な姿を実感していただきましたが、今回は開発という視点に絞ってその本質をみていきましょう。第1回で、「非ビジネスロジック実装からの開発者の解放」という点を述べましたが、それが開発の世界でどのように具体化されているか実感されることでしょう(ここで記載する例は代表的なもののみですが、動作詳細を理解してもらうためではなく、それが目指している考え方を示す目的で例示していきます)。

   .NETには、開発者が本来埋め込むべきビジネス的な要件や振る舞いとシステム的な振る舞いの両者を混在させない、もしくは後者をできるだけ簡単に記述できるようないくつかの仕組みが備わっています。

   まずは、前回でも少しふれた「属性」とよばれるものについて、その利点やインパクトという視点も踏まえ、より詳しく説明します。.NETで開発をされた方はご存知かと思いますが、「属性」は.NETの開発における非常に多くの場面で活用されています。この「属性」は、ビジネスロジックと非ビジネスロジックなど性質に応じて実装を分離する仕組みの1つであり、開発者自身でも利用することが可能です。

   例えば、AttributeUsageというキーワードを記述したクラスを作成してみます。
カスタム属性の実装(C#)
public enum SampleValue { A, B, C }

[AttributeUsage(AttributeTargets.Class |
    AttributeTargets.Field |
    AttributeTargets.Method |…
    AttributeTargets.Property)]
class MyCustomAttribute : System.Attribute
{
    public SampleValue MyValue;

    public MyCustomAttribute(SampleValue p)
    {
        MyValue = p;
    }
}

   実は、これだけでカスタム属性(=開発者が独自に構築する属性)の作成は完了しています。では、この属性をクラス定義の中で以下のように使用してみましょう。

カスタム属性を使ったクラス(C#)
[MyCustom(SampleValue.B)]
class HelloClass
{
    [MyCustom(SampleValue.C)]
    public String GetText()
    {
        return "Hello World";
    }
}

   上記のようにクラスにカスタム属性を定義しておくと、Mainなどの実際の処理の中で、カスタム属性を利用してそれに応じた振る舞い(動き)を追加することができます。以下の例では、ただ単に設定された属性の値を取り出してコンソールに出力しています(図1)。

カスタム属性の利用(C#)
class Program
{
    static void Main(string[] args)
    {
        Object[] class_att = typeof(HelloClass).GetCustomAttributes(false);
        MyCustomAttribute cust_att = (MyCustomAttribute) class_att[0];
        Console.WriteLine("Class Type is {0}.", cust_att.MyValue);

        Console.ReadLine(); // 入力待機
    }
}

Main関数の出力結果
図1:Main関数の出力結果
(画像をクリックすると別ウィンドウに拡大図を表示します)

   ここでは、わかりやすいように非常に簡単な例示をおこないましたが、この仕組みがもたらすメリットとインパクトを理解しておくことは重要です。それは、開発時に使用するあらゆるクラスやメソッドなどの実装において、「属性」を使うと本来のロジック(メソッドの中のコードなど)とは完全に分離した形で機能を組み込めるという点です。

   例えば、.NETリモーティングなどでも使用されているRealProxyをこのカスタム属性と共に利用することで、プロキシと呼ばれる代理のオブジェクトを仲介させることができます。これにより、クラスのコンストラクタやインスタンスからのメソッド呼び出しのたびにカスタムな振る舞いをメソッドのロジック本体と分離して実装するといった応用も可能です(実際にはオーバーヘッドなども考慮する必要があります)。また、構成ファイル(configファイル)にカスタムな定義を記述して、より動的に振る舞いを変えるといった実装も可能でしょう。

   .NETの開発というと、開発ツールがコードの大部分を生成してくれるため、高度なフレームワークを開発者が組み込んでいくといったことが難しいと思われがちです。しかし、こうした仕組みを使うことで、開発チームの方針に応じた高度な抽象化を実装系の中に組み込んでいくことが可能です。

   例えば、サードベンダーによる.NETのフレームワークなどもいくつか存在していますし、サーバ系のフレームワークを自社で構築している企業なども存在します。

1   2  3  4  次のページ


マイクロソフト株式会社 松崎 剛
著者プロフィール
マイクロソフト株式会社  松崎 剛
1969年生まれ。慶応義塾大学院数理科学専攻修士(博士前期)課程修了。1994年より、情報システム系技術者としてのシステム構築、ソフトウェアプロダクト開発、技術系コンサルティング(アドバイザー業務)などを複数企業で経験。マイクロソフトでは、デベロッパーエバンジェリストとして、開発者向けのセミナーなどを主体とした活動を実施。


INDEX
第2回:開発の視点からみた.NET
.NETにおけるもう1つのフレームワーク
  要件定義に集中して開発できるASP.NET
  新しい価値観を生み出すADO.NET
  開発環境の進む方向性