ASP.NET MVC学前編のLambda表現、依存逆転


ASP.NET MVC学前編のLambda表現、依存逆転
 
前書きは前の文章を読むにつれて、ある友达が疑問を持っているかもしれません.例えば(A.Method(xxx=>x>yy);)このような関数呼び出し文のように、中のxxx=>xx>yyはいったいどのように使われていますか.
逆置きの原則に頼った実現も、本編の最後にざっと説明する.本編には核心的なテーマはなく、強制的に定義するといえばこれらの内容はすべて基礎知識であり、MVCのフレームワークを学ぶために敷かれている.

1 Lambda


Lambda式は日常の開発でよく見られるもので、Lambda式を使って関数体を自由に定義し、コード量を簡素化することができますが、Lambda式とは何でしょうか.
Lambda式は匿名関数であり,匿名関数は委任であるため,lambda式は委任である.(中間言語にコンパイルすると少し違いますが、大体同じです)
 
1.1 Lambdaの定義
Lambdaが依頼した以上、あるタイプがあります.ここで私たちが使っているのは.NETは我々にFun汎用依頼を提供し,Funは戻り値付き依頼タイプである.
 
1.2相互認識
サンプルコード1.1-1
 1         private bool Comparison(int num1, int num2)
 2         {
 3             if (num1 > num2)
 4             {
 5                 return true;
 6             }
 7             else
 8             {
 9                 return false;
10             }
11         }
1 Func ComparisonNum = new Func(Comparison);
2 Comparison(5, 3);//return true

上の例では、Funcのようなタイプの委任が簡単に定義されていることが明らかになっています.ComparisonNumの意味は、intタイプのパラメータが2つあり、boolタイプの関数を返すことです.これは最も原始的なバージョンで、Lambda式に過度に行く方法を説明します.
サンプルコード1.1-2
 1  Func ComparisonNum=
 2                 delegate(int num1,int num2)
 3                 {
 4                     if (num1 > num2)
 5                     {
 6                         return true;
 7                     }
 8                     else
 9                     {
10                         return false;
11                     }
12                 };
1 ComparisonNum(3, 5);//return false

コード1.1−2から,匿名依頼の使用は上記の1.1−1と大きな違いはなく,匿名依頼が簡便であることがわかる.次にLambda式を用いた例を示す.
サンプルコード1.1-3
1  Func ComparisonNum = (num1, num2) => { return num1 > num2; };

1.1-3コードにおいて=>左の「(num 1,num 2)」は使用するパラメータであり、Funcによって定義されており、実際にはサンプルコード1.1-4と書くべきである
1 Func ComparisonNum = (int num1,int num2) => { return num1 > num2; };

1.1-3は簡単な書き方で、VSのような強い環境のサポートがあるので、前の変数によって定義された依頼タイプに基づいて、自動的にLambda式パラメータタイプに設定して、前のタイプの定義に合致するようにすることができますが、=>の右側はLambda式の関数マスターで、匿名で依頼するのと同じ理屈です.この小節はLambdaに対して簡単な例を作っただけで、読者にこの方面の内容を基礎的に理解させることを意図して、紙幅の原因は多く言わない.
 

2.依存逆転の原則


設計の原則は設計モードやフレームワーク設計に従っている.この節では,依存逆置原則の実現の一つである依存注入について説明する.
仕事の中で学習する中で、抽象的なプログラミングに向いて、抽象的に依存して具体的なこれらの言葉に依存しないのはよく見られますが、この節の例はこれらの概念に関連しています.簡単な例は皆さんに理解させます.
1 public class Entity
2 {
3 }

ここではまず、プレゼンテーションとして使用するエンティティクラスを定義します.具体的な機能はありません.
1     public class ObjectFactory
2     {
3         public Entity CreateObject()
4         {
5             return new Entity();
6         }
7     }

次に、Entityタイプを取得するインスタンスとして使用するファクトリを定義します.
1     public class IocController
2     {
3         public static Entity GetEntity()
4         {
5             ObjectFactory entityFactory = new ObjectFactory();
6             return entityFactory.CreateObject();
7         }
8     }

これはコントローラで、クライアントはEntityタイプの唯一の依存を獲得し、クライアントではIocControllerしかできない.GetEntity();これにより、Entityインスタンスが得られる.私たちがしなければならないのはIocControllerとObjectFactoryの結合度を下げることであり、他のものは管理する必要はありません.
図1のように
このときの依存関係は上図に示すように,依存抽象によって解結合される.
 1     public interface IObjectFactory
 2     {
 3         Entity CreateObject();
 4     }
 5     public class ObjectFactory:IObjectFactory
 6     {
 7         public Entity CreateObject()
 8         {
 9             return new Entity();
10         }
11     }

はい、ObjectFactoryタイプを抽象化し、IObjectFactoryインタフェースタイプがあります.
図2
この時の頭の中の図形は図2に示すように、想像は確かに素晴らしいのではないでしょうか.しかし、現実はそうではありません.
1     public class IocController
2     {
3         public static Entity GetEntity()
4         {
5             IObjectFactory entityFactory = new ObjectFactory();
6             return entityFactory.CreateObject();
7         }
8     }

このときの依存関係は図3のように、
図3
悪い感じではないか、大丈夫です.少し修正して、合理的な注入に依存して解結合を完成させることができます.
 1     public class IocController
 2     {
 3         private static IObjectFactory objectFactory;
 4 
 5         public static void SetObjectFactory(IObjectFactory objectfactory)
 6         {
 7             objectFactory=objectfactory;
 8         }
 9 
10         public static Entity GetEntity()
11         {
12             return objectFactory.CreateObject();
13         }
14     }

 
このときの関係依存図は図2に示すようになった.ここでは、IocControllerにプライベートな静的フィールドと静的関数をインスタンスに変換し、IocControllerで静的IocControllerタイプを定義して独自の単一のモードを実装し、インスタンスメソッドを呼び出すことができます.例なので、注入に依存する解釈に重点を置くとこのタイプは完璧ではないので、言語で説明すると、このような設計の構想はASPに似ている.NETMVCにおけるControllerBuilderの様子,すなわちコンストラクション関数注入である.実際に本格的な応用でもそうではなく、次の編で解説します.これはここまでです.