- PR -

VB2005の言語仕様の落とし穴について(ソース付き)

投稿者投稿内容
ゆか
ベテラン
会議室デビュー日: 2004/04/06
投稿数: 75
投稿日時: 2007-04-20 18:07
いつも勉強させていただいております。今回は質問をさせていただけないでしょうか。

下記のコードがあります。
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
MsgBox(func(1))
MsgBox(func())
End Sub

Function func() As String
Return "ABC"
End Function

VB2005で、コンパイルエラーになりません。
実行もできます。
不思議ですね。でも、理由もわかりました。
つまり、デフォルトのプロパティを使っているという事です。

ものすごく、紛らわしいと思いませんか?
せめてワーニングを出して欲しいです。
これで、かなりのバグが含まれる可能性があるように思います。

そこで、質問です。
エラー、ワーニングを出す方法ってあるのでしょうか?

それでは、よろしくお願いします。
かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2007-04-20 18:52
僕も一瞬なぜ動くのかわかりませんでした。
これ制限する方法あるのかな・・・

#Relax Delegate みたい

MsgBox(func()(1))
なのね。。。

_________________
かるあ のメモ
http://karua.at.webry.info/

[ メッセージ編集済み 編集者: かるあ 編集日時 2007-04-20 19:01 ]
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-04-20 18:57
引用:

ゆかさんの書き込み (2007-04-20 18:07) より:

不思議ですね。でも、理由もわかりました。
つまり、デフォルトのプロパティを使っているという事です。


Chars プロパティですね。

引用:

ものすごく、紛らわしいと思いませんか?


あくまで私見ですが、私はそうは思いません。
コーディング段階で確認するでしょう。(今やインテリセンスもありますし)

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2007-04-20 19:19
引用:

じゃんぬねっとさんの書き込み (2007-04-20 18:57) より:
あくまで私見ですが、私はそうは思いません。
コーディング段階で確認するでしょう。(今やインテリセンスもありますし)


インテリセンスとかってなにかの拍子にうまく出てこなかったり、
さっさと打ち込んでると確認するまでもなく入力してしまうこともあるし、
その辺でミスしたところを捕まえてくれるのがコンパイラの仕事だと思うので…

入力時にミスしたら、もう見つからないってのはそれはそれで厳しいと思います。
コードレビューとかでは気づきにくいってのもあります。
※こういうのを捕まえるのに適した機会はコンパイル時くらいしかないという意味です。

--追記
デフォルトプロパティというよりも、括弧を省略したメソッド呼び出しの問題ですね。


[ メッセージ編集済み 編集者: なちゃ 編集日時 2007-04-20 19:20 ]
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-04-20 19:39
引用:

なちゃさんの書き込み (2007-04-20 19:19) より:

インテリセンスとかってなにかの拍子にうまく出てこなかったり、
さっさと打ち込んでると確認するまでもなく入力してしまうこともあるし、
その辺でミスしたところを捕まえてくれるのがコンパイラの仕事だと思うので…


インテリセンス云々は、括弧で書いているとおりあくまで補助的なものです。
「コーディング段階で確認するでしょう」 というのは、自分が書いたコードならば、
自分で知っているでしょうし、他人のコードであれば確認するというレベルで話をしています。

私が紛らわしいと思わないのは、この手のことでハマったことが一度もないからです。
他の人の感覚までは、知るコトができないので "私見" と前置きしました。

まあ、今回の例はメソッドなのですから括弧の強制くらいあってもいいとは思いますね。
どちらにしても、Func().Chars という書き方は私はしないです。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2007-04-20 20:28
引用:

じゃんぬねっとさんの書き込み (2007-04-20 19:39) より:
インテリセンス云々は、括弧で書いているとおりあくまで補助的なものです。
「コーディング段階で確認するでしょう」 というのは、自分が書いたコードならば、
自分で知っているでしょうし、他人のコードであれば確認するというレベルで話をしています。

私が紛らわしいと思わないのは、この手のことでハマったことが一度もないからです。
他の人の感覚までは、知るコトができないので "私見" と前置きしました。

まあ、今回の例はメソッドなのですから括弧の強制くらいあってもいいとは思いますね。


多分、「紛らわしい」の意味の認識が微妙に違うのでしょう。

私もこれではまったことは(おそらく)ないですが、これを見てややぞっとしました。
このミスをしてしまったときに、気づかない、あるいは見落とす危険があるからです。
※ミスってのはタイプミスレベルのミスの話です。

引用:

どちらにしても、Func().Chars という書き方は私はしないです。


今回は記述をするしないの問題ではなくて、間違って書いてしまった場合に、
エラーにならずに意図しない動作をしてしまうという部分について、だと思います。
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2007-04-20 20:55
引用:

ゆかさんの書き込み (2007-04-20 18:07) より:
つまり、デフォルトのプロパティを使っているという事です。


私は VB2005 を良く知らないのですが、これは、昔からの VB (VB2 位の頃?)からある問題と同じことでしょう。
(VB というより、OLE などの Windows のコンポーネントアーキテクチャの問題?)
そして、これは結局は「デフォルト」というものの存在による、悪影響です。

どんな言語でも「デフォルト」があると、問題が目に見えにくくなるので、とにかくややこしくなります。コーディング時にキーボードタイピングのキーを押す回数を少なくするだけのための「デフォルト」ならば、いっそないほうがずっと良いと思います。

また、「デフォルト」があるにしても、「デフォルト」にアクセスするために、専用の記述があれば、目に見えるのでこういう問題も少なくできると思います。コンピューターのランタイム環境自体は、言語仕様にしたがってパースするのでデフォルトがあることが当然分かりますが、人間は、ソースコードに字として書かれていないものを意識することは難しいでしょう。

--
unibon {B73D0144-CD2A-11DA-8E06-0050DA15BC86}
ラフィン
ぬし
会議室デビュー日: 2002/05/23
投稿数: 809
お住まい・勤務地: 外野
投稿日時: 2007-04-21 09:47
引用:

unibonさんの書き込み (2007-04-20 20:55) より:

また、「デフォルト」があるにしても、「デフォルト」にアクセスするために、専用の記述があれば、目に見えるのでこういう問題も少なくできると思います。コンピューターのランタイム環境自体は、言語仕様にしたがってパースするのでデフォルトがあることが当然分かりますが、人間は、ソースコードに字として書かれていないものを意識することは難しいでしょう。


 同感です。

 同じ並びにある他のプロパティとは別に1つだけ省略可能にしてにしても、ちょっと横着できるだけで良い事ではないんじゃないかと。
 理解している一部の人以外がわからず使うより、デフォルトは無くしてちゃんと書かないといけないようにした方がいいんじゃないかな。

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