[[20231117093113]] 『【雑談】VBAでローカル変数の宣言位置』(RX8) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『【雑談】VBAでローカル変数の宣言位置』(RX8)

 質問とかいうわけではないのですが、私はVBAを扱うのを専門にした仕事をしています。
 ちょっと疑問に思ったことがありましたので皆さんの意見を聞いてみたいと思い、投稿しました。
 先人たちのコードを見ると、ローカル変数の宣言をプロシージャの先頭にまとめて書いているものと
 変数を使用する直前に宣言しているものと2パターンありました。

 本などをみるとまとめてプロシージャの先頭に宣言しているものばかりなので
 私も何も疑問に思わず先頭に宣言してましたが、使用する直前に宣言するのはどんなメリットが
 あるんでしょう〜??

 皆さんはどちら派ですか?

< 使用 Excel:Microsoft365、使用 OS:Windows10 >


 どっちでもいいじゃないかと思いますけど
 複数人でコードを書くような会社だと、会社毎のコーディングルールはあると思います

 >使用する直前に宣言するのはどんなメリット
 宣言部と代入/参照部が近いと変数の型を確認しやすいとか? でしょうか

 私みたいな古い人間だと、1つのプロシジャは1画面に収まる行数にすべき、
 とかそういうことを読んだり言われたりしました。昔の話です。

 なので、どちら派といえば、
 プロシジャ先頭でまとめて宣言&プロシジャを短く分割 派
 (モジュールレベルの変数はちょっと困るので余り使わない)
 
 最近の言語や開発環境はVBA/VBEよりすごく便利ですよね...
