Propertyの自律機能化

C#のクラス構造にはプロパティという外部アクセス窓口があり、他のクラスやViewとの連携はここに集約される。
非常に便利な仕組みなのだが複数選択時の制御が難しい
親子階層間の数値継承も難しい
他のノードを参照する設計も非常に難しい
要するに複数のノードとの並列制御が非常に難しいのだ。
さてどうしようか。

複数選択時のあるある挙動

複数選択時の難しさ、例えばこうだ

スクリーンショット 2021-07-04 21.48.56

二つ選んでAを動かしたとする。
当然この位置関係のまま右に動いて欲しい所だが…

スクリーンショット 2021-07-04 21.50.34

何も考えずにロジックを組むとAと同じ値をBのプロパティに送ることになるのでAにピタっとくっついてしまう。
「そんなのマウスのクリック座標からの移動値を選択物にあてこめばいいじゃん」と思ったあなた。それは入力がマウスに限定されていればの話だ

スクリーンショット 2021-07-04 22.03.16

プロパティウィンドウからの数値更新
これが非常にやっかいだ。
こいつはノードのプロパティに直結しているので、複数選択時の主(プライマリ)がその他(セカンダリ)に値を発行しなくてはいけない。
するとこうなるのだが…

イラスト2

③まではいい。問題は④だ。
④が作用するプロパティは紛れもなく同じPointなのだ。
そうなると③に戻ってしまい、永久に繰り返してしまう
まぁ実際はフラグ管理で回避できるんだが、
他のノードを参照している場合は?
親子関係にある場合は?
例えば透明度なんかは絶対値更新でよくないか?などなど、入力のルートも様々だしプロパティによって動作仕様が変わるのだ。
プロパティは吊るしのままで、他で回避補間し続けると行き着く先は地獄だろう(何度も堕ちた)。

解決策:プロパティを高機能化する

イラスト3

プロパティに計算機能を持たせるのだ
複数だろうが親子階層だろうが参照だろうがアニメだろうが、とにかく現在の値を出せ!条件計算は勝手にやれ
という思想。
また、プロパティの性質によって計算方法は変わる(座標は相対、透明度は絶対)が、それはプロパティ確立時にDelegateで計算メソッドを渡す
いわば、プロパティのカスタムメイドだ。

イラスト4

これならノードやマネージャーはPropertyだけを相手にしていればよく、最悪でもPropertyBase一個だけを意識すればいい(水面下では大変なことになっているが範囲は限定的だ)。
全体的にはこうだ。

イラスト5

ノードの表面は触らず、水面下でやり取りする。
複数選択以外もこの思想で制御する。

以上、
一ヶ月後には忘れていそうな設計思想のメモだ。

この記事が気に入ったらサポートをしてみませんか?