見出し画像

【いきなりStudio7】代入アクティビティでガチろう~変数と引数の取り扱い~最低限の命名規則を意識しない=キラキラネームは、ガチラーから嫌われる( ´∀` )

さてと、前回

オブジェクト指向言語の醍醐味である、

ワークフロー ファイルの呼び出し

まではやったので、今回は

代入アクティビティ

で、

xamlファイル間の値のやりとり

について、やってこ( ´∀` )コイツをしっかり理解して使いこなせると、

変数と引数で変幻自在に遊べて、
ガチりの幅がグンッと広がる

ので、今回も、

じっくり考え方とか作法を交えながら
紹介してくや( ´∀` )

※ジムで二回風呂入って、ビール片手に今回も書いてます( ´∀` )


代入アクティビティ

がUiPath 公式なんだけど、

内容薄っす👀💦

ちょいと操作を

前回までにやってたソース

今回からはRobotMainがメイン
上から3番目の代入アクティビティを選んで
てな感じでドラッグ&ドロップで、
アクティビティを追加
今追加した代入アクティビティを選んで
右側のプロパティタブを表示して~~~
てな感じで

値を設定の中身をクリックして、編集状態にする

ここでポイント①:ショートカットキーで作成

  • 変数:Ctrl+Kキー

  • 引数:Ctrl+Mキー

で作れるので、ここではデモンストレーションで作るだけだから( ´∀` )

  • 変数:VariableValue(処理の間で変化する値)☞demoVar

  • 引数:ArgumentValue(処理の間で引き渡す値)☞DemoArg

て前提で、まずは変数を。

Ctrl+Kを同時押しで、既に変数を設定が出てくるので~~~
でdemoVarを入力して、Enter
てな感じで入力できた💃
まずは左辺が入力でけたことを
アクティビティでも確認して~~~
編集エリア左下の変数をクリック
てな感じで
  • 変数のデータ型:String

  • スコープ:RobotMain(=このxamlファイル全体)

になってることを確認出来た💃

次に右辺の値を適当に、、、

てな感じでStringに合わせて、文字列を入力
てな感じになった👀💦

んで、次は同じ感じで代入アクティビティをもうひとつ追加して、

左辺の変数で、今度は、Ctrl+Mキーを同時押し
てな感じで引数を設定
※いつも思うが、「左辺の変数」て変数しか設定できないような項目名( ´∀` )
てな感じで入力~~~
左辺の入力が出来たところまででけた💃

と、ここで少し変数と引数の違いを。
少しと、言いつつめちゃくちゃ重要( ´∀` )

ここでポイント②:変数と引数(それと定数)の違い

さっき、

  • 変数:VariableValue(処理の間で変化する値)

  • 引数:ArgumentValue(処理の間で引き渡す値)

って書いたんだけど、そのまんま

  • 変数:上から下まで処理を実行する間で、処理中に値が変わっていく値(例:行数など)☞値が変わるから変数

  • 引数:各xamlファイル間なんかで、値を引き渡してやり取りする値(例:ファイルやフォルダのパスなど)☞値を引き渡すから引数

なイメージ( ´∀` )。ついでに定数も加えると、

  • 変数:上から下まで処理を実行する間で、処理中に値が変わっていく値(例:行数など)☞値が変わるから変数

  • 引数:各xamlファイル間なんかで、値を引き渡してやり取りする値(例:ファイルやフォルダのパスなど)☞値を引き渡すから引数

  • 定数:上から下まで処理を実行する間で、処理中に値が変わらない値(例:消費税など)☞値が変わらない=定まっているから定数

こー書くと頭の固い「正しい日本語」とかゆー人で、

厳密に言えば違う

みたいなツッコミを入れてくる輩がいるんだけど、じゃあそもそもプログラミング言語の黎明期では、電子計算機ってゆーくらいだから、最初はあくまでも、

2進数の0と1しかなく、
値が数=数値だけしかなかった

ので、

  • 変数:VariableValue☜直訳すると、変値でないとおかしい

  • 引数:ArgumentValue☜直訳すると、引値でないとおかしい

  • 定数:ConstantValue☜直訳すると、定値でないとおかしい

はずなモノを、

値=数

って訳してしまってるんだけど、今や、文字列やらデータテーブル型、辞書型、配列などなど、

