locked
IsDbNull、IsNothingを廃止し、その逆の関数を追加してほしい。 RRS feed

  • 全般的な情報交換

  • IsDbNull、IsNothingの、逆の関数を追加してほしい。

    IsDbNull、IsNothing、EOF、Emptyは、直感的でなく不便です。
    その理由として、二つの大前提を述べます。

    大前提1
    Null・Nothing・EOF・Emptyは、多くの場合、「無効・非・NG」という意味合いで使われます。

    大前提2
    ほとんどの場合において、Trueは有効・正・OK、Falseは無効・非・NGという意味合いで使われます。そしてそれが慣習です。

    しかし上記の関数はこれらが逆転するため、直感的にわかりにくくて仕方ありません。
    例えば「If Not ABC Is Nothing Then」などといった記述を見た時に混乱します。

    よってこれらの逆を返す関数(たとえばOkNull・OkNothing・OkEof・OkEmpty)を追加してほしいです。
    それぞれの意味合いは、「Null判定がOKか?Nothing判定がOKか?EOF判定がOKか?Empty判定がOKか?」です。

    なぜマイクロソフトは、もともとこのような観点に基づかなかったのでしょうか?
    まぁわからなくもありません。そもそも、Null・Nothing・EOF・Emptyの対義語がないですから(あったとしてもなじみがない)。
    そしてIsDateやIsNumericと統一したかったのでしょう。
    統一を重視するなら、OkDate、OkNumericも追加すればいいのでは?

    もっとも、たとえば「OkNothing」は、「Nothingという名前がついているのにNothingの場合にFalseを返す」わけで、これもこれで混乱を生むかもしれません。
    しかしそれによる混乱より、「有効がFalseであること」による混乱の方が、はるかに大きいはずです。
    なぜなら、「慣習を破る」からです。

    対応を、切に願います。
    逆に、対応しない理由があるなら、ぜひ聞かせてほしいものです。

    なお、「自分で作ればいいじゃん」や「Notを使えばいいじゃん」という提案は、それで済む問題ではないので却下します。

    2017年3月20日 23:45

