No more Death March

あるSEのチラシの裏 C# WPF

WPF依存関係プロパティのバインドモード初期値

依存関係プロパティをバインドする際にModeを省略した場合、

個々の依存関係プロパティ毎に選択されるModeの既定値は異なるとのこと。

 

ちなみにTextBoxはTwoWayです。

 

Modeを省略してTextBoxにバインドするのに慣れて、

ユーザーコントロールを自作して同じような記述でバインドするとプロパティが連動せずあれ???となりました。

 

自作の依存関係プロパティでバインドする時のModeの既定値を変更するには、 DependencyPropertyのRegisterメソッドでプロパティを登録する時に、

メタデータにFrameworkPropertyMetadataクラスを指定する。

このクラスのコンストラクタにModeの初期値を指定するパラメータがありました。

 

情報源は失念しましたが、この辺りのことを調べているときに、

Modeを初期化するとフレームワークのバージョンアップ?でデフォルトの挙動が変わってしまった。という記事も見かけたような気がしました。

 

Modeは省略しないで書くようにした方が良いかもしれませんね。

 

WPF スタイルからビヘイビアでXamlParseException

外部のアセンブリからスタイル経由でビヘイビアを使おうとしたら例外

 

スタイルを書いてるリソースディクショナリでビヘイビアの名前空間しか書いてなかったのが原因、

アセンブリ名も記述すると成功。

 

リソースディクショナリとビヘイビアは同じアセンブリに配置

もちろん、呼び出し側はライブラリに参照設定追加済み

 

XAMLを解析する時にビヘイビアの呼び出しとかでクラスに依存する場合はアセンブリ名も書いておかないとXAMLが型を探せない???

⇒参照設定によるアセンブリ間の依存とXAML経由で呼び出すクラスの依存関係は別もの???

 

 

インスタンスを生成する処理のメリット

コンストラクタで直接オブジェクトを作るより

new Hoge(1,"aaa");

 

作るのが面倒でも生成処理に特化したクラスのメソッドで何をしているか表現した方がわかりやすい。

new HogeBuilder().ChangeId(1).ChangeName("aaa").Build();

 

なんでもかんでもFactoryやBuilderつくりゃ良いというわけでもないけど、

 

 

 

 

 

 

Stairwayパターンの説明の中で

 

C#実践開発手法 (マイクロソフト公式解説書)

C#実践開発手法 (マイクロソフト公式解説書)

 

 第2章「依存関係と階層化」でStairwayパターンについて説明がある、

そのStairwayパターンの話ではなく、

 

インターフェースを宣言したアセンブリについて

アセンブリ外部に依存しない。

サードパーティーのクラスをメソッド等で提供しない。

・インフラのエンティティへの依存も避ける。

.Net Frameworkには依存するよね。

というような話がある。

 

うまく説明は出来ないだろうけどなんとなくわかる。

boolとかIEnumerableとかどんなアセンブリを作ろうが基本ライブラリにはまず依存するだろう。

ただ自作したUserEntityクラスとかサードパーティ製のなんとかクラスとかをインターフェース上にばっちり登場させるとだめですよ。と。

そういったクラスがインターフェース上に登場させたいなら、そのクラスへの依存させないようにインターフェースを作りましょうよ。と。

 

 

 

 

 

Entourageアンチパターン

 「C#実践開発手法」2章でEntourageアンチパターンというのが紹介されていて、

これはインターフェースと実装を同じアセンブリ内に配置しないでね。っていう話みたいだけど、

5章でその例外について触れている。

 ただし、このルールには例外が1つあります。それは、インターフェースの依存関係の一部に依存する実装です。 

C#実践開発手法 (マイクロソフト公式解説書)

C#実践開発手法 (マイクロソフト公式解説書)

 

 

 うーん、、、依存関係の一部に依存する実装???

後続の文章に「それ以上依存関係が生じない可能性が~」とあるけど、

これはなんだろう、

インターフェースを実装しているけど、そのインターフェース以外に依存関係が増えない作りだったらインターフェースと同じアセンブリに入れていいよってことかな?

 

DDD-Specificationパターン

 

エリック・エヴァンスのドメイン駆動設計

エリック・エヴァンスのドメイン駆動設計

 

 

DDDのSpecificationパターン(みたいなもの)を書いてみる。

まずは、ISpecificationインターフェース、型パラメータを引数にboolを返す。

 

 

型パラメータTには顧客クラスとか請求書クラスとか、Entityがインプットになる。

Entity側でIsなんとかメソッドを大量に実装するんじゃなくて、クラスとして分断し、好きに組み合わせることが出来るようにしましょう。っていうことですね。

 

書籍ではAND、OR、NOTといった論理演算を閉じた操作で組み合わせることが出来ますが少し違うアプローチで。

 

まずはAND

OR

そしてNOT