UiPathでデフォルト値に注意すべきアクティビティ　べスト５

#はじめに
　UiPathには便利なアクティビティが多数ありますが、いくつかのアクティビティでは意図せぬデフォルト値が設定されていることがあります。このデフォルト値を（意図せず）放置しているがために、テスト後の修正や本番リリース後の不具合の原因になったりすることがしばしばです。
　ここでは「デフォルト値に注意すべきアクティビティ　ベスト５」として５つほど例を挙げます。（ワースト５かもしれません。）なおランキング自体にそれほど意味はなく、あくまで個人的偏見ですので、あしからずご了承ください。（個人的にUiPath社に修正してほしいランクかもしれません）

#ランキング
##第５位：範囲を読み込みアクティビティ、範囲に書き込みアクティビティ
　第５位はエクセルからDataTable形式としてデータを読み込む__範囲を読み込み__アクティビティと、エクセルにDataTableを書き込む__範囲に書き込み__アクティビティです。
![read_write_range.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/477147/460102d2-67b2-bec7-22f8-97b25bc559f6.png)
左：範囲読み込み、右：範囲書き込み (UiPath.Excel.Activiies Package 2.8.5)

ランクインの理由ですが、__ヘッダーの追加__プロパティが__範囲の読み込み__はデフォルト__ON__ですが、__範囲に書き込み__は__OFF__となっていることです。この非対称性によりヘッダー無しのDataTableを何度書き込んだでしょうか．．．．
なおこれらのアクティビティはAppIntegration-Excel以下とFile-Workbook以下の２種類がありますが双方とも同様のデフォルト値となっています。

ただ、これはテストでほぼ検出できますので、深刻度は低めです。

##第４位：一致する文字列を取得アクティビティ、文字列の一致をチェックアクティビティ
　第４位は正規表現関連アクティビティである、__一致する文字列を取得__アクティビティと、__文字列の一致をチェック__アクティビティです。
![matches.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/477147/eb7eba34-9025-922a-24e8-ac3efd5e276a.png)
(UiPath.System.Activities Package20.4.0)

　デフォルトで__正規表現オプション__中のIgnoreCaseが__On__となっています。これはつまり、[A-Z]のパターンに対してA-Zだけではなくa-zもマッチするということです。またこのチェックボックスは正規表現オプションのプルダウンをクリックしないと出てきませんので、ぱっと見もわかりにくいのが難点です。
　またテストケースによってはテストをすり抜けてしまう可能性もあり、注意が必要なアクティビティの一つでしょう。
　可読性がやや低くなるかもしれませんが、System.Text.RegularExpressions.Regex.Matchesメソッドを使うのも良いかもしれません。

##第３位：データテーブルを生成アクティビティ
　第３位は文字列をDataTableに変換する__データテーブルを生成__アクティビティです。
この中の__型を自動検出__プロパティがデフォルト__ON__となっており曲者です。
![img2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/477147/4630b994-e03f-875a-d9c8-880c2c3469c3.png)
(UiPath.System.Activities Package20.4.0)

データの中身を判断して自動的に列の型を設定してくれますが、しばしば意図した型と違うものになることがあります。また型の判定がデータの中身に依存しますので、テストケースによってはテストをすり抜けてしまう可能性もあります。個人的には特別な理由がない限り__OFF__にしておいたほうが良いと考えています。

##第２位：クリックアクティビティ、文字を入力アクティビティ
　第２位は、__クリック__アクティビティと__文字を入力__アクティビティです。ランクインの理由は、入力メソッドのデフォルトが__クリック/入力をシミュレート__でも、__ウインドウメッセージを送信__でもなく、__Defaultメソッド__になっていることです。
![click.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/477147/fe491c11-7f40-ae27-ff07-51abd87743df.png)
左：クリック、右：文字を入力 (UiPath.UiAutomation.Activiies Package 20.4.1)

なぜ__Defaultメソッド__だと問題になるかというと、UiPathでは入力メソッドのベストプラクティスとして__クリック/入力をシミュレート__を優先して使い、動作しない場合に__ウインドウメッセージを送信__を、それでも動作しない時は__Defaultメソッド__にしましょうというものがあります。実際に__クリック/入力をシミュレート__は高品質に入力を行えますが、他のメソッドはタイミングにシビアなケースでまれに失敗することがあります。そのため、意図せず__Default__にしたままだと、テストでは問題なかったとしても、本番で不具合となるようなこともあります。
　かつては、ソースレビューでのチェックに加え、動作レビューの際に、わずかなマウスの動きや文字入力のタイミングにより__Defaultメソッド__が含まれていないかを見切ることがレビューワーには求められていました。しかし、最近ではWorkflow InspectorやWorkflow Analyzerといった静的解析により__クリック/入力をシミュレート__ではない項目を抽出してくれるようになりましたので、以前のように本番環境まで意図しない__Defaultメソッド__が残っていることは皆無となりました。このような環境改善がなければ第１位だったかもしれません。

##第１位：EXCELアプリケーションスコープ
　第一位はEXCELアプリケーションスコープです。ランクインの理由は、__新しいファイルを作成__プロパティと__自動保存__プロパティがそれぞれデフォルトで__ON__になっていることです。
![eas.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/477147/e5a8529c-a76d-4389-aa67-ddde0faeeab9.png)

　まず__新しいファイルを作成__ですが、本来あると思っていたファイルが無かった場合に、自動的にファイルを作成してくれるものです。いやいや、ファイルが無いなら例外をスローしてよってケースが多いと思うのでデフォルトはOFFにしてほしいところです。
　次に__自動保存__プロパティですが、大きく２つ理由があります。一つ目がパフォーマンスの問題です。__自動保存__が__ON__の場合、書き込み系のアクティビティが実行されるたびに、ファイルに上書きされます。そのため複数の書き込み系アクティビティが実行される場合、その都度ファイル保存が発生し、結果非常にパフォーマンスが低下することがあります。二つ目の理由は、処理の途中でシステム例外などで処理を停止あるいはスキップしなければならない場合に、中途半端な書き込みが発生する可能性です。いずれのケースも保存するタイミングは設計・実装する人が明示的に指定するほうがトラブルは少なくなると思います。

#まとめ
第１位：EXCELアプリケーションスコープ ＝ 新しいファイルを作成、自動保存がONになっていること
第２位：クリック、文字を入力 ＝ クリック／入力をシミュレートがOFFになっていること
第３位：データテーブルを生成 ＝ 型を自動検出がONになっていること
第４位：一致する文字列を取得、文字列の一致をチェックアクティビティ ＝ IgnoreCaseがONなこと
第５位：範囲を読み込み、範囲に書き込み ＝ ヘッダの追加が一方はON、一方はOFFなこと

いかがでしたでしょうか。みなさまも私と同じようにこれらのアクティビティに苦しめられた経験はないでしょうか？私はこれらのアクティビティを使う際は、配置した瞬間にこれらのプロパティをチェックするよう心がけています。みなさんが実装やレビューを行う際の参考になればと思います。