Inversion of Control Pattern

2017/10/23 WPF::Prism
制御の反転(MSDN)
制御の反転(Wikipedia)
Inversion of Control(Martin Fowler)上のWikiの説明のソースはここ。

違いを絵にしてみた

従来の手続き型プログラミング

手続き型プログラミング

PGはプログラム

制御の反転

上と矢印の向きが変わっているので制御の反転(呼ぶ方と呼ばれる方が逆転している)。
制御の反転

M AのMはモジュールのM

実装方法

Prismにおける利用

依存性の注入に関してはこちら
テンプレートメソッドの例としてはUnityServiceLocatorAdapter(?)。

Façade Pattern

2017/10/13 WPF::Prism
ファサードパターン

これもGoF本にある古典的なパターン。
Façadeはフランス語で建物の正面。
複雑なインターフェイスを簡単に使えるように単純化したり、似たようなインターフェイスが複数ある場合は、間にファサードインターフェイス置く事で利用する側がインターフェイスが切り替わっても影響を受けないようにする(下記ILoggerFacadeはこっちのパターンですね)。

Prismにおける利用

IContainerFacade.cs クラスと ILoggerFacade.cs
直ぐに見つかったILoggerFacade.cs
public interface ILoggerFacade
{
     void Log(string message, Category category, Priority priority);
}
facade010.png

メッセージを受け取ってもそのまま捨てるEmptyLogger、DebugLoggerはDebug.Listenersのコレクションに追加、TextLoggerはコンストラクタでTextWriterを受け取りそこに書き込む、TraceLoggerはTraceクラスに書き込む。
Bootstrapper.csではTextLoggerが指定されている。
好みの方法でログを保存したければILoggerFacadeを実装しBootstrapper.csのCreateLoggerを上書きする。

Event Aggregator Pattern

2017/10/06 WPF::Prism
イベントアグリゲーターパターン。
イベントを集中管理する。

アグリゲーター(寄せ集める人・組織)は巨大掲示板のイメージ。
情報を発信したい人はそこに書き込む(発行:publish)、情報を取得したい人は必要な情報を1箇所でまとめて取得(購読:subscribe)できる。

Prismにおけるイベントアグリゲーター

ここによればMartin FowlerのEvent Aggregatorパターンの変形。
サンプルはこちら
必要な(興味ある)イベントだけ購読できるようイベントのフィルタリング機能もあります。

Dependency Injection Pattern(依存性の注入)

2017/10/02 WPF::Prism
ASP.NET MVCで初めて知ったパターン。
AngularJSでも使いまくり。
DIと略されていたり。
IoCの一種だそうです。

言葉は難しいですがやっていることは単純。
依存性とか言わずに依存オブジェクトの注入と言ってくれると分かりやすいとのにと思います。

これで充分な気がします…。 
リンク先の日本語ページが消えてました(2018/06/25現在)。英語版もprevious-versionsの中に移動しています。
また消えると面倒なので画像もらってきましたm(_ _)m。

依存性の注入

ClassAを呼び出す側(Builder)が依存性(IServiceAを実装したクラス)を注入。
// 上図のClassAの例(コンストラクタで注入する場合)
public class NewsReaderPresenter : INewsReaderPresenter
{
    // 依存クラス(上図ではIServiceA)
    private readonly INewsReaderView view;

    // コンストラクタで依存クラスを受け取る
    public NewsReaderPresenter(INewsReaderView view)
    {
        this.view = view;
    }

    public INewsReaderView View
    {
        get { return this.view; }
    }
    …
}
NewsReaderPresenterクラスは自分でビューを作成せず呼び出す側がコンストラクタで指定したviewを使う。
呼び出す側は求められているビューの仕様(INewsReaderView)に合わせたビューを作成し渡す。

こじつけ

プレゼンターが仕事をしようとするとビューが必須(ビューに依存)。
そのビューを外部から受け取る。
呼び出す側はビュー(依存性)を注入できる。

Prismでの利用

各所で使われている。
NugetでPrismインストール時にDIフレームワークの選択を迫られる。
使い慣れた好みのフレームワークが無いのであればUnityが無難。

Composite Pattern

2017/10/02 WPF::Prism
苦戦中。

Composite Pattern自体は古典的なパターン
ツリー構造を表現する時に使われます。

リンク集のカテゴリーで、ここだけカテゴリーを細分化したい、最初からカテゴリーの階層の深さを設定したくない、と言う時にお世話になりました(デザインパターンを意識して利用した初めてのケースだったかも)。

カテゴリーとページに共通のインタフェイスILinkItem(パス、タイトル、公開フラグ…)を持たせ、カテゴリーはILinkItemを子供にすることができる。

カテゴリー(枝)にサブカテゴリー(枝)を追加することもページ(葉)を追加することもできる。
(容器(枝)と中身(葉)の同一視)

PrismにおけるComposite

馴染みのあるパターンだしRegionが器(Composite)でViewが葉(Leaf)かと思いましたが探しきれず。Compositeの意味が違うのかと思いましたが、ここを読むとGoF本のCompositeで間違いなさそうだし。確認しろと言われているShell.xamlはこちら。XAMLみて構造分かるほどXAMLに精通してないし、挫折しそうな予感。

とりあえず次ぎ行きましょうか。
OK キャンセル 確認 その他