たまに「じゃんぬねっと」が生存確認をする日記

役員より労働者の方が楽だと思う

ホーム 連絡をする 同期する ( RSS 2.0 ) Login
投稿数  984  : 記事  4  : コメント  38836  : トラックバック  277

ニュース

My Website

初心者向けのサイトです。

C# と VB.NET の入門サイト

最近のできごと

低学歴の IT エンジニア兼管理職です。ずっとリモートワーク中。

駆け出しはブラック企業で低年収でしたが、転職を繰り返して年収は 5 倍以上になりました。

年収はこれ以上増えても幸せ指数は増えませんので、趣味の時間を増やすため早期の半リタイアを考えています。

最高の配偶者、可愛い娘、ハンサムな息子と幸せな日々を送っています。

Sponsored Link1

Sponsored Link2

Archive

書庫

これも「コーディング ホラー」というよりは、バグです。
またもや、VB で発見しました。

VB6 以前 (コーディング ホラー)

    If obj Is Nothing = False And obj.Value <> "" Then
        Call UpdateHoge(obj.Value)
    End If

VB の AndOr は、ショートサーキット評価ではありません。
このソースの場合、最初の Nothing の評価の結果に関わらず、次の Value メンバが長さ 0 の文字列かどうかの評価を行います。

ひとことで言えば、最初の Nothing の評価が無意味になります。
つまり、obj が Nothing だった場合は、容赦なく実行時エラー (例外) が発生するということです。

VB6 以前の場合は以下のようにネスト (入れ子) させるか、

VB6 以前 (Not コーディング ホラー)

    If Not obj Is Nothing Then
        If obj.Value <> "" Then
            Call UpdateHoge(obj.Value)
        End If
    End If

ガード句を使うことになります。(以後の処理が不要な場合)

VB6 以前 (Not コーディング ホラー)

    If obj Is Nothing Then
        Exit Sub
    End If

    If obj.Value <> "" Then
        Call UpdateHoge(obj.Value)
    End If

VB7 (VB2002) 以降では、AndAlso または、OrElse を使うことで、ショートサーキット評価ができるようになりました。

VB.NET 以降 (Not コーディング ホラー)

    If Not obj Is Nothing AndAlso obj.Value <> String.Empty Then
        Me.UpdateHoge(obj.Value)
    End If

私の場合、AndOr は、論理積や論理和などの演算にくらいしか使いません。
VB.NET 以降でも、AndAlsoOrElse を使うことがないくらい、1 行で 1 評価を意識しています。

コーディング ホラー記事へのリンク

投稿日時 : 2006年7月11日 11:02

コメント

# re: Coding Horror 04 2006/07/11 17:40 名無しぃシャープ
CからVBに以降した時にやっちゃったなぁ。○| ̄|_

# re: Coding Horror 04 2006/07/11 17:57 R・田中一郎
AND や OR を使う場合、最初の評価式の後に次の式に・・・と、つい勘違しがちですよね。

僕もタマネギプログラマーだった頃(今もか?)に、よくやっちまいました。

常に、二つの式を評価することを前提に考えると、入れ子にした方が効率が良い場合も多々ありますね。

基本的に、AND や OR は、僕も多用は避けています。


# re: Coding Horror 04 2006/07/11 21:55 NAL-6295
IIFでもたまに見かけますね。
その手の間違い。
ちゃんと、働きを理解していない証拠で、こんなコードが仕事で使われているとなると怖いです。

# re: Coding Horror 04 2006/07/12 13:56 ぽぴ王子
自分もじゃんぬさんと同じく、あいまいな時は If を入れ子にして1行1評価にし
ます。
とりあえず3ヵ月後の自分へ向けて手紙を書くような感じで :-)


昔は何も考えずによく書いていて、たまたまそれがバグになることはなかったで
すが(いま考えるととても怖い)、ショートサーキット評価を初めて知ったとき
は Ω ΩΩ<ナ、ナンダッテー てな感じでした。

