【Power Apps】変数を使う上で知っておきたい3つのこと

Power Appsで変数を使う上で知っておきたいこと3つをまとめました。

+ 変数・コントロールは適当に宣言しない
+ 管理コスト最小化のために変数は可能な限り減らす
+ 使い分けを理解する

気ままに勉強会での登壇資料：[Power Appsの変数・コンポーネント](https://www.docswell.com/s/pplog/5Q864V-variablecomponent)

## 変数は適当に宣言しない

個人利用のアプリであっても、valやtempなどを変数に命名することは避けましょう。
この記事は[この本](https://www.amazon.co.jp/s?k=%E3%83%AA%E3%83%BC%E3%83%80%E3%83%96%E3%83%AB%E3%82%B3%E3%83%BC%E3%83%89&__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&tag=kaitakki0a-22)の内容からいくつか引用しているので、普遍的なよりよいコーディング手法を学びたければぜひ読んでみてください。(PR)

### 具体的な名前を付ける
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/956bcf6c-9508-6fd8-f0f8-ba6b359e64f0.png)

変数がどのような役割を持ち、どのように利用されるかを誰でもイメージできるように、"size"や"data"のような抽象的な名前を付けないようにしましょう。

例えばsizeは高さであればheightですし、文字列長であればlengthです。

### 命名規則に従う
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/fa7e4a0e-5e11-34d3-f2d3-bfc153f8c7cc.png)

_やgbl,locなどの接頭辞を付けるのが一般的です

Power Appsではコントロール/変数/コレクション間での名前の重複が許可されていることもあり、それぞれが同じような名前で命名されていると可読性が低下してしまいます。

これを避けるために会社やPJ内で命名規則を定め、これに従いましょう。

https://powerplatformnikki.com/powerappsnamingconvention

## 管理コスト最小化のために変数は可能な限り減らす

変数が増えれば増えるほどアプリの保守性やコードの可読性はどうしても落ちてしまいます。
以下のアプローチでまずは変数の数を減らしましょう。

### レコード型の変数やコレクションを作成する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/136dfa17-4746-48e4-f006-911d86d9f2c9.png)

このように同時に変更されるような変数はレコード型で宣言することで変数を一つにまとめることができます。
コレクションを活用するのも非常に有効です。

### コントロールの出力プロパティを知る

編集フォームやそのデータカードなどのコントロールの出力プロパティを使用すれば不要となる変数を作成しているケースをよく見ます。

特にForm.LastSubmit、Form.Mode、DataCard.UpdateやDropdown.Selectedなどは知っておくべきです。

https://powerplatformnikki.com/editform

### コントロールの出力値を参照する

上記にも関連していますが、Power Appsではコントロールの出力値を参照することができます。
詳しくは後述します。

## 使い分けを理解する

Power Appsで使用できる変数とユーザー定義関数を、使用できる範囲と値が動的に変化するか、静的に変化するかで分類しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/e020fb30-6dc4-6649-afce-6820a4911eb2.png)

変数は基本的には使用範囲（スコープ順）が狭いものを優先的に利用しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/08febd31-451d-edc6-91e2-e2d401b4e1ed.png)


### コントロールの出力プロパティの値

Power Appsでは、コントロールの出力プロパティの値を変数のように扱うことができます。

#### コントロールの出力プロパティを使用するメリット

コントロールは実体がある分、変数よりも値の変更を追いやすく管理もしやすいです。
また変数は増えれば増えるほど管理が大変になりますが、アプリの構成上コントロールは必要な要素ですので参照したところで管理コストは変数ほど増えません。

#### コントロールの出力プロパティを使用しないケース

コントロールの値は動的に変化するため、特定の時点での静的な値を取得したい場合は通常通り変数を使用しましょう。

また少なくとも参照されるコントロールには適切な名前をつけるようにしましょう。

#### 複数の箇所で利用したり、複雑な数式は名前付き計算式(App.Formulas)を使用する

他画面のコントロールを参照するとパフォーマンスが落ちる場合があるので注意です。場合によっては名前付き計算式の使用を検討しましょう。

[ヒントとベスト プラクティスを使用して、キャンバス アプリのパフォーマンスを向上させる - Power Apps | Microsoft Learn](https://learn.microsoft.com/ja-jp/power-apps/maker/canvas-apps/performance-tips#%E7%94%BB%E9%9D%A2%E9%96%93%E3%81%AE%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%AB%E4%BE%9D%E5%AD%98%E3%82%92%E5%9B%9E%E9%81%BF%E3%81%99%E3%82%8B)

名前付き計算式に複雑な数式を書いておいてそれを参照することで、数式の可読性が向上します。

### With関数

With関数第一引数をレコードとして入力することで、プロパティ内でのみ使用できる変数を定義することができます。

プロパティ内でのみしか利用できないため汎用性はない反面、スコープを区切りつつ数式の無駄を省くことができるため非常に有用です。

https://powerplatformnikki.com/with

### グローバル関数

アプリ上のどこからでも参照できる変数です。

https://powerplatformnikki.com/set

#### コントロールの出力プロパティとの使い分け

前述の通り値を静的に使用したい場合、使用する値がコントロールの形式ではマッチしない場合に使用します。

グローバル変数はどこでも使用できる分非常に扱いやすいですが、乱用してしまうと意図せぬ値の更新がされてしまう場合があります。

#### コンテキスト変数との使い分け
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/390ec308-c158-b6ed-19cd-99b97a7b6b66.png)

基本的にアプリ全体で使用する場合はグローバル変数、特定の画面内のみで使用する場合はコンテキスト変数と、使用範囲に応じて使い分けます。

ただしアプリ全体ではなく2,3個の画面で使用する変数については、どちらを使用すべきか検討が必要です。

コンテキスト変数はNavigate関数で値を渡せるため複数画面でも使用できますが、本来のスコープである定義された画面の外で使用されるため可読性が落ちることがあります。

ただグローバル変数はスコープがアプリ全体であるため、前述の通り意図せぬ値の更新がされてしまう場合があります。

画面数が2,3個と少ない場合などは変数の使い分けは不要だと思います。

### コンテキスト変数

宣言した画面内でのみ使用できる変数です。
グローバル変数とは違い、一つの関数で複数の変数を宣言することができます。

スコープが宣言した画面内であるため、画面数が多い場合にはコンテキスト変数を利用しましょう。

https://powerplatformnikki.com/updatecontext

### コレクション

テーブル形式の変数を格納します。

Power Appsの仕様上一度に2000行までしか格納出来ないこと、初心者が扱いづらいことであまり有効活用されていない気がします。

しかし理解するとアプリの保守性や数式の可読性がかなり高くなるためぜひ理解して欲しいです。

https://powerplatformnikki.com/powerappscollection

### 名前付き計算式(App.Formulas)とコンポーネント
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/597eb95d-d7be-f783-3226-055329bcecb0.png)

コントロールの出力値のように動的な値を出力する数式を開発者側で定義できる機能です。
以下の記事をご確認ください。

https://powerplatformnikki.com/componentproperties

https://powerplatformnikki.com/udfcomponent

## 元記事

https://powerplatformnikki.com/variabletypes/