IT女子がお届けするオフィスワーク効率化・VBA技術紹介

ノンプログラマーによるノンプログラマーのためのやさしい解説付き

スポンサーリンク

【ノンプロ研】定例会参加レビュー「リーダブルコードをめざして」

今日の記事は、セミナー参加のレビューです。

タカハシノリアキ(@ntakahashi0505)さん主催#ノンプロ研セミナーの「ノンプログラマーのための『リーダブルコード』超入門」

f:id:excel-accounting:20180419175312p:plain:w500

全体的にとても勉強になって書きたいことがたくさんあるのですが、こちらの記事では特に勉強になったこと・興味深かったことをまとめてみます。

目からウロコがおちた内容

コードは資産にも負債にもなりうる

・良いコードは他人・自分にとっての資産

・汚いコードは他人・自分にとっての負債

「自分が読みやすいか」という点についてはそこそこ意識していましたが、「他人にとって」という観点がまったくなかったです。

なぜなら、


ノンプログラマは、


「自分のコード」を他人に見られる機会がないから・・・


(自分が他人に配布したマクロツールをその人が興味本位で見ることはあるかもしれませんが、)

本業プログラマの人たちがおこなう「レビュー」というものを受ける機会が無いので「他人」という存在を意識できないんですね。

セミナーではこのことを
「俺様コード(※)でも怒られない」
と表現されていて、

『まさにそれそれ!自分のコードで怒られたことはもちろん、なにか言われたことすらない』のです。


(※)女性には少々品がないので、姫様コードと呼ぶことにします。

f:id:excel-accounting:20180419182524p:plain:w400


ノンプログラマの女性のみなさん、姫様コード負債を量産してはいけません。

他人・自分にとっての資産となる美しいコードをめざしましょう。

データは構造化して使う

ノンプログラマが扱うデータは、書類やレポートなどのオフィス文書が多く、それらは「非構造化データ」である。

非構造化データに対してのプログラムは処理が複雑になってしまうので、扱うデータを「構造化」して管理しておくべしとのことです。

って、難しいですよね。

このチャプターが一番難しいところでした。

自分なりに理解をかみ砕くと、「人が見やすい形式」と「コンピュータが扱いやすい形式」は異なるので、Excelシート上のデータがごちゃごちゃしているのであれば(データが散らばっているのであれば)、表形式に整えるだけでも、VBAはだんぜん組みやすくなります。

同じ処理は関数化する

VBAのFunctionプロシージャのことですね。

「引数を受け取って→処理をして→値を返す」という考え方がノンプログラマ的には少々むずかしいので、

『あっ、この処理Function使えるな・・・いやちょっと難しいからSubでいいや』
(使用変数をモジュールレベルで定義すればSubプロシージャだけでも書けちゃうので)

と思って、関数化を避けていましたが、Functionをマスターできれば一歩進化できそうです。

ドキュメンテーションコメントを書く

「処理概要・引数・戻り値など」をプロシージャ名の直下にコメントアウトで記述しておくことです。

処理内容にはコメントをいれてましたが、プロシージャそのものに対するコメント(ドキュメンテーションコメント)はいままで書いたことがなかったです。

複雑なマクロだと「このプロシージャなんだっけ?」となるので、書いておくとあとで読みやすいですね。

変数の宣言

これは参加者からの質疑応答による内容です。

使用する直前で宣言する

変数の宣言位置は「使用する直前」がベストとのことです。

事前にまとめて宣言すると、中盤以降でいざ使用するときに「この変数なんだっけ?データ型はなんだっけ?」となるので「宣言→使用」の順番にしましょう。

ループ内で宣言してよい

こちらについてはさらっと言っていた内容ですが、かなりの衝撃!

f:id:excel-accounting:20180419175424p:plain:w200


なぜなら、『ループ内で宣言したら何回も繰り返されてムダだよね。』と思っていたので、意図的にループ外でまとめて宣言をしていたのです。

ですが、「一度宣言したら、何回も宣言されないので大丈夫です」とのことです。

こちらの記事にも同様の記載あり。
https://qiita.com/sjuny/items/90f93f6fc175464ba46a

セミナーを受けての改善点

まず手軽に実行できそうなのが「変数の宣言」ですね。

改善内容 これまで これから
変数を宣言する位置 事前にまとめて宣言していた。 使用する直前で宣言する。
こっちのほうがリーダブル!
ループ内での宣言 意図的に避けていた。
(何回も繰り返し宣言するのはムダ?と思っていたため)
「使用する直前で宣言」するためにも、ループ内でも宣言してよい。

実際に、過去の記事で紹介したマクロをひとつ改善してみました。
記事内で掲載しているコードは修正済みです。

www.excel-prog.com

改善前
f:id:excel-accounting:20180419171442p:plain

改善後
f:id:excel-accounting:20180419171506p:plain


やはり使用する直前に宣言のほうが読みやすいですね!


f:id:excel-accounting:20180419232117p:plain:w400


あとは、改善前コードにはムダなコメントが多いので少し削除。


ここで気になるのが、「何度も宣言されないから大丈夫」とはいっても、ループ処理で何回もその行を通過するのであれば、「処理速度に影響はないのか?」ですね。

気になりますよね?


私だけですかね?


というわけでちょっとばかり計測してみました(ニコッ

改善前・改善後それぞれのコードで「100個のフォルダ作成処理」をミリ秒単位で5回ずつ計測。

処理時間の計測方法はこちらの記事と同様です。
Integer型 VS Long型、速いのはどっち?

結果はどちらも1秒±0.1秒程度の範囲で【誤差なし】でした。

(100個のフォルダが1秒で作れるなんてすごいですね)


以上、大変勉強になりました。

聞いて納得だけでは意味がないので、あとは実践あるのみですね。

スポンサーリンク