いつの間にか、取締役から執行役員にジョブチェンジしたmisawatです。
本日は誰にも求められていない大好評を頂いている「適度にGASを使う」シリーズ第三段です。
前回の記事はこちら。
さて、今日は関数の分割についてです。
これは弊社のメイン言語であるPythonでもそうだし、
プログラムのほぼ全てに当てはまることですが、
前回のように一つの関数に機能を全部突っ込むというのは望ましくないです。
保守性、拡張性、視認性、その他、山程問題がありますので、 機能ごとに関数は分けて書こうね。お兄さんとの約束だぞっ!!
さて、ひとしきり滑ったところで、今日のスクリプト例ですが、 misawat基準としては、 「複数の処理、分岐なし」のときはせめて関数を分けるべしとあるので、
- ブラウザからキャラクター名を入力
- 文字列を厨二病的に加工
- 任意のセルに書き出し
という、プログラムを実装してみます。
1は既存関数一発なのでメイン関数に直接、
2は文字列加工の機能を有する関数を作成、
3は書き込みを行うための情報取得及び書き出しを行う関数を作成。
以上、3つに分けて書いていきます。
まずメイン関数を書きます。
次に「2」の関数の実体をつくる。
ここで登場する「input_name」は引数(ひきすう)というもので、
「return」はその関数の終了の証(返り値の指定)です。
初心者向けにとても大まかな説明で終わらせますが、気になる人は自分で調べてみよう!
(アメリエフのプログラミングトレーニングを受講してくれたらガッツリモッテリお教えします( ̄ー ̄)ニヤリ)
次に「3」の関数の実体をつくる。
さて、このまま実行したいところですが、このままだと「ReferenceError: ~ is not defined」のようなエラーになります(例外あり)。
理由を説明する前に、大前提として「コードは上から順番に実行される」ということを頭に入れておいてください。
・・・、はい、もうおわかりの通り、
main関数を一番上に書いてしまっているので、これが実行されているときは、まだ作成した関数が定義されてないんですね。
例えるならば、
【正】
幹部「部屋に入るには合言葉があるから、「山」って言われたら「川」って返してねー」 兵士「いえすさー」 : 門番「山」 兵士「川」 門番「よし、とおれ。」
【誤】
門番「山」 兵士「??」 門番「・・・」
こんな感じ。 予め、ルール(その関数の処理内容)は知っておかなければなりません。
ということで、正解の書き方はこう。
今回はいきあたりばったりなプログラミングなので、mainを書いて、関数の実体を作成するっていう順番でやってるけども、
もうちょいガチるのであれば、最初にしっかり設計して、クラス、関数を単体で書いてテスト、その後、統合テストといった手順を踏みます。
こうすることで、役割分担もできるしね。
アメリエフではmisawat氏は孤独なので、こんないきあたりばったりな書き方でもOK!だって一人だもん!!・・・一人だもん・・・。
さて、いよいよ実行してみましょう。
コードはこちらに貼っときますね(絶対いらない)。
function add_chuni(input_name){ var out_name = '✝' + input_name + '✝'; return out_name; } function push_chuni_name(push_name){ var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheet = ss.getActiveSheet(); var target_cell = Browser.inputBox('書き込みたいセルを指定してください\\n【例】 A1'); sheet.getRange(target_cell).setValue(push_name); Browser.msgBox('闇に飲まれよっ!!') } function main() { var name = Browser.inputBox('キャラクター名を入力してください'); var name_add_chuni = add_chuni(name); // コレが「2」の自作関数 push_chuni_name(name_add_chuni); // コレが「3」の自作関数 }
さて、この世界に混沌の闇がもたらされたところで、misawatはヴァルハラに帰ります。
次回は3パターン目、「機能ドメインごとにファイルを分ける」の予定です。
あでゅー。
次回はこちら↓ (編集者) staffblog.amelieff.jp