去年いた会社で「VBの専門家」と呼ばれていた人が書いたコード。If文の階層が深いならともかく、たった1個のIf文しかないのにGoTo使われてもなあーと。プログラミングの実務経験が薄くて新規開発を任せてもらえず、保守や運用ばかり任せられていた当時時給1200円の派遣のボクですが、凡そオブジェクト指向(抽象クラスやインターフェイスによる多態性、継承、カプセル化)の概念が皆無なのはまだしも、手続き型言語時代の作法すら守られてなく、一つのテーブルの更新メソッドとして列名の一箇所が違うだけのSQL直書きのコピペプロシージャが20個書かれていたり、とにかく酷いこと尽くしだった。こんな人がボクの2倍以上も給料貰っていて「君も何か分からないことがあったらあの人に聞きなさい」と言われていたので、PGとして大成するするために退社しましたが、未だにこの時のトラウマでVB.NETの案件は避けています。
For i As Integer = 0 To array.Length If True Then GoTo label1 End If '処理 label1: Next
使い方ヒント: 「これは臭う」という行を見付けたら、各行のをクリックしてマーキングしておきましょう(要Twitter OAuth認証)
Continueがないのなら、割と妥当なコードに見える。
「'処理」の長さ次第のところもあるけど、個人的には「If False 処理」は避けるなぁ。
おととしまでやっていたトコも.net1.1だったりしたからなぁ・・・社内システムだとリプレースするより使い続けるってのはありそう。 ちなみに日本の会社じゃなく外資系。novellのナンチャラ使って自動配備されるjreが1.3で.netが1.1だったといううんこ。 vb.netはやってないからウチじゃないな。
Ifで判定するのををFalseにするやり方じゃ駄目なのでしょうか For i As Integer = 0 To array.Length If False Then '処理 End If Next
>Falseにするやり方 大体の場合はそれが正解だけど、プログラムの構成によっては際限なく入れ子の制御ブロックになるような物もある。 そうなるとブロックの繋がりが見えにくくなって、思わぬバグとかに繋がりやすいんで、ネストしないようにすることがある。 性能や保守性といった設計目標をどこに置くかによって、それぞれのメリット・デメリットをトレードオフしていく必要がある。 正解は一つじゃないのが設計ってもんだ。
良い・ダメって視点じゃなくて、どういう意図でそうしようとしたのかという視点で考えたほうがいいよ。その上で設計意図に対して実装方法が上策か下策かって話になるけど、断片コードだけじゃ分からんっていう話。
vb6で書くならこうする事もあるかな。continueないし。vbsならループする中身を別メソッドにして早期リターンする。あと if false よりif trueの方が読みやすいとか。Gotoそのものが悪なんじゃなくてGotoでどこでもかんでも飛ばすのが悪なんだと思う。
VBの専門家だからといってコードのアルゴリズムがすぐれているとは限らないよね。
Gotoは個人的には好かないな…メソッド分けるとかして欲しい
コメント投稿には、twitter認証が必要です。
Twitter認証
初期のVB.NET(VB2003)まではcontinue相当の命令が無い、処理が大きいとIf〜End Ifが長くなって見辛くなる、という事情を考慮すれば、この使い方自体はウンコとは言えないでしょう。 これがcontinueに対応した2005以降のバージョンである、とか、continue使うこと自体がウンコ、とかなら別ですが