VB2005 のサンプルとして
引数にボタンオブジェクトと表示文字列をとる
キャプション変更関数を作成したところ、
オブジェクト指向的プログラムとしては不適当だと指摘されました。
どのようなコートに変更すればよくなるのでしょうか。
キャプションの変更に限らず、
オブジェクトの参照渡は不適当なのでしょうか。
どなたかご教授ください。
よろしくお願いいたします。
※Button2 のキャプションを操作する
Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
ChgCaption(Button2, "停止")
End Sub
Sub ChgCaption(ByRef BTN As Button, ByVal caption As String)
BTN.Text = caption
End Sub
> キャプション変更関数を作成したところ、
> オブジェクト指向的プログラムとしては不適当だと指摘されました。
指摘じゃなくて難癖だと思われ
別に問題ないとおもう
うーん,「オブジェクト指向的プログラムとしては不適当」という指摘は不適当だと思いますが,
私がコードレビューしたなら,なんでByRefにしたのかは質問しますね。
ByRefを使う意図がくみ取れないので。
クラスをByRefで渡すことは滅多にないと思いますよ。
コントロールのByRef渡しとなると,皆無に近いかと。
ガッ,YuO ご回答ありがとうございます。
デルファイでよく使ってたので、
byRef でないと属性が変更できないと思い
確認もせずに書いておりました。
byValでも変更できることを確認しました。
YuO さん、
byRef→byVal に変更すれば、使い方として
問題はないのでしょうか。
それとも フォームのプロパティとして
set で変更すべきものでしょうか。
※以下二つの問題は競合していないので個別に回答します
> byRef→byVal に変更すれば、使い方として
> 問題はないのでしょうか。
仮引数の定義の仕方としては大差はありません.
ただしByRefは呼び出し元の変数を書き換える恐れがあるので注意が必要です.
(そういう意味では区別が必要)
Delphiだと ByRef が ref(outでない) で ByVal が in でしょうか.
> それとも フォームのプロパティとして
> set で変更すべきものでしょうか。
現在はフォームのプロパティで書き込んでいるので変更する部分はないと思われ
ガッ さん
>現在はフォームのプロパティで書き込んでいるので変更する部分はないと思>われ
キャプションを変えたいボタンが
別フォームにある場合はどうなりますか。
そもそも.NET ではフォームにあるコントロールの属性を
操作する場合、別フォームにプロパティを追加(SET)して
変更するのが基本なのでしょうか?
※別フォームとかフォームとか名前が混同しているので,適当に回答.
> キャプションを変えたいボタンが
> 別フォームにある場合はどうなりますか。
> そもそも.NET ではフォームにあるコントロールの属性を
> 操作する場合、別フォームにプロパティを追加(SET)して
> 変更するのが基本なのでしょうか?
そもそも.NETではフォームもコントロールクラスを継承した一種のクラスで,
そしてフォームに配置されているコントロールはクラス(のインスタンス)の要素です.
なので「フォームに配置されたボタンのキャプションを変更する」という動作の責任は,
少なくとも他のフォームには存在してはいけなく,"その"フォームに存在すべきだと思います.
という責任の所在を考えると,GASさんの
> 別フォームにプロパティを追加(SET)して変更する
というのは妥当な案だと思います
ガッ さん
少し物のつかえが取れたような気がします。
ありがとうございました。