言語使用的に現状(記事投稿時点 2021年12月)では、どうしようもないよね、でも、知らないとハマるよね。っていうシーンに出会ったので、忘れないように記事にしておく次第。
出会ったシーン
結論としては「グローバル変数」と「コンテキスト変数」を”同じ変数名”で命名してしまい、どっちが呼び出されているのか作成者が理解できなくなって混乱した、です。(当方は、混乱しているシーンを Web 会議の画面上で眺めていた)
再現例
現象を極限まで簡略化して説明します。下イメージのようにボタンコントロールの OnSelect イベントで「グローバル変数(Set関数)」と「コンテキスト変数(UpdateContext関数)」で”同じ変数名”(例では val01)を設定しています。
この状態で、ラベルコントロールへ val01 の値を表示させます。コンテキスト変数が表示されました。
スクリーン(画面)を足して、同様に val01 の値を表示すると、グローバル変数が表示されます。
別スクリーンでグローバル変数が利用できるのは変数のスコープ(範囲)による動作ですね。2画面目ではコンテキスト変数を生成してないので Set関数 で指定した値が表示されます。
変数のスコープに関しては、共著「Microsoft Power Apps入門 手を動かしてわかるローコード開発の考え方」で、可能な限りわかりやすく解説しております。変数?スコープ?影響範囲??よくわからないなぁ、と感じる方は書店などで是非お手に取ってみてください。
つまり…
つまり、Power Apps では記事投稿時点では「変数のスコープに関わらず、同一の変数名を利用可能」という言語仕様である、です。また「コンテキスト変数が優先される」という点も前述の動作から確認できました。
前述の例ごとく、関数が列挙されているだけであれば発見しやすいでしょう。しかし、コンテキスト変数は Navigate 関数で画面遷移する際にも生成できます。Form コントロールの OnSuccess で画面遷移が仕込んであって、そこにコンテキスト変数が宣言されている、みたいなパターンは見つけるのにソコソコ苦労するんじゃないかな、と思います。
では、どう対策したら良いか?
「変数の命名に気を付ける」← この1点につきます。
所属企業などのコーディング規約があれば、それに従ってください。規約・ルールが存在しないのであれば、Microsoft から提供されている下記のガイドラインを活用しましょう。
PowerApps キャンバスアプリのコーディング規約とガイドライン
■日本語
https://memo.tyoshida.me/wp-content/uploads/2021/06/4bbaa6955f6a1caa85a9653c13d61d72.pdf
ちなみに、上記ガイドラインにも変数に関しては注意喚起がされています。
ちゃんと書いてありますね。なお、曖昧除去演算子に関しては単純な変数では関係しないので、この純粋な変数という文脈では関連しません。
まとめ
- Power Apps はグローバル変数とコンテキスト変数で”同じ変数名”が利用可能
- ”同じ変数名”が存在する場合、コンテキスト変数が優先される
- 変数の文脈における対策は「変数名をチャンと付ける」以外、現状は無い
- 公式のコーディング規約とガイドラインは読んどいたほうが良いゾ!
同一変数名が利用可能な点が仕様とはいえチョッと不親切だなぁ、と思いつつ。とはいえ、命名に気を付けていれば知らなくても問題にならない箇所でもあるのも事実です。変数名をテキトー付けて利用するのはおススメしないです。意味ある命名をしましょう。たとえば、検証用だったり、1週間ぐらい利用できれば良いみたいな使い捨てのアプリまで、がっつり細かな命名しろ、とは申しませんが、普段から気を付けておくのがおススメだと個人的には思います。
書籍やWebサイトで変数 a とか b 等が利用されがちなのは”変数名短くしないと文章量が増えちゃって大変”等の理由があります。また、変数名よりも、もっと優先して伝えたい情報がある場合(今回のように)val 等の簡素な変数名に”あえて”することもあります。優しさがある書籍なら「ちゃんと命名しましょうね」ってドコかに書いてあるハズです(たぶん。
少なくとも「命名は大切だ!」という点だけは覚えておくと、アプリ作成者もそのアプリのコードを見る方も幸せになる可能性があがります。ローコードと言えども、コードですから。ちゃんと”意味のある命名”していきましょう!
それでは、皆さま。素晴らしい Power Platform Life を!