質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

3回答

260閲覧

例に示すパターンのとき、メソッドをコールすべき適切な場所はどこでしょうか?

mikupedia

総合スコア159

VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

1クリップ

投稿2018/01/24 01:26

###前提・実現したいこと
お世話になります。
クラスZのメソッドに引数を与えてデータを取得してクラスAのDataプロパティを更新したいです。
クラスZのGetDataMethodをコールするにはクラスBのNumberプロパティとValueプロパティとクラスAのCodeプロパティの値が必要になります。
クラスBではクラスAのリストを持ちクラスAのCodeは変更されません。
NumberまたはValueが変更されたタイミングでクラスAのDataプロパティを更新する感じです。

私はパターン①、パターン②の方法を考えました。
この場合、どちらが適切なのかまた別の方法があれば教えてください。

※コードはVBで記載しましたが言語は問いません。

###該当のソースコード

VB.net

1 Public Class Z 2 Public Shared Function GetDataMethod(code As String, number As Integer, value As Integer) As Object 3 Return Nothing 4 End Function 5 End Class 6 7 Public Class A 8 Public ReadOnly Property Code As String 9 Public Property Data As Object 10 Public Sub New(code As String) 11 Me.Code = code 12 End Sub 13 Public Sub GetDataMethod(number As Integer, value As Integer) 14 'パターン① 15 Data = Z.GetDataMethod(Code, number, value) 16 End Sub 17 End Class 18 19 Public Class B 20 Public Property Number As Integer 21 Public Property Value As Integer 22 Public Property Items As List(Of A) 23 Public Sub GetDataMethod() 24 For Each Item In Items 25 'パターン① 26 Item.GetDataMethod(Number, Value) 27 'パターン② 28 Item.Data = Z.GetDataMethod(Item.Code, Number, Value) 29 Next 30 End Sub 31 End Class

###補足情報(言語/FW/ツール等のバージョンなど)
Microsoft Visual Studio 2015 Community(VB)
.Net Framework 4.7

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

このような記事を見つけたため、備忘録的に記載します。
どのメソッドをどのクラスで実装すべきか

この記事では2つのクラスがある場合、
「両方の属性を参照しながら処理するメソッドはどちらのクラスに実装すべきなのか?」
という問いの答えが記載されています。

原則は以下の2つ
・ヘッダと明細のような上下関係がクラスにある場合、必要な属性の最上位に当たるクラスのメソッドとする
・クラスの関係が対等または並列である場合、第3のクラスを作ってそのメソッドとする(Mediatorパターンの利用)

今回私が疑問に思っていたことは1つ目の原則に当たりそうです。
よって、Zuishin様とozwk様のご指摘通り、パターン②のクラスBにメソッドを実装するほうが良いようです。

投稿2018/01/25 01:26

mikupedia

総合スコア159

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

クラスZをなくしてAのメソッドにします。

VB

1Public Class B 2 Public Property Number As Integer 3 Public Property Value As Integer 4 Public Property Items As List(Of A) 5 Public Sub GetDataMethod() 6 For Each Item In Items 7 Item.Update(Number, Value) 8 Next 9 End Sub 10End Class

投稿2018/01/24 06:47

ozwk

総合スコア13521

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

違いがわかりません。
メリット・デメリットが仮にあるとしてもわずかでしょう。
直すなら A B Z が互いに依存しあっている構造自体を直したいです。

追記

あえて言うならパターン②でしょうか。
余計なメソッドが一つ減ってわずかに読みやすくなります。

投稿2018/01/24 01:32

編集2018/01/24 01:35
Zuishin

総合スコア28660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mikupedia

2018/01/24 06:24

Zuishin 様 早々にご回答していただきありがとうございました。 >直すなら A B Z が互いに依存しあっている構造自体を直したいです。 と回答していただきましたが、その構造に興味があります。 もし面倒でなければコードを記載していただけないでしょうか?
Zuishin

2018/01/24 06:29

与えられた条件だけでは無理です。 コードではなく仕様の問題です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問