■ 現在のこのページの役立ち度:
表示されない場合こちらのリンクからもご覧になれます。
■ このページの役立ち度を評価する:
役立ち度を評価してください。
(1(左):あまり役立たない - 5(右):大変役立った):
■ ページの共有:
[ サイト内検索 ]
カスタム検索
#25139-0コーディングの作法?、常識なのかな?poohSAN2001-12-05(水) 21:35
     #25140-0RE#25139:コーディングの作法?、常識なのかな?せつら2001-12-05(水) 21:51
     #25141-0RE#25140:コーディングの作法?、常識なのかな?poohSAN2001-12-05(水) 22:30
     #25143-0RE#25139:コーディングの作法?、常識なのかな?よねKEN2001-12-06(木) 00:23
     #25144-0RE#25139:コーディングの作法?、常識なのかな?レベル11@月300時間勤務中(泣)2001-12-06(木) 00:55
     #25146-0RE#25143:コーディングの作法?、常識なのかな?poohSAN2001-12-06(木) 09:19
     #25148-0RE#25144:コーディングの作法?、常識なのかな?Say2001-12-06(木) 09:43
#25139-0
コーディングの作法?、常識なのかな?
たびたびお世話になります。
あるMLの過去ログを読んでいると解らないことがいくつかありました。
そのスレッドではみなさん当然のこととして議論されていますので、
当然のことに関しては記載がなく、何故悪いのかが解りませんでした。
内容は次の2点です。

1.グローバル変数のフラグはあまり使いたくない。
2.コードの中でgo toはできれば使いたくない。
 (エラー処理でも使わない方がいい?)

どのような背景から1.や2.が嫌われるのでしょうか
背景を教えていただけると理解が進むと思いますので、ご教授頂ければ幸いです。
#25140-0
RE#25139:コーディングの作法?、常識なのかな?
何でもかんでもグローバル変数というのが駄目と言われるのは、ローカル変数だと EXE がメモリ上に
ロードされたのと同じ領域で確保されるのに対し、グローバルはシステム領域に確保されるので、意味
もないのにシステムを圧迫するな、とか、そんな理由だったと思います。 共通化する必要のないもの
までグローバルにするな、という事ですね。 必要なときはバンバン使いましょう。

GoTo を使うな、というのは、正しくオブジェクト指向に則ってコーディングしていれば GoTo なんて
使うはずがないし、GoTo なんて使うからロジックが破綻したスパゲッティプログラムになるんだ、と
いうような理由だったと思いました。

ただし、GoTo に対しては私は別の意見を持っており、所詮86のアセンブラに翻訳されるのだし、そ
の分岐命令は GoTo と等しい、単純な条件分岐しかないのだから、GoTo を使った方が速いでしょ?、
と思っております。 まぁ、そんな事を考えずにいい加減に GoTo を使うことについては、やはり駄目
だとは思うのですが。

なるべく使うな、使うときはループの外に向かえ、リトライの場合や無限ループでない限り、上方向
には飛ぶな、という事を意識していれば、使っても良いのではないでしょうか。
#25141-0
RE#25140:コーディングの作法?、常識なのかな?
せつらさん、早速のレスありがとうございます。

> グローバルはシステム領域に確保される
確保される領域の違いから来ていたのですか、よくわかりました。φ(..;)メモメモ
私は、定数をうまく使うとコードが解りやすくなるとのことで、
標準モジュールにPublic Constとしてかなり大量に使っていますが、
これもシステム領域を圧迫しているのでしょうか?

> ロジックが破綻したスパゲッティプログラムになるんだ
雰囲気で解りました、うどん程度で済むように心がけます。

