【UniRx】ReactivePropertyのスニペット

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

簡単な実装例

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

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

完全に実装を隠蔽する場合以下のように書くことになります。

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

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

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

ただし毎回これ書くのはかなり面倒なので VisualStudio 向けにスニペットを作成しました。

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

f:id:Takachan:20210816164030g:plain

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

Gist - rx.snippet

// 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 => _$fieldName$.Value; set => _$fieldName$.Value = value; }
public IObservable<$valueType$> $propName$Changed => _$fieldName$;
private readonly ReactiveProperty<$valueType$> _$fieldName$ = new();$end$]]></Code>
    </Snippet>
  </CodeSnippet>
</CodeSnippets>

また以下の Suject のみ作成するスニペットは以下の通りです。

// 展開されるコード
public IObservable<int> Sample => _sample;
private readonly Subject<int> _sample = new();

スニペットの中身は以下の通りです。rxs のキーショットカットで呼び出すことができます。

Gist - rxs.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>rxs</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 IObservable<$valueType$> $propName$ => _$fieldName$;
private readonly Subject<$valueType$> _$fieldName$ = new();$end$]]></Code>
    </Snippet>
  </CodeSnippet>
</CodeSnippets>

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