すべての返信

  • # 単にこの投稿を読んだ感想をコメントします。

    Visual Basic言語についてはUser Voiceというサイトで要望を受け付けていますので投稿し賛同者を募ってみてはどうでしょうか?


    2017年3月21日 1:32
  • 議論する気はありませんが、IsNot演算子はすでに導入されているので、

    x IsNot Nothingとかは書けますね。

    x IsNot DbNull.Valueはちょっと微妙だけど。

    2017年3月21日 4:07
  • Visual Basic の言語仕様に関する決定権は、米国本社のVisual Studio開発チームが握ってます。

    他の方々から何度も案内されていますが、Visual Studio UserVoice は、開発者が開発チームの人間と直接コンタクト取れる唯一の場です。言語仕様に関する意見はこちらで提案するしかありません。正論と認めてもらえれば、PLANED として、次期バージョンの計画に加えてもらえます。また却下なら DECLINED のフラグが立ちます。賛同者が多ければ PLANED になるでしょう。

    国内のVBユーザーは減少傾向で、VB が使いづらければ C# に移行するればいいと思ってる開発者も多いかも知れません。実際 .NET 案件も C# の需要が増え、VB は減少傾向にあります。ある意味 VB などどうでもいいと思ってる人も多そう (推測です) なので、国内のコミュニティで賛同者を集めるのは至難の業かもしれません。

    しかし海外は熱烈なVBファンが大勢健在で、他のユーザーに有効な意見と認められれば賛同者がたくさん集まる可能性があります。賛同者の数は数値として明示化されるので、賛同者が多ければ多い程、開発チームの決定をプッシュする力になり得ます。


    ちなみにですが・・・

    米国から見れば、日本の市場としての位置づけは欧米より遥かに低く、もしかすると中国より低いかも知れません。中央官庁が地方自治体の陳情をまともに聞かないのと同様、日本のコミュニティでいくら正論叫んでも、開発チームの意識は欧米中心のため、何らアクション起こしてもらえません。

    また開発チームは、コミュニティにおける提案や意見を基本的に無視します。仮にフォーラムオペレータさんが直接開発チームに意見したくても、無関係の部署から横やり入れられても困ると言われておしまいです。またそもそもそんな権限もないでしょう。

    朝〇新聞の販売所に行き、「お前のとこの記事はけしからん」と叫んでも、無駄な労力でしかないのと同じ話です。

    本フォーラムは、ユーザー(開発者)同士で情報交換を行うためのコミュニティです。初めて利用される方は、以下のアナウンスをご覧ください。 https://social.msdn.microsoft.com/Forums/ja-JP/ca9ecfb7-4407-4fcb-b8bd-207d68257e68?


    2017年3月21日 8:50
    モデレータ
  • 例示されたEmpty関数は(IsEmpty関数も)存在しないのですが、どこらへん定義されてる関数でしょうか?
    定数String.EmptyとvbEmptyしか見つかりませんでした。String.IsNullOrEmptyメソッドのことでしょうか?

    また、EOFについては、いまどきBasic由来のOpen/Close系の「命令」が今更拡張されるのか、という気もします。(.NetのStream系にはそもそもEOFとかないですし)互換系の関数は増えないんじゃないかな、というのは「対応しない理由」としては納得できませんか?
    少なくとも、VBはModuleでグローバルな関数が好きなように定義できるので「自分のプロジェクト」では好くなように対処ができますが、「これらは全世界のVBユーザにとっての大問題なのでVBの規定として存在するべき」という御主張なのでしょうか?


    jzkey

    2017年3月21日 14:10
  • 大前提1
    Null・Nothing・EOF・Emptyは、多くの場合、「無効・非・NG」という意味合いで使われます。

    ここの考え方は私とはちょっと違います。
    今回の場合は、IsDbNullとIsNothingですから、DbNullとNothingに絞って考えます。
    そもそもDbNullやNothingは空っぽを表します。SQLでnullとの比較に=ではなくisを用いるのはそのためです。データを比較しているのではなく、データがあるかないかの状態を尋ねているのでisを用いているのです。
    「無効・非・NG」はNothingではなくfalseで表現するのが普通だと私は思いますが、どのように扱うかは自由ですので、あくまで各人のポリシーでしかありません。

    最初に戻りますが、IsDbNullやIsNothingは、DbNullやNothingと=(イコール、比較)であるかを問うているのではなく、DbNullやNothingという状態にあるかを聞いています。ですからEqualsDbNullやEqualsNothingではなく、IsDbnullやIsNothingという表記を使っているのだと思います。
    IsDateもIsNumericも比較(=、イコール)という意味で使っているのではなく、日付を表している状態なのか、数字を表している状態なのかを問うているためIsを使っていると思うのです。

    また、Nothingという状態が取れるのは参照型だけです。参照型は参照がセットされているかいないかという状態があり得ますが、値型であれば値型の変数として生まれた時から何らかの値を持っています。例えば数値型の変数なのに空というのはあり得ません。空という数字が世の中に無いのと同じです。よって、次のIf文はfalseになります。

    Dim i as Integer = Nothing

    If IsNothing(i) Then

    値型であるiはNothing(空という状態)にすることができず、代わりに0にされてしまうからです。NothingやDbNullをよく理解していなければ、思わぬバグにつながるという良い例だと思います。


    ★良い回答には回答済みマークを付けよう! MVP - .NET  http://d.hatena.ne.jp/trapemiya/

    2017年3月21日 14:15
    モデレータ
  • >私共が削除を行っている基準は以下になります。ご一読いただければ幸いです。
    前回の投稿は、削除されていることに気づかないでの投稿でした。失礼しました。

    >日本の市場としての位置づけは欧米より遥かに低く
    上に挙げた二つの大前提は自明、すなわちどの国でも共通だと思いますが。

    >無関係の部署から横やり入れられても困ると言われておしまいです。
    フォーラムオペレーターさんの意見すら門前払いなら、一ユーザーの意見などなおさら無視されるでしょうね。
    「検討するかどうか」は、正論かどうかではなく、多数が賛同するかで決まる。
    その状況に、そもそも納得していません。
    白人が多い地域で「黒人を奴隷から開放すべきだ」と主張しても支持されないのと同じように。
    だから英語を使ってまでUserVoiceを使いたくない、というのはあります。そこまでUserVoiceに期待できるとは思えませんから。

    >例示されたEmpty関数は(IsEmpty関数も)存在しないのですが、どこらへん定義されてる関数でしょうか?
    Str.Emptyのことです。個人的には「Str=""」で判断してるので、Emptyはこのままでもいいですけどね。

    >今更拡張されるのか、という気もします。
    「今更」ですね。でも逆に言えば、今までずっと間違った設計を使っていた、ということでもあります。
    (それだけにこの意見は通りづらいでしょう。定着してますからね)
    でも今更ですが、今やらなければ、それが「これからもずっと」続くわけです。

    >互換系の関数は増えないんじゃないかな、というのは「対応しない理由」としては納得できませんか?
    できません。
    他の言語のことは視野に入れずに提案してますが、上に挙げた大前提はどの言語であろうと共通だと思ってます。
    なのでほかの言語にもこの提案を受け入れるべきでは?

    >VBはModuleでグローバルな関数が好きなように定義できるので
    それで済む問題ではないので提案しています。

    >「これらは全世界のVBユーザにとっての大問題なのでVBの規定として存在するべき」という御主張なのでしょうか?
    その通りです。
    なぜなら「慣習を破る」からです。

    >データがあるかないかの状態を尋ねているのでisを用いているのです。
    「データがない状態」とはどういうことか?
    「データがない状態=無効」という使われ方をすることが多い。
    それを踏まえての提案です。
    「Is~を廃止しろ」までは言い過ぎかもしれませんけどね。

    >あくまで各人のポリシーでしかありません。
    そうでしょうか?
    上に挙げた二つの大前提は自明、すなわち万人に共通だと思いますが。

    とにかく、「有効なのにFalse」という設計自体が大問題。
    設計者が浅はかだと、下にいる人間が苦労する。そのいい例です。

    追記:
    現行の設計である「Is~」は、単純に「Nullであるか?Nothingであるか?Eofであるか?」ということ「だけ」しか視野に入れてない。
    「Nullであるとはどういうことか?Nothingであるとはどういうことか?Eofであるとはどういうことか?」
    そこまで視野に入れた関数が欲しいのだ。
    「ちょっとしたこと」ではあるが、すごく大事なことだ。

    2017年3月22日 0:07
  • >「データがない状態」とはどういうことか?

    例えば、アンケートで未記入の項目は「データが無い状態」ということになります。
    この項目がNull許容のbool値である場合、true、false、Nothing(未記入)ということになります。

    >とにかく、「有効なのにFalse」という設計自体が大問題。

    プルコギさんはおそらく、有効=Nothing以外、無効=Nothingというように扱われようとしているんですよね?
    IsNothingはNothingかどうかを返すだけの単純な目的の関数です。有効、無効という概念にまで及んでいません。あくまでNothingかどうかを判断しているだけです。
    IsNothingは多くの場面で有用です。例えば、Nothingであれば空白に置き換える、Nothingであればエラーにする等です。これらの例に有効、無効の概念はありません。Nothingであるかどうかだけの概念だけです。
    プルコギさんはNothingに無効という概念を与えたので、単純にNothingかどうかを判断するだけのIsNothingが、目的に合わなくなっているのかもしれませんね。

    (追記)
    すみません。プルコギさんの追記を読みました。私が上に書いたことをわかっていらっしゃるように思いました。
    そこまで視野に入れた関数だと、例えばおしゃるようにNothingであればfalseを返す関数ですが、これは「Nullであるとはどういうことか?Nothingであるとはどういうことか?Eofであるとはどういうことか?」という概念を織り込んだ関数になりますから、そういった概念を含んだ関数名で自作された方がコードとしてわかりやすくなるように思います。例えば、「有効」という名の関数を作成し、それを使った方がコードが読みやすくなるということです。
    おそらくこのような概念を含んだ関数を標準で追加してもらうのは難しいような気がしますね・・・わかりませんが・・・


    ★良い回答には回答済みマークを付けよう! MVP - .NET  http://d.hatena.ne.jp/trapemiya/

    2017年3月22日 1:20
    モデレータ
  • >Nothingであれば空白に置き換える、Nothingであればエラーにする等です。これらの例に有効、無効の概念はありません。
    無効だから空白に置き換える。無効だからエラーにする。という考え方もできます。というか、普通、そうです。

    >プルコギさんはNothingに無効という概念を与えたので、単純にNothingかどうかを判断する目的のIsNothingが目的に合わなくなっているのかもしれませんね。
    「目的に合わない」。まさに、そういうことです。
    そして「Nothingは無効」というのは、私個人ではなく「多くの場合に通じる考え方」だと思います。なので多くの場合に「目的に合わない」わけで、そこを問題視してるわけです。

    2017年3月22日 1:33
  • このディスカッションでもこれだけの議論に及んでいるわけですが、英語でこれをやる自信はとてもないです。
    どなたか私の意見に賛同してくださる方に、代わりにUserVoiceで伝えていただきたいです。
    2017年3月22日 1:40
  • VB使いではありませんが、他の言語もという話題も出てきたので、私見を書かせていただきます。

    大前提に関しては、私もTrapemiyaさんと同意見です。

    booleanは真偽を表します。
    一方、EmptyやNothingというのは「状態」を表しています。
    なので、IsEmptyはEmpty状態にあるかどうかを調べるメソッドです。
    そして、その戻り値が表すのは、IsEmptyが真か偽かだけです、
    有効か無効かではありません。

    例えば、IsValidの戻り値としてtrueは有効、falseは無効である、というのは分かりますが、IsInvalidの戻り値であれば意味合いが逆になるのは当然です。これが、GetConditionというメソッドだったとして、trueが有効/falseが無効という意味を持たせて戻り値とすることは、ないとは言いませんが、私なら列挙体を返すように指導します。booleanは状態を表すことはなく、この文脈では不向きだからです。もちろん、有効であることをtrue、無効であるとことをfalseで表すことを否定するものではありません。booleanに状態を関連付ける慣習は確かにあると思います。

    話しを戻しますと、
    IsDbNullやIsNothingは、それぞれその状態にあるかどうかの真偽を返しており、何らおかしい設計ではありません。プルコギさんも書いてらっしゃいますが、これを廃止するというのは断固反対です。

    一方で、「その逆の関数を追加してほしい。」という要望はわからなくもありません。
    c#だと、== か != かの差にすぎませんが、逆関数があったほうが自明になる部分は多いと思います。ただ、プルコギさんの書いている通り、対義語が見つからず、私の語彙力ではいいメソッド名は浮かびません。(ご提案のOkNull等はさすがにないと思います。OkもNullも状態なので、そのメソッドの意図が意味不明です。)

    と書いているうちに、話が進んできたようですので、これ以上はやめておきます。
    上記のように私は賛同することはできませんので、余計なお世話だと思いますが、
    翻訳サイトで訳してでもご自分で書いた方がいいと思いますよ。

    2017年3月22日 2:22
  • ただ、プルコギさんの書いている通り、対義語が見つからず、私の語彙力ではいいメソッド名は浮かびません。(ご提案のOkNull等はさすがにないと思います。OkもNullも状態なので、そのメソッドの意図が意味不明です。)

    IsNothing や IsDbNull の対義語として、私が浮かんだのは HasValue ですね。Nullable 構造体にも同名のプロパティが存在しますが。 


    本フォーラムは、ユーザー(開発者)同士で情報交換を行うためのコミュニティです。初めて利用される方は、以下のアナウンスをご覧ください。 https://social.msdn.microsoft.com/Forums/ja-JP/ca9ecfb7-4407-4fcb-b8bd-207d68257e68?


    2017年3月22日 2:47
    モデレータ
  • プルコギ さま よろしく。

    首を突っ込ませて下さい。

    個人的な結論として、現状で満足しています。

    確かに、2重否定は分かり難いですよね。
    でも、使いませんか?。  例えば、「春が来ないなんて事は無い!」とか。
    英語はよく分からないのですが、2重否定には強調の意味合いもあった気がします。
    佐祐理 さまが冒頭で書かれた 英語の文章に近い開発言語としての Basic であれば、
    ネイティブの方には特異状態を処理しているのだと注目させる事にもなるのではないでしょうか。

    仮に、提案したとしても、
    2重否定がお嫌なら、その様なロジックにすれば ... で片付けられてしまう可能性が高い気がします。

    さて、データを弄る観点からは、データがあるものとしたいですね。
    言い換えれば、あって当然な筈なのが普通の変数等の値です。
    でも、特異なケースとして、データが存在しないケースが稀に有るので、
    それを処理する前に、その状態を確認して置こうと。
    その為の Nothing 等がある気がします。
    Nothing や Null や EOF は特異ケースです。
    確認の後、データをどうするか?、エラーにするのか、別の値を代入するか、は処理によって様々です。
    必ずしも、真偽の結果によって一様に処理される訳ではありません。
    特異状態を炙り出す意味で IsNothing 等(既存)の方が存在価値が大きい気がしています。

    でも、有るかどうか分からないものには Exists 等の関数がちゃんと準備されています。

    と言う事は、可能な限り、Nothing 等に出会わない様にロジックを組みましょう、
    で、済まされてしまうかも知れませんね。
    • 編集済み ShiroYuki_Mot 2017年3月22日 3:44 IsNothig 存在意義を追加
    2017年3月22日 3:10
  • そもそも私は、Is~の必要性を言及してるのではなく、Ok~の必要性を言及しています。
    Is~が必要なら、それはそれで残せばいい。存在自体は否定しません。名前もわかりやすいのは認めます。

    ただね………
    「道具としては原始的すぎる」んですよ。
    そしてそれが、「わかりやすいプログラム」を生み出すうえで妨げになっている。

    原始的な関数だけを提供して、そこから先は個々人のポリシーに任せているわけでしょう?
    それが個々人のポリシーに依るのならば、それでいい。
    でも万人に共通のポリシーなら、それを個々人に負わせるのは間違ってます。

    個人で開発するぶんにはいいです。でもそうじゃない。
    今マイクロソフトさんが対応してくれなかったら、それが「これからもずっと」量産され続けることになる。そこを危惧しています。

    まぁ、Ok~という名前は、語弊がありますね。
    「それが有効かどうか」を意味する単純な単語があればいいですが。
    CheckNothingとかJudgeNothingとか、かなぁ…。

    2017年3月22日 4:06
  • 存在して当然のものを探し出す 「Ok~の必要性」 はありません。 出現頻度の観点から、不毛な関数と、言語仕様からは片付けられるでしょう。

    2017年3月22日 4:34
  • 「存在して当然」なら、そもそもIs~もいらないのでは?????
    2017年3月22日 4:48
  • 例外処理用に準備された関数なので、存在意義が異なります。
    2017年3月22日 4:54
  • ああ、なるほど。ようするにはShiroYuki_Motさんは、
    「値が入っているのが通常の状態であり、NullやNothingは特異な状態なのだから、特異な状態のチェックのために関数を追加する必要はない」
    というお考えか。

    でもですね。少なくとも私の携わっている仕事では、NullやNothingは特異でもなんでもない。
    当たり前のように使われ、その判定も山のようにある。
    特異であることを強調する意義はなく、ましてやNullやNothingを使わないロジックにするのも現実的に不可能なのです。

    2017年3月22日 5:24
  • 仰られる様に、Nothing も DBNull も困った存在です。
    個人的には、なるべく、避ける方針で書きます。 書きたいです。

    でも、現実には、紛れ込む!。
    でも、言語仕様的にそれを認める方向の関数を作ってしまえば、
    更に、混乱を助長するので、避けたいのではないでしょうか。

    なるべく出現しない様に書いて下さい、 が本筋と思います。

    Solution の特徴で、除外出来ないのなら、2重否定が直観的で無いなら、それ専用の関数を独自に書いて下さい、が、言語開発側の気持ちになる気がします。
    • 編集済み ShiroYuki_Mot 2017年3月22日 5:46 2重否定の件を追記
    2017年3月22日 5:42
  • >なるべく出現しない様に書いて下さい、 が本筋と思います。
    そうでしょうか?
    NullやNothingは非推奨ではなく、それらをどう使うかはユーザー個々人のポリシーに委ねられていると思います。
    ましてやEofは排除のしようがないものですし。

    仮にOk~を追加したとして、混乱を助長することにはならないと思いますよ。不要なら使わなければいいだけですからね。

    問題は、「NullやNothingを頻繁に使う」というポリシーを取ったときに、原始的な道具しかないということです。

    2017年3月22日 23:17
  • またまた横槍失礼します。

    >NullやNothingは非推奨ではなく、それらをどう使うかはユーザー個々人のポリシーに委ねられていると思います。
    これらをどう使うかはポリシーというよりも、ケースバイケースです。
    なので、敢えて原始的な機能しかないのだと思います。
    その値の意味は状況によって変わるものですし、それが使う側によって分かり辛いのであれば、一旦意味の分かりやすい変数名をつけた一時変数に受ける等する必要があると思います。

    >問題は、「NullやNothingを頻繁に使う」というポリシーを取ったときに、原始的な道具しかないということです。
    「原始的な道具しかない」のが正しい姿だと思います。その上でIsDbNull等の逆関数(ひらぽんさんご提案のHasValue等)のような、別の原始的な道具があることには賛同します。(繰り返しになりますがOkかどうかは使用者の判断になるので、Ok~という名称はどうかと思います。)
    それ以上の意味を持たせたければ、アプリケーション側の、よりシチュエーションが限定されたケースで、意味の伝わる適切な名前のメソッドを提供すべきだと思います。

    なお、ShiroYuki_Motさんの
    >存在して当然のものを探し出す 「Ok~の必要性」はありません。
    という意見には私も違和感があります。(他は概ね同意見なんですが)
    ただ、昔のように「出口は1つ!」なんていう人もいないので、最近は例外的な条件を探してエラー処理する方が階層が深くならないので好きです。なので、個人的には逆関数は使わないかもしれません。でも、そこはもう慣習の問題だと思うので、存在まで否定する気にはなりません。
    2017年3月23日 0:53
  • 情報交換の場である Forum で無益な討論をする心算はありません。
    ただ、2重否定が不自然とのお考えに意見を述べたに過ぎません。

    もし、本当に、改善要求するなら、然るべき場所に然るべき方法で挙げるしかないと思います。
    その場合、問題の無い関数に、逆の真偽を返すものを新設(or 交換)する事になる為、
    余程、説得力のあるロジックで説明しないと通らないであろう と思うのです。

    今回の情報交換で賛同の意見が述べられなかった様に、今の説明では、納得させるには不十分な気がします。
    2017年3月23日 0:55
  • >これらをどう使うかはポリシーというよりも、ケースバイケースです。
    「無効・否・NG」という意味合いで使われることが圧倒的に多いのは自明です。

    > 「原始的な道具しかない」のが正しい姿だと思います。
    そうは思いません。火をつけるという目的のために火おこしの木を使うより、マッチを使うのが正しい姿です。
    原始的な道具は、目的に合いません。

    >余程、説得力のあるロジックで説明しないと通らないであろう と思うのです。
    私の場合、説得力の問題ではなく、英語の問題ですね。

    >今回の情報交換で賛同の意見が述べられなかった様に、今の説明では、納得させるには不十分な気がします。
    むしろ逆です。これだけの反対意見が寄せられたにもかかわらず、説得力ある反対意見は何一つ出てきません。
    ますます自分の考えは正しいと思っています。

    そもそも私は、この場に賛同者が現れるとは思ってません。
    なぜなら、「賛成意見」なのですから。言葉にする必要がないわけです。
    でも反対意見は言葉にする必要がある。「反対意見」なのですから。
    反対意見だけが寄せられるのは当然です。

    それに声なき賛同者なら大勢いるではありませんか。20人も!

    2017年3月23日 1:35
  • それに声なき賛同者なら大勢いるではありませんか。20人も!

    見方が間違ってます。投票が付いてるレスをご覧ください。佐祐理さんのコメントだけでも合計10票集めてます。(うち2票はオペレーターによりレスごと削除されてますが) プルコギさんには一票も投票されてません。これが現実です。



    本フォーラムは、ユーザー(開発者)同士で情報交換を行うためのコミュニティです。初めて利用される方は、以下のアナウンスをご覧ください。 https://social.msdn.microsoft.com/Forums/ja-JP/ca9ecfb7-4407-4fcb-b8bd-207d68257e68?



    2017年3月23日 1:58
    モデレータ
  • あらま。知らんかったわ…orz

    でも佐祐理さんの投稿に8票も入っている時点で、この投票はアテにならない証拠ですね。
    なにしろ完全に間違った見解でしたから。オペレータによって削除されているように。

    投票が味方にならないにしても、私の正しさには何一つ支障ありませんが。

    2017年3月23日 2:07
  • なにしろ完全に間違った見解でしたから。オペレータによって削除されているように。

    コミュニティを円滑にするためプルコギさんのコメントと併せてオペレーターの方により削除されてるたけです。誤解なきように。ちなみに私も佐祐理さんの見解に1票です。


    何度も言ってますが、ここで正義をいくら主張しても一向に改善は期待できませんよ。たぶん5年後もいまの仕様のままです。その時間を、英語の勉強にでも当てた方が遥かに有意義だと思います。まして今は翻訳サイトもあるので、ある程度なら英文サイトでも考えを主張できるのではないでしょうか。

    最初の投稿をエキサイト翻訳で変換してみました。果たして意が通じるよう翻訳できてるか不明ですが、再変換したところ、さほど文意が崩れてないよう見受けられます。これを UserVoice に投稿し、反応伺ってみてはいかがですか?

    I want you to add the reverse function in IsDbNull and IsNothing.
    
    IsDbNull, IsNothing, the EOF and Empty aren't intuitive and are inconvenient.
    Two major premises are described as the reason.
    
    Major premise 1
    In many cases, Null Nothing, EOF and Empty are used in an implication as "invalidity, fault and NG".
    
    Major premise 2
    True is* Masashi OK effectively, and False is an implication as invalidity, a fault and NG, and it's used in in most cases. And that's a custom.
    
    But for these to reverse, the function above-mentioned is incomprehensible and inevitable intuitively.
    For example when seeing description such as "If Not ABC Is Nothing Then", I'm confused.
    
    Therefore I want you to add the function to which these reverse is returned (for example, OkNull OkNothing OkEof OkEmpty).
    The respective implications "Is Null judgment OK? Is Nothing judgment OK? Is EOF judgment OK? Is Empty judgment OK?".
    
    Why wasn't Microsoft based on such point of view originally?
    Oh, it's also understood. After all because there are no antonyms in Null Nothing, EOF and Empty (Even if I have that, it's unfamiliar.)
    And I'd want to unify with IsDate and IsNumeric.
    When should OkDate and OkNumeric also add it if unification is emphasized?
    
    But, for example this is also this by the reason which "returns False to being a name as Nothing in case of Nothing", and "OkNothing" may bear confusion.
    But the one of confusion by "yuukou is False." should be quite than confusion by that.
    Because "A custom is broken." it's vanity.
    
    I wish correspondence sincerely.
    If there is a reason that I don't deal conversely, I want you to tell me by all means.
    

    ちなみに本件については、私には現行の仕様でなんら不都合はなく、また C# に移行してるため、どうでもいい問題です。プルコギさんの意見に同意する方いたら、これを基に投稿して頂けばいいかと思います。



    本フォーラムは、ユーザー(開発者)同士で情報交換を行うためのコミュニティです。初めて利用される方は、以下のアナウンスをご覧ください。 https://social.msdn.microsoft.com/Forums/ja-JP/ca9ecfb7-4407-4fcb-b8bd-207d68257e68?


    • 編集済み ひらぽんModerator 2017年3月23日 2:54 誤解招かないよう文章の表現を変えました
    2017年3月23日 2:22
    モデレータ
  • 質問者様はこのスレッドなにをしたいのでしょうか?
    このフォーラムは言語仕様に対して要望をだすフォーラムではありません。
    言語仕様の要望に関しては、佐祐理さんの一番最初の回答にあるように、UserVoiceのほうへどうぞ。

    > 佐祐理さんの投稿に8票も入っている時点で、この投票はアテにならない証拠ですね。
    私を含めて投票された方全員を、貶めたいのでしょうか。
    ご自身の意見に自信を持たれるのは構いませんが、少し冷静に周りの意見に耳を傾けてはいかがでしょうか。

    > 私の場合、説得力の問題ではなく、英語の問題ですね。
    それでしたらこのスレッドを更新するよりも、英語の勉強をされたほうが前向きだと思いますよ。

    • 編集済み uemu 2017年3月23日 3:10
    2017年3月23日 2:29
  • 結局一周して、私が一番最初にコメントした英語を勉強すべきに戻ってきたのでしょうか?

    削除したモデレーターさんには記述を復活させてほしいです。


    • 編集済み 佐祐理 2017年3月23日 2:42
    2017年3月23日 2:41
  • 言語仕様的に言えば、Nothingは参照型の変数に何も入っていないことを表します。これは参照型の初期値でもあります。
    初期値という意味で、数値で言えば0、文字列であれば空文字に相当します。
    何も入っていないということは比較する対象がないということです。よって、NothingであるかどうはIs や IsNothingを使います。なぜ=で比較せず、IsやIsNothingが用意されているかに着目してみて下さい。

    何も入っていない状態に「無効・否・NG」という意味をもたせるかどうかは自由ですが、私であれば何も入っていない状態は「無効・否・NG」なのか「有効・可・OK」なのか判断できないという状態であると定めます。
    何も入っていない状態が意識して生み出されたのか、そうでないのかわからないからです。平たく言えば、ユーザーが入力し忘れたかもしれない、などといった可能性が残るからです。
    通常、「無効・否・NG」と「有効・可・OK」のどちらであるかは私であれば明確な値を設定します。1と2、trueとfalseなどです。おそらく、ここがプルコギさんと私の考え方が違うところだと思います。

    Nothingを「無効・否・NG」という意味で使われる方が大勢いるかどうかはわかりませんが、もし大勢だとしても私はその使い方には賛同しかねますし、もし後輩がそのような設計をしていたら指導して訂正させると思います。基本的に、初期値に意味を持たすことはしないという考え方が根底にあります。
    繰り返しになりますが、参照型の初期値は何も入っていない状態であり、その状態を表す言葉がNothingであり、状態を表しているので=という比較ではなく、IsやIsNothingで状態を問い合わせる。言語仕様的には極めて明確かつ十分のように思います。Nothingを「無効・否・NG」という意味で使うというのは、言語仕様ではなく、言語を使う上でのプログラマーの概念が入っています。言語仕様的には、Nothingは何も入っていないという状態を表す以上の意味はありません。
    概念まで言語仕様に入れるのは無理があると思いますので、そのような場合にはその概念を実現し、かつその概念がわかりやすい名前付けをした関数等を作成されると良いのではないかと思います。


    ★良い回答には回答済みマークを付けよう! MVP - .NET  http://d.hatena.ne.jp/trapemiya/


    2017年3月23日 2:54
    モデレータ
  • 何も入っていないということは比較する対象がないということです。よって、NothingであるかどうはIs や IsNothingを使います。なぜ=で比較せず、IsやIsNothingが用意されているかに着目してみて下さい。

    これには同意です。SQLでも NULL と比較するのは、等号でなく「IS」を使ってますしね。しかもこれは、Oracle・SQLServer・MySQL・PostgreSQL・Firebird・DB2 etc・・・どのベンダーも共通の仕様です。


    本フォーラムは、ユーザー(開発者)同士で情報交換を行うためのコミュニティです。初めて利用される方は、以下のアナウンスをご覧ください。 https://social.msdn.microsoft.com/Forums/ja-JP/ca9ecfb7-4407-4fcb-b8bd-207d68257e68?

    2017年3月23日 3:03
    モデレータ
  • 仰られる様に、Nothing も DBNull も困った存在です。
    個人的には、なるべく、避ける方針で書きます。 書きたいです。
    他の言語のことは視野に入れずに提案してますが、上に挙げた大前提はどの言語であろうと共通だと思ってます。
    なのでほかの言語にもこの提案を受け入れるべきでは?

    この辺りに対して建設的な話を。

    Visual Basicでは変数宣言において

    Dim s1
    Dim s2 As String
    Dim s3 = ""

    とできます。s1は何を格納するかを含めて不明なまま宣言を受け入れます。s2はString型であることは宣言されていますが値は明示されておらずNothingになります。s3は明示的に""を初期値として格納しています。
    このように自由度がある分、意図しない状態を認めてしまう言語です。

    これがC#になると変数宣言において

    String s2;
    var s3 = "";

    となり、VBのs1のように不明なままの宣言は(基本的には)認められなくなります。ただし、VBのs2と同じく値を明示しない形式も認められています。

    更に進めるとF#言語では

    let s3 = ""

    となり、値を初期化しない宣言は(基本的には)認められなくなります。

    これが全てではありませんが、言語設計によってはこのような工夫を積み重ねることで可能な限りNothing(null)を避けることもできるということで参考になれば幸いです。

    2017年3月23日 3:15
  • >誤解なきように。
    誤解などしてませんよ。「完全に」間違った見解でした。UserVoiceを勧めたという点以外では。

    >私であれば何も入っていない状態は「無効・否・NG」なのか「有効・可・OK」なのか判断できないという状態であると定めます。
    Nothingに「無効・否・NG」という意味を持たせること、「有効・可・OK」という意味を持たせること、どっちが率直で、どっちがひねくれた思考でしょうか?

    >なぜ=で比較せず、IsやIsNothingが用意されているかに着目してみて下さい。
    それはここでは関係ない論点ですね。

    >もし後輩がそのような設計をしていたら指導して訂正させると思います。
    その後輩が気の毒に…。
    私なら、「If Not ABC IsNothing Then」という記述をする後輩を注意します。

    >質問者様はこのスレッドなにをしたいのでしょうか?
    何がしたいか?
    UserVoiceに投稿する前に、日本語が通じるこの場で反応が見たい。というのが目的です。
    皆さんを不快にさせる目的はまったくありませんが、結果としてそうなってしまう。
    いやはや不満というものは怒りに転化しやすいものです。

    でも投票がアテにならないと判明した今、UserVoiceの投票も期待できませんね。
    投稿するだけ時間と労力の無駄かな、と思います。それがわかっただけでも収穫とすべきでしょう。
    ましてや英語を勉強?しませんよ、そんなこと。
    でもせっかくひらぽんさんが英訳していただいたのでありがたく使わせていただきます。

    2017年3月23日 3:42