Mr.Tの場所

特攻野郎Aチームじゃないよー

ホーム 連絡をする 同期する ( RSS 2.0 ) Login
投稿数  207  : 記事  0  : コメント  840  : トラックバック  43

ニュース

  • 性別:男
  • 猫1:まる
  • 猫2:もろ
  • 猫3:にゃん左部郎
  • タバコ:男は黙ってJPS
[わんくま同盟] C#, VB.NET 掲示板
フィードメーター - Mr.Tの場所

書庫

日記カテゴリ

Mr.Tです、こんにちは。

オノデラさん:http://blogs.wankuma.com/yo/archive/2007/10/02/99154.aspx

のエントリに対して、とりこびっちさんがつけたコメントにビクッと反応。言葉の意味を取り違えている可能性は大ww

わたしはVisual Basic であっても Optional はなんかしっくりきません・・・。

いや、Optionalは、いいものだ...

 

VB.NETになってから、メソッドのオーバーライドができるようになったので、引数を増やしたり、減らしたりと

いうことができるようになりました。大変、便利なものです。

例えば、絵を描くというメソッドがあった場合、

 

Private キャンパス as 画用紙

Public Sub 絵を描く(byval 筆 as 絵筆)

  線を引く(キャンパス, 筆,ここから、ここまで)

end sub

Public Sub 絵を描く(byval 筆 as 絵筆,byval 指定色 as 色)

  筆.色  = 指定色

  線を引く(キャンパス, 筆,ここから、ここまで)

End Sub

 

Optionalを使うと、こんな形ですね。

Public Sub 絵を描く(byval 筆 as 絵筆,optional byval 指定色 as 色 = 赤)

  筆.色  = 指定色

  線を引く(キャンパス, 筆,ここから、ここまで)

End Sub

 

一番違うのは、Optionalの場合、引数に対して最初に初期値を与えないと赤で線が引かれてしまうわけです。

 

しかし、Optionalの使い方は、オーバーライド的なものと、そういうもんじゃないものがあるような気がします。

例えば、

Public Sub 絵を描く(byval 筆 as 絵筆,Optional 上塗りフラグ as boolean = False)

    if 上塗りフラグ then

(1)      線を引く(キャンパス, 筆,ここから、ここまで)   'この場合は、下に絵が描かれていても上書き 

    else

   Dim 線引きエリア as エリア = キャンパス.エリア取得(ここから,ここまで) 

   for each 点 in 線引きエリア

     if 点がすでに塗られてる?= false then

        点を描く(キャンパス, 筆,点)

             end if

        Next

   end if

End Sub

 

こんな風。これがもし、Optiona 削除フラグ みたいなものなら、「線を消す」メソッドをつくりなさいよ、とか
キャンパスの下地色で線を引け、とかいう話になると思います。

Optionalに描画メッセージ(線じゃなく、文字を書く)みたいなものも、だめです。
本来の意味が違うことになってしまうので。

でも、わざわざ上塗りしないメソッドを別につくりたくないです。

そういうのは、絵を描く時に、ちょっと気をつけたらいいことでしょ?

 

この上のメソッドってのは、実際に絵を描きたいだけですが、すでに絵がある場合は、そこを抜いて

描いていきます。本来の意味は失われていません。

オーバーライドして上塗りフラグをつけてもいいのですが、(1)の部分が、二重になります。上記の例なら一行ですけど

これが複数行になった場合は、結構冗長になりそうな感じがします。

Optionalってのは、「本来のメソッドの意味を失わずに、その機能を細かく制限したいとき」に利用できるVBらしい

機能っていえるのじゃないでしょうか。

投稿日時 : 2007年10月3日 0:24

コメント

# re: Optionalをつける時 2007/10/03 1:19 επιστημη
せんせえしつもん。
Optional引数のあるメソッドを導出クラスでoverrideし、Optionalのdefault値を基底クラスの当該メソッドのそれと異なる値にしちゃうとどぉなるでしょか?
許す? 許さない? 許すならどんな挙動?


# re: Optionalをつける時 2007/10/03 1:37 まどか
何か書こうと思っていろいろ考えましたが、考えれば考えるほど混乱してきますね。
VB6のころは手法の一つという感じで使用していましたが、Overloadが出来てからは
少なくとも引数の設計で第一候補はおろか検討することがほとんどなくなりました。

大きな事実として既定値の存在がありますね。
で、これは完全に仕様の一部であるということになると思います。
何を言っているかというと、
Overloadでの省略は完全な省略ですが、Optionalでの省略は既定値が指定されたということになります。
また、Optional変数を業務的な判断はしても省略されたかどうかの判断は通常しないでしょう。
そういう意味では、Optional変数の判断を起因とするプログラムの複雑化は良いことではないのではと思います。
#存在意義と矛盾するから

# re: Optionalをつける時 2007/10/03 1:45 まどか
> overrideし、Optionalのdefault値を基底クラスの当該メソッドのそれと異なる値にしちゃうと

シグネチャの一部だから出来ないんじゃないのと思いながら、不安になり試したら
やっぱり出来ませんでした。>既定値のみの変更

そういうことではなく?

# re: Optionalをつける時 2007/10/03 9:04 επιστημη
あはーん、Optionalの規定値もシグニチャの一部なのかー
スゴークわかりたです。

# re: Optionalをつける時 2007/10/03 9:24 Mr.T
Mr.Tです、こんにちは。
>Overloadが出来てからは
>少なくとも引数の設計で第一候補はおろか検討することがほとんどなくなりました。

確かに、それまではOptionalでしかできなかったのに
今はoverloadすることで足りますし、設計もその方向にシフトしますね。

使う側では、OverloadなのかOptionalなのかってのは、ぱっと見じゃわからないので、「はて、これは引数は省略できるのかどうか?」という判断が必要になりますね。そうなると、Optionalを禁止!としても、実はそれほど困らないじゃないかな、とは思います。
だって、引数は必ず指定しなくちゃいけないようにルール化できるし、Optionalの初期値がなんなのかを知らないわけにはいきませんので。

ただ、VBだからw
このメソッドの引数をつけ忘れても、「影響がすくないよね」的なものがOptionalなのかな、というイケナイことを考えてみたりもします。


# re: Optionalをつける時 2007/10/03 9:38 Mr.T
>Optional引数のあるメソッドを導出クラスでoverrideし、Optionalのdefault値を基底クラスの当該メソッドのそれと異なる値にしちゃうとどぉなるでしょか?

まどかさんのように不安になりましたので、やってみたらやはりできんかったですね。

考えてみれば当たり前ですが、こんなのもできんです。
Public Overloads Sub WriteString(Optional ByVal Msg As String = "熊は、どんな熊だぁ")
Debug.WriteLine(Msg)
End Sub

Public Overloads Sub WriteString(ByVal 名前 As String, Optional ByVal Msg As String = "小熊は、どんな熊だぁ")
Debug.WriteLine(Msg)
End Sub

Optionalでは、引数を省略できるので、あきらかに引数の数が異なっていたとしても、上記の場合は、Overloadsされたものなのか、Optionalで省略されたものなのか、わからないためでしょう。
やはり、いらぬか?optional...w

# re: Optional が一晩でやってくれました。 2007/10/03 10:03 とりこびと ぶろぐ。
re: Optional が一晩でやってくれました。

# Optional もいいんですが、これだけはやって! 2007/10/04 10:12 Shizuku Blog ~ .NET Study版 ~
Optional もいいんですが、これだけはやって!

Post Feedback

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