本来で言えば数値でないモノまで全て、
数って言ってるのが、
厳格に言えばそれこそおかしくないのか( ´∀` )

ってなってしまってるんだよね~~~。

アクション・リサーチと乖離した研究職ではないので、実務では

あくまでも、

数=値☞そんなもん

くらいなイメージで、

当たり前の作法だけ理解して、効率よく
作りたいものが作れたらそれでいいので、

理解しておく方がいい。厳密に言えばとかゆーてたら、

すぐに作れるロボットも作れなくなるぞ( ´∀` )

ここでポイント③:何故、変数と引数で書き方が違うの?

  • 変数☞demoVar=小文字始まり

  • 引数☞DemoArg=大文字始まり

なんだけど、これは前回

示した、

【キャメルケースの基本】

  • アッパーケース(大文字始まり):ファイル名、フォルダ名、引数名

  • ロワーケース(小文字始まり):変数名、関数名

で、UiPath は民主化されたテクノロジーで、ローコードツールなので、そこから入っている人は、あんま意識することがないんだけど、例えば、さっきのソースの引数を逆に小文字始まり(ロワーケース)で

てな感じで

変数も引数も、
同じく小文字始まりにしちゃうと、
ぱっと見、
どちらが変数でどちらが引数か区別がつくか

って話( ´∀` )で、結局

この変数、引数を開いて

いちいち確認しないと分からない
=余計な手間がかかる

ので、

  • 変数:小文字始まり☞ロワー

  • 引数:大文字始まり☞アッパー

って区別してるだけの話。だから、この規則性を共通理解しておけば、

コッチの方が、どちらが変数でどちらが引数か一発で分かるでしょ

ここでポイント④:StudioXでやってたみたいに日本語にしちゃえばいいじゃん❓👀

これに関しては、【UiPath StudioXの遊びかた】の

でやってたソースをStudioで開くと、

■変数

みたいに日本語で、

Studioも出来なくはないんだけど

■引数

そもそも引数が空

何故かと言えば、これまでの【いきなりStudio】でゆーてきたとおり、StudioXでは、開発者に✓を入れない限り、そもそも

ワークフロー ファイルを呼び出しアクティビティが存在しない
☞ファイル間で値をやり取りする
って概念が存在しない
=引数って概念がなかった

から成立する話で、、、ここでポイント②でゆーてた話同様、

全てを日本語にできなくはないけど、
引数と変数が存在するStudio

で、

みたいに、こんなに単純なモノならできなくはないけど

これが、

てな感じで

変数、引数って付いてなかったら、
ぱっと見でどっちが変数でどっちが引数か分かるか
❓👀

って話。なので、立て付けの機能として、

  • ワークフローの呼び出しがなかったStudioX=変数しか存在しない=日本語で書いても支障はない

  • ワークフローの呼び出しがあるStudio=変数と引数が存在する=日本語で書くとどっちが変数か引数かぱっと見わからない

ので、

ロワーとアッパーで使い分けた方が、
開発が効率的になる

って話

一歩前へ:じゃあなんで単純にvarとArgじゃなくてわざわざ、demoVar、demoArgみたいに修飾語を付けてるの❓👀

これもよく、新人ちゃんから現場では聞かれる話で、

「変数だからvar(例:Excelの行数ならrow、回数ならcnt)、引数だからArg(例:Excelのファイル名ならFileName、ファイルパスならFilePath)じゃいけないんですか?」

があるんだけど、前回示した

メゾスコピックな=構成要素単位の処理

必ず一個しかファイルを開かない
回数を一回しかカウントしない
なんてものばかりだと思う
❓👀

行数を全部rowってやってしまうと何のシートの行数なのか
ファイル名を全部FileNameってやってしまうと、どのファイルなのか
が、

ぱっと見分からない
=ソースを辿らないといけなくなる

ので、例えば、Configファイルを取り扱うとして、

  • 修飾子+変数名:現在のシートの行数☞configFileCurrnetSheetRow

  • 修飾子+引数名:Configファイル名☞例:ConfigFileName

てな感じで、

命名規則を定めておくのが普通

前回ゆーたみたいに

もう一歩前へ:Studio開発での原則

  1. 最初から、今後の改修を意識しながら新規でも開発する=作法を身に付ける(以下、省略)

ぱっと見、時間がかかるのと時間がかからないのは、どちらの方が

改修コスト(時間とか作業工数)
がかからないでしょう
( ´∀` )

って話。なので、これも前回ゆーたけど

シンプルイズビューティフル

で一定の規則で共通理解をしておけば、

ソースがややこしくならない
☞改修が簡単になる
=最初からそれを意識して作っておけ