(´・ω・`) 2023/11/17(金) 10:22:05

コード量小・・・プロシジャ先頭でまとめて宣言
コード量大・・・使用する直前に宣言
(no.2) 2023/11/17(金) 10:29:35

 コーディングルールがあるのであれば、それに従うのが前提として。

 私は、使用する直前に宣言します。
 私が思うメリットは、変数を初めて使用するポイントが
 分かりやすくなることだと思っています。
 それによる可読性のアップかと。
 人それぞれかと思いますが、
 直前に宣言する方は、他言語を習得した方が多いかと
 思います。

 変数のスコープについて理解していますが、
 あえて、ループ内でしか使わない変数はループ内で
 宣言しています。

 '参考文字列の中に、指定の文字が何個あるかカウントする関数
 Function CharCount(ByVal src As String, ByVal char As String) As Long
     Dim cnt&
     Do
         Dim p&, n&
         p = p + 1
         n = InStr(p, src, char)
         If n > 0 Then
             cnt = cnt + 1
             If n < Len(src) Then
                 p = n
             Else
                 Exit Do
             End If
         End If
     Loop While n > 0
     CharCount = cnt
 End Function

(tkit) 2023/11/17(金) 10:37:36


 ご意見ありがとうございます。

 今の会社では大まかなコーディングルールはありますが
 細かな部分は開発者任せになっています。

 私もどちらかと言えば、
 「プロシジャ先頭でまとめて宣言&プロシジャを短く分割」派
 になります。
 結果的にはどっちでもいいんでしょうけど、可読性があがるメリットも
 確かにありますし、直前宣言も取り入れてみようかな・・

(RX8) 2023/11/17(金) 10:56:20


 この話題は何回か議論されています。

 あいかわらず、「直前に書くと読み易い」と言う見解に、私は疑問を感じますね。

 そこで一瞬思考が止まる。何故、定義を済ませて置かないんだよー。

 ただし、書くときは直前の方が楽、(書いてる最中に冒頭に戻る気が起きない)

 まぁ、慣れと開発環境にもよると言う気もします。
 カーソル当てるだけで型情報が出てくれば、直前が読みやすいなんで見解はさらに薄まる。(のじゃなかろうか)

(半平太) 2023/11/17(金) 13:35:23


 すでに議論がなされてたんですね。

 > 書くときは直前の方が楽、(書いてる最中に冒頭に戻る気が起きない)
 んー。確かに。それありますね。

 宣言と代入が一文で出来たら結構楽なんですけどね・・
 VBAにその仕様は無いですし、きれいにまとめたいのもありますし。。

 綺麗にコード書きたいですので、ちょっと迷います。

(RX8) 2023/11/17(金) 14:26:01


 半平太さん
 >そこで一瞬思考が止まる。何故、定義を済ませて置かないんだよー。
 これは、コードの頭で
 「このプロシージャは、これだけの変数を使うよ!」ってなっていないんだ!
 ってことですか?
 正しいとか間違っているとかじゃなく、知りたいんですよね。

 私は、視点を動かさない数行程度のコードなら、どちらでもいいですが、
 100行200行のコードになると、この変数何だ?って、先頭に戻るのが、
 鬱陶しいと思っています。

 そこには、命名の上手さとかあるんでしょうね。

 no.2さんの
 コード量小・・・プロシジャ先頭でまとめて宣言
 コード量大・・・使用する直前に宣言
 が最適解かなと思いました。
(tkit) 2023/11/17(金) 14:37:29

他言語の経験はありませんが、直前派です。

宣言された位置までは、その変数に値が入っている可能性がない、という点が気に入っています。
その位置までは思考から除外できることを、「読みやすさ」と感じています。

というのは(嘘ではないものの)後付けで、どちらかといえば「書くときめんどくさい」が本来の理由ですね。
tkitさんの仰る、読むときに「この変数何だ?って、先頭に戻るのが、鬱陶しい」のもあります。
なぜ先頭にまとめなきゃいけないんだ、読みにくいし書きにくいだろう…と思って調べたら「直前がいいという考え方もある」と知ってこれ幸いと飛びつき、以降そのままです。
(じゃふ) 2023/11/17(金) 14:49:26


 ちょっと、切り口が違うんですけども。

 >一瞬思考が止まる。
 直前に定義する派の人のコードを読む場合です。
 自分のは常に冒頭にありますので、そう言うことは起きないです。

 >「このプロシージャは、これだけの変数を使うよ!」ってなっていないんだ!
 なっていません。
 極端な話、取り敢えず「Dim a,b,c」で始めます。
 当然書いている最中に変数が足りなくなって、直前に定義する。

 ・・で、その先ですが、個人的な事情ですけど、
 自作インデンターで「インデント付け」と「Dimステートメントの冒頭にシフト」を同時に行います。
 だから、完成版は必ず冒頭にあるのが普通です。

 >  no.2さんの
 >  コード量小・・・プロシジャ先頭でまとめて宣言
 >  コード量大・・・使用する直前に宣言
 >  が最適解かなと思いました。
 その見解もありですね。
 規模の大小に関係なく、同じ方針でやるのは、教条主義に陥る危険があります。

 >「この変数何だ?って、先頭に戻るのが、鬱陶しい」
 でも、そこに必ずありますよね。
 途中で定義すると、随分下に行ってから「どこで定義したっけ」となりませんか?
 ※カーソルを当てて→右クリック→定義(D) で当該行へ飛べると言えば、それまでですが。

(半平太) 2023/11/17(金) 15:14:55


 読む方にばかり目が行っていました。

 半平太さんがお持ちのような便利なツールが無かったので、
 私もじゃふさんと同じ経験で書いて読んでし、特に
 >その位置までは思考から除外できることを、「読みやすさ」と感じています。
 が大きいと感じています。

 >>「この変数何だ?って、先頭に戻るのが、鬱陶しい」
 >でも、そこに必ずありますよね。

 ここに尽きるのでは、と思いまして、
 どちらにもメリット、デメリットがあり、許容できるメリットで
 考えが違うのかなと。

 (´・ω・`)さんのように短いコードに出来るなら、
 宣言はどちらでもいいんでしょうけど。

(tkit) 2023/11/17(金) 16:28:18


 長いコードなら、途中にローカル変数を直前に記載しても
 良いかと考えます。(会社でコーディングルールがないなら)

 現在ではローカル変数は使用する直前で宣言するのが主流?

 参考URL: t-hom’s diary より
https://thom.hateblo.jp/entry/2016/12/12/223708

 個人的には... 動けばなんでも良い派なんですが...^^;
(あみな) 2023/11/18(土) 07:53:17

 みなさん、いろんな意見ありがとうございます。
 とても参考になりました。
 長尺コードになったら、ひとまず直前型もやってみようかな・・と思います。
(RX8) 2023/11/20(月) 16:59:24

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.