UniRxのReactivePropertyスニペット

UniRx の利用例に ReactiveProperty を public で公開する実装が例示されていたりするのですがそれはちょっと違うんじゃないかなと思ったので記事にしました。

簡単な実装例

public readonly ReactiveProperty<int> Value = new ReactiveProperty<int>();
// IntReactiveProperty でも同じ

上記ですが(まぁ大したことではないのですが)利用者側に Rx を使っていることが公開されているのと、付随して値へのアクセスが Xxxx.Value となるため相手の実装を知らないといけない問題があって微妙に問題があったりします。

本当なら以下のように書いた方がいいと思います。

// [非公開] 中身で使用するRxの実態
private readonly ReactiveProperty<string> sampleStr = new ReactiveProperty<string>();

// 値の変更はプロパティ経由で行う = Rx を使用している子を公開しない
public string SampleStr { get => this.sampleStr.Value; set => this.sampleStr.Value = value; }

// 通知を受け取りたい(Subscribeさせたい)イベント通知はSystem.IObservable経由で行う
public IObservable<string> SampleStrChanged => this.sampleStr;

正しいは正しいですが毎回これ書いてたら嫌になるので(まぁMVxx系の実装って古くからこういうの多いですよね…)のため VisualStudio 向けにスニペットを作成しました。使うと以下のようになります。

「rx」と入力して補完候補を選んで「Tab」を2回入力します。

f:id:Takachan:20210816164030g:plain

でスニペットの中身は以下の通りです。

// rx.snippet

<?xml version="1.0" encoding="utf-8" ?>
<CodeSnippets  xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
  <CodeSnippet Format="1.0.0">
    <Header>
      <Title>rx</Title>
      <Shortcut>rx</Shortcut>
      <Description>ReactiveProp</Description>
      <Author></Author>
    </Header>
    <Snippet>
      <Declarations>
        <Literal>
          <ID>valueType</ID>
          <Default>int</Default>
          <ToolTip>公開する変数の型で置き換えます。</ToolTip>
        </Literal>
        <Literal>
          <ID>propName</ID>
          <Default>Sample</Default>
          <ToolTip>公開するプロパティの名前で置き換えます。</ToolTip>
        </Literal>
        <Literal>
          <ID>fieldName</ID>
          <Default>sample</Default>
          <ToolTip>内部で使用する変数の名前で置き換えます。</ToolTip>
        </Literal>
      </Declarations>
      <Code Language="csharp"><![CDATA[public $valueType$ $propName$ { get => this.$fieldName$.Value; set => this.$fieldName$.Value = value; }
public IObservable<$valueType$> $propName$Changed => this.$fieldName$;
private readonly ReactiveProperty<$valueType$> $fieldName$ = new ReactiveProperty<$valueType$>();$end$]]></Code>
    </Snippet>
  </CodeSnippet>
</CodeSnippets>

rx.snippet · GitHub

上記をコピペ してファイルに保存する or gist から取得して VisualStudio の ツール > コード スニペット マネージャー からインポートすると使えるようになります。

簡単ですが以上です。