質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.50%

  • プログラミング言語

    682questions

    プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

適切な変数の定義位置とは

解決済

回答 5

投稿

  • 評価
  • クリップ 0
  • VIEW 252

nvcpg_198

score 14

~~何らかのコードブロック
...
..
.
int a;
~~aを使う何らかのコードブロック
int a;
~~何らかのコードブロック(aは使用しない)
...
..
.
~~aを使う何らかのコードブロック

このコードの例では適切な変数の定義位置は、
変数aが使用されるすぐ前(つまり上のコード)らしいのですが、
なぜですか?変数のスコープが大きいと読み手が不安になると
本で読んだのですが理由がわかりません。

使われているところだけ読み取れると思うのですが・・・

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 5

+5

何らかのコードブロック(aは使用しない)

そのコードを書いたときは『aは使用しない』という約束が守られたとしても、
開発に携わる他人、および未来の自分がその約束に従う保証はありません。

『ともすれば、aが書き換えられているのではないか?』
なにかバグが発生した際に、毎回そのような心配をしなければいけないのです。

ただし

aが定数ならば、const修飾をすることで上記の懸念を回避することが出来ます。
プログラムの内容によっては見通しが良くなる場合もあるでしょう。

const int a = 42;

~~何らかのコードブロック(aは使用できるが、書き換えられない)

~~aを使う何らかのコードブロック

本当に見通しが良くなるかどうかは、状況に依ります。
そのときは気軽にコーディングできたとしても、それが読みやすいコードになるとは限りませんので。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+3

一つのスコープに変数が何十とか何百個もある、という状況を想定してみましょう。
いろいろな問題が発生することがわかると思います。

  • どれを使えば良いのかわからない
  • どうしてここではこれを、あっちではあれを使っているのかわからない
  • どの時点でどれがどんな値になっているかわからない
  • 名前が似ているとかで間違った変数を使ってしまう
  • ある変数がどこで必要なのかわかりづらくなる(ごちゃごちゃっと値を格納して、ン百行下で一回だけ使うとか、嫌らしいパターンもありそう・・・)

まだまだあると思いますが、端的に言えばプログラムを正確に把握するコストがとても高くなってしまいます。

プログラム全体で使うものは上の方に定義しておいて、特定の処理で使ったら用済みになる変数はスコープの中に定義することで、各変数の意図も多少はっきりしますし、トラブルの温床も潰せます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+3

不安になるかどうかは人それぞれですが、大きな理由は二つあると思います。

一つは、読む側の理由として、変数の定義位置と使う位置が離れていると可読性が下がるということです。
関数の頭で定義されている変数がどこでどう使われているのかは、いちいちソースを追っていかないと判りませんし(結局使われていなかったりすることも)、ある場所で使われている変数がどのように定義されているか確認するにはソースを戻らなければなりません。途中でスコープが変わって同じ名前で異なる定義をしている可能性も考えられます。

もう一つは、書く側の理由として、使う場所で定義するのが自然だからです。
関数を実装する際、使う変数を最初に決めてからコードを書き始める、などということはまずしません。コードを書きながら使う変数を考えます。そうなると、自然と使う場所で定義したくなります。もし関数の頭でまとめて定義しなければならないとなると、コードを書きながら変数が必要になるたびにいちいち関数の頭に戻って定義を追加し、また元の場所に戻って続きを書く、ということになりますが、それはとても面倒ですし思考が中断されることにもなります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

checkベストアンサー

+2

こんにちは。

変数のスコープが大きいと読み手が不安になると
本で読んだのですが理由がわかりません。

例えば、その変数aを使う処理を修正する事になり、aをdouble型へ変更する必要があると仮定します。
そのaが当該処理だけでのみ使われているのであれば、安心して変更できます。
変数aのスコープを必要最小限にしておけば、その狭いスコープ内だけを確認すれば当該処理のみで使われていることを確認できるので手間が少ないです。
また、無駄にスコープが広いと変数定義(変数名を考えて定義文を書く)をサボって流用してしまうこともあります。この場合、doubleへ変更したいところと流用してしまったところがあり、流用した方は変更したくありません。結果、改造する方の変数aを新たに別途定義し、当該処理のaを使っているコードを全て修正しないといけません。「無駄な」手間がかかります。(意外に頻発するのですよ、これ。)

ですので、私は次のようなコードを書くことも多いです。

int main()
{
    {
        int a=aの最初の値を決定する関数();
        // aを使う処理
    }
}


慣れるとずいぶん気が楽になりますよ。

他にも、aのスコープが広いと、間違って変更したり参照したりすることも発生し得ます。コンパイラが検出できないバグの発生確率が上がるという意味です。スコープが狭ければ、スコープ外で間違ってアクセスしてもコンパイラがエラーにしますので事前にチェックできます。これによりプログラムの信頼性が上がります。

とはいえ、大抵の場合はデバッグ時点で検出できると思います。でも、たまたまテストにも通ってしまうと、もうその変数aを触ることができません。長い期間の間にはそうやって「ゴミ」が溜まっていきます。「この変数はゴミと思うけど再テストの手間を考えると削除できない」って嫌なものです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

推測ですが、コードのメンテナンス性を上げる
という目的でこのような話になっているのでは?

つまり、変数定義は最初にまとめてやっておき、
定義箇所を探すという労力や勘違いを少なくする、と。

ただ、昨今は関数化して短いルーチンの組み合わせで
処理を実現することが多いと思いますので、
そんなに気にすることもないんじゃないのかなあ。
(スコープ的な意味で)

もちろん、システムの作り次第でどのような方法が
ベストなのかは変わってきますよね。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.50%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • プログラミング言語

    682questions

    プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。