- - PR -
VBがC#やJavaよりもさえている1つの事例
1
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2004-04-30 18:11
http://www.atmarkit.co.jp/fdotnet/vbcheer/vbcheer03/vbcheer03.html
...の記事についてのスレッドです。(元記事 参照のこと) 制御文 に関して、脱出する先を強制的に明示させるから VBのほうが バグが少なくてすむ、という論旨。 まず事実関係から。 1.CやJavaだと switch文の中で親のfor文を抜けるとき 困るじゃないか、という件に関して。 C / Java では ラベルを使うことになります。 Javaなら 例えば次のように。
ただし、Javaでは そもそも ラベルを使うのは推奨されていません。 (この場合は switch文など用いないでしょうね。) 2.VB の場合でも、たとえば Do文の中に Do文があった場合など、 Exit Do と書けばなんでもOKというわけではありません。 どこへ breakしたいか明示するためには 同じように ラベル(とgoto文)を用いる必要があります。 --- さて、そこでお伺いしたいのですが、 Exit Do が便利に感じる瞬間というのは VB を魅力的に思わせるほど 頻繁に起こるものなのでしょうか。 わたしは VBもJavaも(ときにはC#も)やりますが、 制御文(break や Exit Do) によるとび先が 分からなくなるような事例が あまり思いつきません。 1つのfor文(Do文)が 画面内に収まらなくなれば たしかにそういうことが起きそうですが、 可読性から考えて、そもそも そういう巨大なブロックを作る コーディングは推奨されないはずですよね。 仮に VBが その記述法によって きたないコーディングを助長させているならば、 それは むしろVBのよくない点なのではないかと 思うのですが いかがでしょうか。 | ||||||||
|
投稿日時: 2004-04-30 19:09
Okayu3さん、こんばんは。
バグを防ぐ、という意味では「Exit xxxx」よりも、「End xxxxx」という文法(始まりと終わりが対になっている)の方が効果があるのではないかと思っています。カット&ペーストなんかで誤って入子関係を壊してしまえば、ちゃんと叱ってくれますから。 | ||||||||
|
投稿日時: 2004-05-04 14:57
参照元記事はVB6.0のソースコードをVB.NET、C#、Javaに移植する、という前提であると思います。実際、Javaはわかりませんが、VB.NET、C#への移植/移行はあり得る案件ではないでしょうか。
きくちゃんさんの、『始まりと終わりが対になっている』というのは、たとえば次のようなコードを書かれると、よくわかるのではないでしょうか。 [code] if (条件1) if (条件2a) { 手順1 } else if (条件2b) 手順2 手順3 [code]←わざと外す。「編集」や「引用」すると、元のスペースが復元されます C#でもJavaでも、CでもC++でも、文法上は間違いではありません。が、手順3がどのようなときに実行されるのか(どんなときも実行される)、わかりにくいでしょう。 エディタ上で、「対応する括弧を強調表示する」とか、「対応する括弧にジャンプする」機能を使うと、ブロックの位置を確認しやすいですが、文法的にチェックしてくれるわけではなく、「打ち込んだはず」というミスを誘いやすくはなるでしょう。 | ||||||||
|
投稿日時: 2004-05-06 09:52
構造化プログラミングでは、そもそもループ中の判定でループを抜けるというアルゴリズム設計を禁止しています。
品質を考慮して設計されているアプリケーションでは、こういうことは起こりませんから、これをもってVB.NETのメリットというのは、とても弱いかと存じます。 | ||||||||
|
投稿日時: 2004-05-06 10:01
ちょっとした疑問です。
ループ中の判定でループを抜けること=品質低下になりますか? 構造化プログラミングの理論と、実践での品質はまた別問題ではないでしょうか? 例えば、ループの終了条件に複雑なことを記述する、あるいは制御を複雑にする(フラグを用いたり)等して、ループの途中で抜けることをなくすことができたとしても、それは品質向上につながるでしょうか? ※もちろん、「むやみに行う」べきではないとは思いますが。 --追記-- もちろん「品質」の定義によりますけどね。 「構造化プログラミングの理論に忠実?にコードを書くこと」=「高品質」 なのであればそうなるかもしれませんが、そういう話ではないのではないかと思ってます。 [ メッセージ編集済み 編集者: なちゃ 編集日時 2004-05-06 10:12 ] | ||||||||
|
投稿日時: 2004-05-07 10:45
私の場合(いいか悪いかは別で) Db.Open Do 処理1 処理2 処理3 成功フラグ = True Exit Do Loop Db.Close という書き方することあります。 処理1〜2の中で何らかの例外が発生した場合に、Exit Do で、次の処理に進ませずに終了処理に飛ばすようにしたい場合があり、そういう場合に使いますね。 | ||||||||
|
投稿日時: 2004-05-07 11:38
多分、元記事の作者はExit Doという事自体について優位性とかを言っているのでは無く、
ループ脱出に関して、VBではExit ○○で脱出するループを指定できるのに対し、C#、JAVA ではすべてBreakだけなので、VBのほうが可読性が良くなると言いたいのではないでしょう か? 例えばVBでは、 Do (処理) For i = 1 To 500 (処理) Select Case 条件式 Case 条件1 Exit For Case 条件2 Exit Do Case Else (処理) End Select Next i Loop というようなコードでも、条件によってどちらのループを脱出できるかが一目で判る というような事じゃないかと。 コーディングとして認めるかどうかは別問題ですね。 [ メッセージ編集済み 編集者: Beatle 編集日時 2004-05-07 11:41 ] [ メッセージ編集済み 編集者: Beatle 編集日時 2004-05-07 11:43 ] | ||||||||
|
投稿日時: 2004-05-07 14:53
本題とはずれますが、この例なら、Try〜Catch〜Finallyを使うのが常套句だと思います。
で、本筋の話題に関しては、JavaやC#のbreakよりも VBのExit 〜の方がどこに抜けるのかが明示的という点で 書きやすさ/読みやすさ共に優れていると思います。 (Beatleさんの 投稿日時: 2004-05-07 11:38 のサンプルソースのような極端な例でなくても) でも、そんなことよりJavaやC#のswitch case文より VBのSelect Caseの方が断然優れている点を事例にした方がいいような気がするんですが・・・。 |
1