- 締切済み
メソッドの作成方法
メソッドの作成方法に関して不明な点がありますので教えてください。 次の例はExcel VBAで作成したものです。 ---- Class Point ---- Public x As Integer, y As Integer ---- Class Line ---- Public FromPoint As Point, ToPoint As Point Sub Clear() Set FromPoint = New Point ToPoint.x = 0 ToPoint.y = 0 End Sub ---- テスト用プログラム ---- Sub test() Dim a As New Point, b As New Point, c As New Line a.x = 1 a.y = 2 b.x = 3 b.y = 4 Set c.FromPoint = a Set c.ToPoint = b c.Clear End Sub -------- 以上のプログラムにおいて test を実行すると c.Clear を実行したとき a の内容は変化しませんが b の内容は変化してしまいます。 これは Clearメソッドにおいて FromPoint のように新しいオブジェクトで設定するか、ToPoint のようにオブジェクトはそのままで内容を変更するかの違いです。 メソッドの作り方としてはどちらの方法を採用すべきでしょうか。 Class を使う側からすれば、各Classごとに副作用が異なるのは困るので同じ基準でメソッドを作りたいのですが。 一般的にはメソッドを実行するたびに新しいオブジェクトを作るわけではないので(上記の例でいえば Clearメソッドで新しい Lineオブジェクトを作成するわけではない)下位レベルのオブジェクトについても新たにオブジェクトを作らないほうが考え方が統一されてよいとは思いますが。 しかし、下位レベルのオブジェクトを Nothing にする場合などはどうしても動作が異なってしまうので、どうすべきか混乱しています。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- MARU4812
- ベストアンサー率43% (196/452)
目的が違うなら両方作ればいいじゃない。
- ap_2
- ベストアンサー率64% (70/109)
> メソッドの作り方としてはどちらの方法を採用すべきでしょうか。 新しいオブジェクトの方で。 メソッドの処理対象は、指定がなければ、基本的に自分自身です。 Line.Clearなら、Lineを完全にClearなのだろうと予想します。なので、xyだけ0クリアなんてセコイことせず、Pointオブジェクトを根こそぎ(toPoint = nothing か = New Point)イッちゃってください。 あるいはメソッド名で明示。Line.ClearXYなら、xyだけと分かります。 ただ、そもそも「ClearされたLine」ってのがイメージできません。 ・両端の点がNothing状態の線 → そんな状態の線が存在してよいのか? ・(0,0)(0,0)の線 → 初期値は線の種類によって違うのでは? よく分からない状態に戻すのはどうなんでしょう・・・ .Init(x1, y1, x2, y2)のようなメソッドをオススメしたいです。 オブジェクトの姿や動きは直感的に分かるのが理想です。 細かい部分はユーザ側(標準Module)で関数を実装してもいいんですから、クラス側は「どうあるべきか」重視で、シンプルに作るのがいいと思います。
補足
回答して頂きありがとうございます。 Line.Clear は単なる例なので、実用上のことであまり突っ込まないでください(笑) > オブジェクトの姿や動きは直感的に分かるのが理想です。 全くその通りなのですが、そこで迷ってしまうのです。 例えば、オブジェクトの一部に画像を含む場合、その画像に直線を付け加えるメソッドの時は、新たな画像オブジェクトを作成せず、画像を直接変更したほうが自然に思えます。 しかし、その画像全体を変更してしまう場合、例えば画像を2値化するメソッドは、新たな画像オブジェクトを作成したほうが自然に思えるのです。 ただ、そうすると画像を変更するメソッドの種類によって副作用が異なってしまうので、それも問題かなと思うわけです。
補足
回答していただき、ありがとうございます。 > 目的が違うなら両方作ればいいじゃない。 Classを作る人と使う人が同じであれば、好きなように作ればいいと思いますが。 目的が違うというより、副作用が異なることが問題だと思っています。 使う人から見れば、副作用は目的ではないので、どちらでもいいのですが、ただ統一されていないと困るのではないでしょうか。