ってだけの話( ´∀` )
(ま、肌感覚の話なんで、ここはいくらゆーても素人の自分流=オリジナリティって勘違いしてヤル奴はやるんだが( ´∀` ))

さらにもう一歩前へ:うちの現場では、変数や引数の頭に、データ型_変数名や、データ型_引数名にしろってゆーてるけど、、、

これも結構、メインフレームの時代から、

オブジェクト指向言語の醍醐味=再利用

をよく理解してないまま、

積み上げ方式

の弊害が残ってる現場で多い👀💦
(マジで引くレベル( ´∀` ))んだけど、

あくまでもシンプルに、
どっちが読みやすいか=管理しやすいか

で考えたらいい。
実際、ここまでの操作でやった変数や引数名を

さっきまでを
その規則に従って変更後

でやっちゃうと、同じデータ型の場合、

ぱっと見、区別がつかなくなる

し、さっきまでゆーてた

キャメルケースの基本】自体が破綻する

でしょ( ´∀` )そこまでしてデータ型なんてわざわざ頭に付けなくても、データ型を確認したいだけなら、それこそ調べたいときに、

てな感じで確認すれば済むし

むしろ、こっちが問題なんだけど、作成当初は、String型だったのが、要求変更があってデータ型が数値型に変更になったときに

この手間を考えてるのか❓👀

って話。全部一括管理出来てれば変更は可能だけど、語彙力がない前任者なんかが

てな感じで

データ型以外、似通った名前で既にほかに変数や引数名があった場合どうするの❓👀💦
って話。ま、だから普通は、ひとつ前でゆーたみたいに、

  • 修飾子+変数名

  • 修飾子+引数名

って感じで、プロジェクト全体やxamlファイル内で、

ユニーク(一意性)のある名前を付けて管理する

んだけどね( ´∀` )だって、変数や引数も、UiPath って開発環境の中では、

で示した

データ

に過ぎないから( ´∀` )だから実際、StudioXでもStudioでも、作成(定義)した値は全て、

てな感じで

データマネージャ

で管理してるでしょ( ´∀` )ホイ、おそらく全てここまで読むと繋がってきたところで、

関連記事:

で過去に紹介してるから参考にどうぞ~~~( ´∀` )

さてと、なっがい(しかし、重要な)前置きが終わったところで操作に戻って、

さっきデモで作った余計な変数は削除して~~~

引数は値を引き渡す(やり取する)だけなんで

コイツを
てな感じで
で変数を代入

ここまでの操作は、初期値を設定(=初期化)してるだけなので~~~

で触れた

シーケンスアクティビティ

を追加して、
てな感じに変更

でもって、前回

ワークフロー ファイルの呼び出しアクティビティ

でやった感じで

新規ワークフローファイルを追加
てな感じで、作成ボタンをクリック
追加出来た

で、前回まででやった感じで、新しく追加したファイルに

てな感じ

で、

メッセージをログアクティビティを追加

しておいて、RobotMainに、

てな感じで

ワークフロー ファイルの呼び出しアクティビティ
をドラッグ&ドロップで追加

さらに、
てな感じで選んで、開くボタンをクリック
こんな感じ

で、ReadConfig.xamlファイルに、今度は代入アクティビティを使わずに直接

追加前
追加中
追加後

てな感じで、引数を追加。RobotMainに戻ると、

引数をインポートの横の数字がオレンジになっているのでクリック
Valueが空欄なので~~~
一回Cancelボタンでキャンセルしておいて、

さっきの一歩前へで、やってたstr_付きの変数名と引数名を元に戻して、

てな感じで、
入力
OKボタンをクリック
オレンジが消えたのを確認して~~~

ReadConfig.xamlに戻って、代入アクティビティで、冒頭の変数作成と同じ要領で、

てな感じで

変数を設定。さらに、代入アクティビティを追加して、

てな感じ

で、このまま実行すると、実はMain.xamlにも

てな感じで、数字がオレンジになってる引数インポートがあるので~~~
ここは何も、Valueに値を設定せずに
(まだ、RobotMainからMain引き渡す値
がねーし( ´∀` ))
OKボタンだけをクリック
てな感じでオレンジが消えたのを確認

一旦ここまででファイルを全部保存して~~~

実行

コイツな
一応、実行は出来たけど

引き渡した値のメッセージをログしてなかったので~~~

RobotMainに、

てな感じで、メッセージをログを追加( ´∀` )
てな感じ

で保存して、再実行して、出力パネルを見ると

ちゃんと、Configファイルを実行した後に、

入出力でReadConfig.xamlからRobotMain.xamlに引き渡した

Config読み取り実行=引数の値

が返ってきてる💃とまあ、ここまでで今回メインな

変数と引数の値のやり取り

のイメージが湧くように操作をメインで話したんだけど、

ここでポイント⑤:引数をインポートは方向が命

今回は、

てな感じで、入出力でやっているので、方向が

なんだけど、もっと厳密にInとOutを区別して

ReadConfig.xamlに、
出力用の引数をひとつ追加して、
入力用と出力用の引数を明確に分離

ReadConfig.xamlにアクティビティを追加して、

てな感じで変更
引数をひとつ追加して方向を変えたから
オレンジになっているので~~~
て感じにして、OKボタンをクリック

より分かりやすくしたいのであれば、RobotMain.xamlを

てな感じでメッセージをログを追加して

実行すると

てな感じになる

つまり、方向性まで意識して引数を定義すると

てな感じで
  • 方向が入力:DemoArg→InReadConfig ☞ Name←Valueな方向性=右から左

  • 方向が出力:InReadConfig→DemoArg ☞ Name→Valueな方向性=左から右

  • 方向が入出力:InReadConfig⇔DemoArg ☞ Name⇔Valueな方向性=双方向なやり取り

って違いが分かると思う( ´∀` )

とここまでは、あくまでもデモで教室事例なので、さっきの

「さらにもう一歩前へ:うちの現場では、変数や引数の頭に、データ型_変数名や、データ型_引数名にしろってゆーてるけど、、、」で示したみたいに

頭にInとかOutとか方向を明示する文字を付けると、既に分かりにくくないか( ´∀` )

てのが出てくるでしょ( ´∀` )

実は、単純に考えると、OutReadConfigArg引数って、

要は、実行結果を返してるだけ

だから、わざわざ引数名の頭にOutだのInだの付けなくても

てな感じで

RunResult:実行結果

にして、

てな感じで

変更しても、

さっきと

全く同じ実行結果が返ってくるだけなんだどね( ´∀` )

ここまでのまとめ:やったことない人にはマニアックに見えるかもしれないけど、

如何に、ワークフローファイル(=前回やったオブジェクト)間でただ、

値をやり取りしてるだけ

ってのが分かるでしょ( ´∀` )で、それがこれまで滔々と話してきた

変数とか引数の命名規則ひとつで、読みやすい(=管理しやすい)モノになるか否かが変わってくるか

が分かるでしょ( ´∀` )ま、ここの感覚を解説するのに必要だったから、ちょっと意地悪な回り道で、

str_だの、InだのOutだの頭に付ける
☞普通の現場でよく陥りがちな命名方法

なんかをしなくても、

設計(コンストラクション)を意識

しておくと、実は、

ワークフローの最終的な実行結果を返すだけ
☞RunResultみたいな引数でOK

ってのが分かるでしょ( ´∀` )さらに、どのxamlファイルで実行したかまで分かりやすくしたければ、

てな感じでしてあげれば
でも見れば

一発でどこから、どんな処理の値が出力されてるか分かる

から、

単純に、
RunResult
ってするより分かりやすいでしょ( ´∀` )

で、Main.xamlの変更可能性も考えて、

ここまでのソースをリファクタリング

RobotMainの引数と変数を、

編集

■RobotMain

DemoArgを書き換えたら自動的に変わる

■Main.xaml

引数をインポートボタンをクリック後、OK押すだけ

だって、Main.xamlは、

結局、RobotMainの最終的な処理結果が引き渡されるだけ

だから、

RobotMainResult:ロボットメイン処理の処理結果
☞引数名としては十分

だからね( ´∀` )

Studioだと、StudioXの初期設定になかった

ワークフローファイルの呼び出しで値をやり取りしてるだけ
(☞オブジェクト指向言語の醍醐味=Studioの真骨頂)

で、如何に

変数名と引数名の取り扱いが
Studio開発のカギを握るか

動けばいいや、自分のやり方は違う

で、可読性も変更可能性も意識せずに、変数名と引数名を漫然と意識もせずに、語彙力もなくやり取りしてると

如何に危険で管理しにくくするか

が分かると思う( ´∀` )

さらにもう一歩前へ:変数の初期値を入力する箇所

で、ここが今回の最後なんだけど、ここまでのソースではオイラは、

てな
てな感じで、
  • 変数:代入アクティビティで初期値を設定

  • 引数:変数の代入結果をそのまま代入

て感じにしてたんだけど、勘のいい人はお気づきだと思うけど、UiPath Studioは値を代入する方法として、

ココの既定
ココのValue

それから、今回示した

編集エリアで代入アクティビティを使って指定

の3つがあるんだけど、

何故前者2つは使わないのか👀❓

必ずそうしないといけないって訳ではないんだけど、

【理由】

  1. 「ある値は、引数のインポートの中」、「別の値は、変数や引数の定義エリアで規定の値を設定」、「そのまた別の値は代入アクティビティで」、、、と統一性がない書き方をすると、他の人はおろか数か月後の自分ですら見落とす危険がある☞不規則なモノは必ず見落とす危険がある

  2. ハードコーディングの禁止で、値は極力直打ちしない方がいい。☞Configファイルで極力管理。

  3. 引数のインポートや変数や引数の定義エリアの既定を設定すると、初期値を設定してるのと変わらないので、繰り返しの中で使った場合、繰り返しの度に、最初の処理で値が上書きされてしまい、想定した処理結果にならない危険あり。

だから。どうせ初期値を設定だけするなら、編集エリアで明確に

てな
てな感じで明確にしておくと、

処理の最初に
①何の値が
②どこから入ったか
が把握しやすいでしょ

☞管理や確認コストの軽減( ´∀` )

さらに引数は、この記事の冒頭で説明したとおり、

引数=あくまでも、値を引き渡す(やり取り)するだけのもの
☞引数に直接、値を書かない。
=変数を使った最終処理結果なんかを代入するだけ

で統一しておく。

これを意識してない自称さんほど、

変数も引数もお構いなしに、どんどんいろんな箇所に統一性もなく、直で既定値を設定して、改修コストもかさんで、ドツボにハマってるんだよねえ( ´∀` )

元凶としては、

  • UiPathの基礎コースでの例示

  • Re-Frameworkテンプレート

  • Frameworkて意味

なんかを

自分で突き詰めてよく考えずに、
漫然と素通りしちゃって

  • Re-Frameworkで引数をインポートのValueに値を直書きしてるからそのままやってしまう→やっていいいし、UiPath が提供してるモノがそーだからこれが正しいと思い込む

  • Frameworkて部品を少しでも変更したら壊れるって勘違い☞Frameworkって意味わかってんのか( ´∀` )

が開発現場では多いんだけどね( ´∀` )本当に、

  • Re-Frameworkテンプレートがそうしてるからってそれしかしちゃいけない

  • UiPath から提供されたFramework部品を一切変更しちゃいけない

なら、

UiPath Studio自体が
融通が利かないものになって、
業務に合わせた開発の限界とか障壁が多くなる
☞百害あって一利なし

んなこと、

民主化されたテクノロジーを提供してる会社がやるわけないでしょ( ´∀` )

それを触って壊れるのは、

改修方法を知らないか誤っているだけが殆ど。

必要に応じて、適宜、改修を加えられないソースを

テンプレートとかフレームワーク=ひな型
とは言わない

逆に、正直ゆーて、

自分がやりたい処理のアクティビティを組めて、共通する部品を自分で再利用する方法を知ってるなら、別にそんなもん一切使う必要ないんだけどね( ´∀` )

今回の内容としては以上かな( ´∀` )
さてと、最後に

ソース・リファクタリング(まとめ)

■Main

めっちゃシンプル

■RobotMain

めっちゃシンプル

■ReadConfig

( ´∀` )

とまあ、裏を返すと、処理としては一見こんなに

簡単でシンプルな処理しかしてないんだけど、きちんと普段意識しておかないといけないことを説明しようとすると、実は基本的なことだけでもこんだけの分量になるくらい、

すっげえ重要

ってことをイメージしてもらえば十分

さてと、次回は

Configファイルの読み込みXamlの追加まで今回できたので、いよいよ、

Configファイルの読み込み処理のために
必要なアクティビティを組み込んでく( ´∀` )

これもいくつかの記事に分けて順を追って説明してけど、ひと言に、

Configファイルを読み込む

てゆーても、きちんと順を追っていくと、

  • Configファイルの格納フォルダを確認

  • Configファイルの存在を確認

  • Configファイル内のシート存在確認

ってな感じで前回示した構成要素がいくつかの単位に分かれるので~他のロボットにも使える共通的な処理ワークフローファイルを格納して、活用する

ライブラリフォルダを用意

に触れながら、各処理をひとつずつ組み込んでく( ´∀` )

いいなと思ったら応援しよう!