- PR -

VBがC#やJavaよりもさえている1つの事例

1
投稿者投稿内容
Okayu3
会議室デビュー日: 2004/03/11
投稿数: 11
投稿日時: 2004-04-30 18:11
http://www.atmarkit.co.jp/fdotnet/vbcheer/vbcheer03/vbcheer03.html
...の記事についてのスレッドです。(元記事 参照のこと)

制御文 に関して、脱出する先を強制的に明示させるから
VBのほうが バグが少なくてすむ、という論旨。

まず事実関係から。

1.CやJavaだと switch文の中で親のfor文を抜けるとき
困るじゃないか、という件に関して。

C / Java では ラベルを使うことになります。
Javaなら 例えば次のように。
コード:
  public static void main(String[] args) {
    block1:
    for (int i=0;;i++) {
      switch (i) {
        case 5:
          System.out.println("5");
          break;
        case 10:
          break block1;
      }
    }
    System.out.println("I've escaped.");
  }


ただし、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のよくない点なのではないかと
思うのですが いかがでしょうか。
きくちゃん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 854
お住まい・勤務地: 都内某所
投稿日時: 2004-04-30 19:09
Okayu3さん、こんばんは。

バグを防ぐ、という意味では「Exit xxxx」よりも、「End xxxxx」という文法(始まりと終わりが対になっている)の方が効果があるのではないかと思っています。カット&ペーストなんかで誤って入子関係を壊してしまえば、ちゃんと叱ってくれますから。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 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がどのようなときに実行されるのか(どんなときも実行される)、わかりにくいでしょう。
 エディタ上で、「対応する括弧を強調表示する」とか、「対応する括弧にジャンプする」機能を使うと、ブロックの位置を確認しやすいですが、文法的にチェックしてくれるわけではなく、「打ち込んだはず」というミスを誘いやすくはなるでしょう。
Jitoh
会議室デビュー日: 2004/05/06
投稿数: 1
投稿日時: 2004-05-06 09:52
 構造化プログラミングでは、そもそもループ中の判定でループを抜けるというアルゴリズム設計を禁止しています。
 品質を考慮して設計されているアプリケーションでは、こういうことは起こりませんから、これをもってVB.NETのメリットというのは、とても弱いかと存じます。
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2004-05-06 10:01
ちょっとした疑問です。
引用:

Jitohさんの書き込み (2004-05-06 09:52) より:
 構造化プログラミングでは、そもそもループ中の判定でループを抜けるというアルゴリズム設計を禁止しています。
 品質を考慮して設計されているアプリケーションでは、こういうことは起こりませんから、これをもってVB.NETのメリットというのは、とても弱いかと存じます。


ループ中の判定でループを抜けること=品質低下になりますか?
構造化プログラミングの理論と、実践での品質はまた別問題ではないでしょうか?

例えば、ループの終了条件に複雑なことを記述する、あるいは制御を複雑にする(フラグを用いたり)等して、ループの途中で抜けることをなくすことができたとしても、それは品質向上につながるでしょうか?

※もちろん、「むやみに行う」べきではないとは思いますが。

--追記--
もちろん「品質」の定義によりますけどね。
「構造化プログラミングの理論に忠実?にコードを書くこと」=「高品質」
なのであればそうなるかもしれませんが、そういう話ではないのではないかと思ってます。


[ メッセージ編集済み 編集者: なちゃ 編集日時 2004-05-06 10:12 ]
こばさん
大ベテラン
会議室デビュー日: 2004/03/17
投稿数: 147
投稿日時: 2004-05-07 10:45
引用:

さて、そこでお伺いしたいのですが、
Exit Do が便利に感じる瞬間というのは
VB を魅力的に思わせるほど 頻繁に起こるものなのでしょうか。

わたしは VBもJavaも(ときにはC#も)やりますが、
制御文(break や Exit Do) によるとび先が
分からなくなるような事例が あまり思いつきません。


 私の場合(いいか悪いかは別で)

Db.Open
Do
処理1
 処理2
 処理3

 成功フラグ = True
 Exit Do
Loop
Db.Close

という書き方することあります。
 処理1〜2の中で何らかの例外が発生した場合に、Exit Do で、次の処理に進ませずに終了処理に飛ばすようにしたい場合があり、そういう場合に使いますね。
Beatle
ぬし
会議室デビュー日: 2003/06/09
投稿数: 394
投稿日時: 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 ]
よねKEN
ぬし
会議室デビュー日: 2003/08/23
投稿数: 472
投稿日時: 2004-05-07 14:53
引用:

こばさんさんの書き込み (2004-05-07 10:45) より:
 私の場合(いいか悪いかは別で)

Db.Open
Do
処理1
 処理2
 処理3

 成功フラグ = True
 Exit Do
Loop
Db.Close

という書き方することあります。
 処理1〜2の中で何らかの例外が発生した場合に、Exit Do で、次の処理に進ませずに終了処理に飛ばすようにしたい場合があり、そういう場合に使いますね。



本題とはずれますが、この例なら、Try〜Catch〜Finallyを使うのが常套句だと思います。

コード:
Try
   DB.Open()

  処理1
 処理2
 処理3

 成功フラグ = True
Catch 〜
  例外処理
Finally
  If Not DB Is Nothing Then
      DB.Close()
  End If
End Try



で、本筋の話題に関しては、JavaやC#のbreakよりも
VBのExit 〜の方がどこに抜けるのかが明示的という点で
書きやすさ/読みやすさ共に優れていると思います。
(Beatleさんの 投稿日時: 2004-05-07 11:38 のサンプルソースのような極端な例でなくても)

でも、そんなことよりJavaやC#のswitch case文より
VBのSelect Caseの方が断然優れている点を事例にした方がいいような気がするんですが・・・。
1

スキルアップ/キャリアアップ(JOB@IT)