> なるべく使うな、使うときはループの外に向かえ、リトライの場合や無限ループでない限り、上方向
> には飛ぶな、という事を意識していれば、使っても良いのではないでしょうか。
上方向に飛ぶと無限ループになる恐れがあるということですか (`_´ )ゞ了解!

何重かの入れ子?(字が解りません)のループ内側からいきなりループ外へGoToしても
不都合は起きないでしょうか(スタックが変になるとか)

すいません質問にもならないようなことを聞いてしまいまして 多謝
今後ともよろしくお願い致します。
#25143-0
RE#25139:コーディングの作法?、常識なのかな?
> あるMLの過去ログを読んでいると解らないことがいくつかありました。
> そのスレッドではみなさん当然のこととして議論されていますので、

ダイクストラさんの提唱した構造化プログラミングが
今のプログラミングの考え方の基礎になっていて、もはや常識の常識なので、
いまさら議論の対象にならないのですね。
ちなみに、1960年代の後半にはもう登場しているプログラミングスタイルです。

「ダイクストラ 構造化プログラミング」などのキーワードで
検索すればやまほど情報が見つかると思います。

かなり昔のものですが、その解説書としては以下の訳本があります。
http://www.saiensu.co.jp/books-htm/ISBN4-7819-0276-6.htm

まぁこれを読まなくてもWebで調べても概要はわかるかと思います。
この機会に勉強しておくとよいでしょう。

> 1.グローバル変数のフラグはあまり使いたくない。
> 2.コードの中でgo toはできれば使いたくない。
>  (エラー処理でも使わない方がいい?)

で、2つはその構造化プログラミングの中で言われている話です。

それぞれがよくないとされるのは以下の理由。
1.コードのすばやい理解、容易な修正を妨げ、コードの保守性を低下させるから。

  グローバル変数はプログラム内のどこからでも書き換えることができてしまいますので、
  グローバル変数を無闇に使用してしまっているとそのプログラムを修正しようとした場合、
  あるコードの変更がプログラム全体に影響を与えてしまうかもしれないので、
  コード全体を慎重に見渡さないといけません。
  これは複数のメンバーでプログラミングするときは特に致命的です。
  なので、無用なグローバル変数は避けるた方が身のためというわけです。

  ただし、当然のことながら、プログラム全体で値を保持する必然性があれば、
  グローバル変数を使うのは問題ありません。

  「グローバルなフラグ」を使いたくないというのは、
  フラグというもの自体が、基本的には、一時的にそのときの状態を記録しておくだけのもので、
  それ自体がグローバルである必然性のある場面が少ないからでしょう。

2.Gotoではどこに飛ぶかわからないから。
  Gotoでどこに飛ぶかは飛び先を示すラベル次第ですから、
 コードを読む上で次の挙動を予測しづらく、これまた可読性が落ちます。  
 例えば、For文なら、Forがあってその後には必ずNextが現れ、処理フロー自体は
  先に出てきたForに戻って続きと形が決まっているので、Forが出た瞬間で、
  Nextの位置を探し、その間が一つのブロックになっていることがわかります。
  Do〜Loopの構造でも同様で、これらの構造を使うことで基本的にGotoを使わなくても
  コードを書けるので、原則使うなと言われています。

  それに対して、On Erro Gotoの場合は、エラー発生時にジャンプするという特殊な用途に
  使用するものであり、また、原則として下方向へのジャンプであるといった点から、
  私は別に可読性も保守性も下げないと思うので、これも使うべきではないとは思いません。
  #VB.NET(VB7)ではTry〜Catchという構造化された構文が用意されているので、
  #このOn Error Gotoも特に必須ではなくなっていますが。

その他。
>標準モジュールにPublic Constとしてかなり大量に使っていますが、

定数は実行時には変更されることはないので、問題ないでしょう。
多分、同じ意味の同じ名前の定数を個別にPrivateで宣言する方が問題だと思いますので、
プロジェクト全体で使用する定数は定数の関連性ごとに標準モジュール等に
まとめて宣言しておくといいでしょう。(定数だけで一つのモジュールにするという手もよく使われます)
#25144-0
RE#25139:コーディングの作法?、常識なのかな?
> 1.グローバル変数のフラグはあまり使いたくない。
> 2.コードの中でgo toはできれば使いたくない。
>  (エラー処理でも使わない方がいい?)
> 
> どのような背景から1.や2.が嫌われるのでしょうか
> 背景を教えていただけると理解が進むと思いますので、ご教授頂ければ幸いです。
既に回答が出ている通り、後々のデバッグやメンテの為です。
プログラムは、コーディングなんかより、テストやデバッグで工数が掛かるものですので
軽くみてはいけないですね。
また、職業プログラマになると作ったソースは10中8,9、赤の他人にメンテされます。
その時に「〜〜ってヤツはなんつーソース書いてんだ!ツラ見てみてぇ」なんて事にも(^^;)

#今現在障害対応しているプログラムが酷過ぎる。書いたやつの顔が見てみてぇ・・・(泣)
#なんで1プロシージャに4500行も・・・しかもGOTO使ってて飛んでる場所探しが辛いし・・
#25146-0
RE#25143:コーディングの作法?、常識なのかな?
よねKENさん、レベル11さん レスありがとうございます。
マルチレスですいませんm(_ _)m

< かなり昔のものですが、その解説書としては以下の訳本があります。
< http://www.saiensu.co.jp/books-htm/ISBN4-7819-0276-6.htm
本まで教えていただいてありがとうございます。
理解できるかどうかはともかくとして、是非一読したいと思います。

< これは複数のメンバーでプログラミングするときは特に致命的です。
< なので、無用なグローバル変数は避けるた方が身のためというわけです。
自分一人で作っても、デバッグに苦労しています。
どうしても必要でない場合は使わないように心がけます。

< Gotoでどこに飛ぶかは飛び先を示すラベル次第ですから、
< コードを読む上で次の挙動を予測しづらく、これまた可読性が落ちます。  
確かに他人のソースでなくとも自分のソースでもよく解らなくなります。

< (定数だけで一つのモジュールにするという手もよく使われます)
それは判りやすくていいですね、なるほど

< また、職業プログラマになると作ったソースは10中8,9、赤の他人にメンテされます。
< その時に「〜〜ってヤツはなんつーソース書いてんだ!ツラ見てみてぇ」なんて事にも(^^;)
まだソースを人に見て貰うレベルに達していませんが、そうなりたいと思いますので
(職業にはならないでしょうが)、顔を見せられるようなコードを書けるようがんばります。

常識以前のことが判っていないことが多いものですから、これからもよろしくお願い致します。
あきれずに回答いただいた皆様に感謝します。
#25148-0
RE#25144:コーディングの作法?、常識なのかな?
> また、職業プログラマになると作ったソースは10中8,9、赤の他人にメンテされます。
「昨日の自分は他人」ですから、仕事でなくても作法は守ったほうがいいわけです。
Cでよければ、「プログラミング作法」とか、「プログラミングお作法」
とかいう本もあります。
(前者はカーニハーン&パイク著でK&R(通称バイブル)と同じぐらいかなり有名。
後者は・・・Yahoo Books Shoppingで「取寄せ不可」ってなってた。 (^_^;    )
このページと関連する記事:
#241-2変数名のつけ方2003-08-06(水) 13:19
#20980-0オーバーフロー2001-05-21(月) 18:32
#1471-2プログラムの長さ2002-07-08(月) 04:21
#1022-0Me.の省略について1999-08-25(水) 15:22
#29622-0開発におけるコントロール配列について2000-09-08(金) 16:16
#19882-0エラー処理の動作について2002-02-18(月) 15:25
#27910-0ACESSVBAのグローバル変数について2000-08-14(月) 10:57
#17423-0Goto命令2000-12-27(水) 09:34
#183-3「テキストエリアが変更されたか?」を判定するには?2003-05-04(日) 14:46
#10690-0SubとFunctionの使い分けは?2000-08-19(土) 22:49
お探しの情報は見つかりましたか?お困りの問題は解決しましたか?
サイト内検索, 似た記事検索で見つからなくてもあきらめずに掲示板で質問してみましょう。
VB初心者友の会があなたのお役に立てれば幸いです。また、本ページの投稿者の方々にこの場を借りて感謝致します。
本ページは過去ログを集めて自動構成しています。よろしければこのページに関するフィードバックをお願いします。
(※ 構成の誤り、広告等の不適切な記事、リンク切れ、読めないページの報告など)