# re: Coding Horror 04 2006/07/13 11:29 じゃんぬ
>R・田中一郎さん
バグの温床になりやすい要素を持っていますから、
ビット演算以外では使うべきじゃないでしょうね。
個人的には、「一貫して使用しない」とした方が、素直だと思います。

ネストを心配して And や Or を使用する前に、
その評価式は冗長でないかを見た方が良いでしょうね。

> 常に、二つの式を評価することを前提に考えると、
> 入れ子にした方が効率が良い場合も多々ありますね。

先のは Nothing の評価があるため例が悪かったのですが、
ネストする場合は、評価の順番を考えないと効率は良くなりません。
偽になりやすいものを、最初に評価しておくのが良いでしょう。

最近の言語はガード句を使うことが推奨されていますから、この限りではないです。

# re: Coding Horror 04 2006/07/13 11:33 じゃんぬ
>NAL-6295 さん
IIf でとなると、イコール可読性も考えていないことになりますね。
(評価の正当性を考えられない方に、それを求めるのも酷ですが)

IIf は、単純な評価式でないと使用してはいけないでしょうね。
IIf を、「評価結果を 1 行に縮められる魔法の言葉」と誤解されている方が多いようです。

私は三項演算子は使いますが、IIf を使うことはありません。
戻り値の関係上、どうしても許せないでいます。
似たようなものが続くのであれば、Math.Min メソッドや Math.Max メソッドのような、
戻り値の型が明示化された自作メソッドを作ります。

# re: Coding Horror 04 2006/07/13 11:35 じゃんぬ
>ぽぴ王子さん
個人的には曖昧でなくとも、効率をあげるためにネストさせることをお勧めします。
前述のように、一貫していた方が可読性も良いです。

# ところで、VB.NET で AndAlso、OrElse を使用する場合は、
# 括弧で括って頂かないと、どうも安心できません...

# NVEDeMhbXjwklVcnqm 2014/08/06 23:20 http://crorkz.com/
5UEZUq Really informative post.Really looking forward to read more. Awesome.

# QYMkIZIPBiglQkPy 2014/09/02 19:36 http://www.botaniquebartley.info/
This is really fascinating, You are an overly skilled blogger. I've joined your rss feed and stay up for in quest of more of your great post. Also, I've shared your website in my social networks!

# cqSCEcscTCPa 2014/09/03 11:42 http://ecommerce-for-business.com/marine-life-raft
Hi there, I discovered your website via Google even as searching for a comparable subject, your web site came up, it appears to be like good. I've bookmarked it in my google bookmarks.

# xfZlsneQKfz 2014/09/09 13:16 http://vente-sur-internet.com/
Usually I don't read article on blogs, but I would like to say that this write-up very compelled me to try and do so! Your writing style has been surprised me. Thanks, quite great post.

# MxUTJGSckiEOuAB 2014/09/14 9:17 http://www.needpeep.com/
wonderful points altogether, you simply won a logo new reader. What would you recommend in regards to your put up that you just made a few days in the past? Any positive?

# UIkWbLJXEO 2014/09/18 17:27 http://goetterdaemmerung.info/story/92380
Xm2IW2 Muchos Gracias for your article.Really looking forward to read more. Great.

# Лучше бы погасить долг А может долги. Грушевского от центрального входа стадиона Динамо по ул. Речь идёт об установке в городе, в супермаркетах, в администрациях и т. Закон Независимого Наследования Признаков Его Сущность 2017/04/21 5:56 Лучше бы погасить долг А может долги. Грушевского
Лучше бы погасить долг А может долги.
Грушевского от центрального входа стадиона
Динамо по ул. Речь идёт об установке в городе, в
супермаркетах, в администрациях и т.
Закон Независимого Наследования
Признаков Его Сущность

Post Feedback

タイトル
名前
Url:
コメント: