変数の宣言は最初でなくてもいいのでしょうか
最近コードの再利用などを考えるようになってから
多少の実行速度の差 等よりも見やすさを重視しているのですが、
変数の宣言位置に疑問を抱くようになりました。
その中で不要になったコードを消した際にそこで使われていた
変数が宣言されたまま取り残されていることが多々あることに気づきました。
その対策として変数を使う場所で宣言した方が管理がしやすいのではないかと
思うようになり一度試しに過去の質問で出してみたところ
「→VBでの文化はちょっと分からないんですがJavaなどでは変数の宣言は使う前がいいと言われてますね。」と言われたので
やめました。
でも実際のところ変数の宣言を途中で行ったとしてもバグの原因にはそんなにならないですよね?
極端な話
VBA
1Sub tset() 2 Dim i As Integer 3 For i = 1 To 10 4 Dim j As Integer 5 j = j + 1 6 Debug.Print j 7 Next i 8End Sub
こんなことをしてもエラーにならず ちゃんとJ
の値も保持されますし...
でも、文化として定着しているからにはそれなりの理由があるのではないかという
考えが頭をよぎり
変えたほうが見やすい or 変えない方がいい の葛藤で毎度の様に手が止まります...
皆さまはどう考えますか?
教えて頂きたいです。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答6件
0
ベストアンサー
人によって変わると思いますが、私は「変数を使う場所で宣言」派です。
理由の一つは、質問内でも言及されている
不要になったコードを消した際にそこで使われていた
変数が宣言されたまま取り残されていることが多々あることに気づきました。
というコードを見ることが多く、それを反面教師としたためです。
それ以外の理由としては
- 変数の有効範囲を狭めるため(コードを読むとき考慮すべき事項を減らす)
- 処理の一部をプロシージャに分離するときに、コピーする範囲が少なくて済む
などがあります。
「最初で宣言する」派の意見の一つとして、
「まとめて宣言しておいた方が、どんな変数か確認しやすい」というものもありますが、
Ctrl + I
・Shift + F2
といったショートカットキーを使えば簡単に確認出来るため、理由としては弱いと考えています。
ただ、「一画面に容易に収まる程度の短いプロシージャ」であれば最初でまとめて宣言した方が見やすく感じることもあります。
投稿2018/07/25 10:12
総合スコア2166
0
私も先頭ではなく使用する直前がベストだと思います。
「→VBでの文化はちょっと分からないんですがJavaなどでは変数の宣言は使う前がいいと言われてますね。」と言われたのでやめました。
この部分で該当の過去の質問のベストアンサーを見てみましたが、kamikazelightさんが言ってる「変数を使う場所で宣言」と、unz.horiさんが言ってる「使う前」は、どちらも「使用する直前」を指しているように思えます。やめてしまったのは勘違いだったのでは。
投稿2018/07/25 14:40
総合スコア686
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
下記のリンク先では、変数を使用する直前で宣言した場合のメリットを実例を含めて分かり安く解説しています。
私自身、今まで習慣的に最初で宣言していましたが、これを読んで、直前宣言派に転向しました。
投稿2018/07/25 11:51
総合スコア34017
0
昔のコンパイラや言語では変数宣言を先頭で行う必要があった、というのが今も残っている……というのが正直なところでしょう。
個人的には「初期値を決定する時点で宣言する」ですね。
特殊な理由で初期値を設定できない場合(まずありませんが)は先頭に持っていきますが。
投稿2018/07/25 10:19
総合スコア13703
0
制約あるいはコーディングルールがない限りは、使う直前に宣言したほうがわかりやすいでしょう。特に、JavaScriptでconst
な変数を、ほかの値から生成するような場合、値が揃ったより後に宣言文を書くしか方法がありません。
【制限の例】
- C言語では、C99以前には関数の先頭、あるいはブロックの先頭でしか変数宣言が認められていませんでした。
- JavaScriptの
var
は「巻き上げ」と言って宣言より上でもアクセスできてしまうので、先頭に書くほうが、変数の有効範囲と一致するようになるので逆にわかりやすくなります。
また、Rubyでは変数に明示的な宣言をする構文がなく、はじめての代入が宣言になるので、「先に宣言だけ」することがそもそもできません。
投稿2018/07/25 10:24
総合スコア145626
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/07/26 00:28
2018/07/26 00:40
2018/07/26 00:54
0
解決済でもう誰も見ていないかとは思いますが…。
※以下は私の考えであり、かつ、勉強不足があるため、間違いだらけかもしれません。
変数の宣言を先頭に書くことについてですが…、
C/C++は先頭に書かなくてはならないという制約がありましたが、そもそも変数はスタックメモリに配置されるもので、記述する順番によってはアライメントの影響を受け、スタックメモリを余計に消費することがあったりする。そのアライメントを意識してプログラムするような企業なんかもあったりする。今はメモリも大容量なのでその辺どうなのかはわかりませんが。
vbaも宣言する順番によってアライメントの影響を受ける。
例えば、以下の順番で宣言したもの
Dim a As Long
Dim b As Long
Dim c As Long
Dim d As Byte
Dim e As Byte
を、次のような順番にしたら…
Dim a As Long
Dim d As Byte
Dim b As Long
Dim e As Byte
Dim c As Long
後者の方が前者より6バイトほど余計にスタックメモリを消費する。(多分)あ、32ビットCPUで。
たかが数バイトじゃないか、と言われればそうなんですが、
vbaって再起処理を50回くらいループさせるだけでスタック不足のエラーが起こってしまうなど、とかくスタック領域が小さいように思える。平衡二部探索木を再起にしてもエラーが起こったり、たかだか深さlog(n)程度やのになんでやねん!と思ったことがある。今のvbaはどうかは知りませんが、その辺を考えると数バイトももったいないかなと思ったりもします。
しかし、vbaは変数が何バイト使われるかがわからないようになっていて、
例えばObject型変数はポインタ変数としてスタックメモリ上に4バイト(+インスタンスがヒープメモリだかなんだかに配置される)、String型変数もポインタ変数としてスタックメモリ上に4バイト(BSTRへの参照)、など、普通にはわからない事だらけ。あ、32ビットの場合です。
そんな状況でアライメントもクソもあるかと思ったりもします。
ここまでアライメントの事について書いておきながら、結局はどうでもいいんかい、という事になりますw
まー、要するに、
宣言する位置は、それぞれの考え、それぞれの思いのままになさったらいいんじゃないでしょうか。
という事ですw
投稿2018/10/30 15:26
総合スコア18
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/11/08 13:45
2018/11/08 15:04 編集
2018/11/10 11:27
2018/11/10 21:09
2018/11/11 03:46
2018/11/11 04:34
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/07/26 00:41
2018/07/26 11:26
2018/07/27 02:38