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

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

新規登録して質問してみよう
ただいま回答率
85.37%
設計相談

システムの設計についての相談や質問を投稿する際にご使用ください。

Q&A

解決済

3回答

390閲覧

OOPでメソッドへパラメータ受渡しに引数とプロパティのどちらを使うか

nannoobje

総合スコア1

設計相談

システムの設計についての相談や質問を投稿する際にご使用ください。

0グッド

0クリップ

投稿2024/06/15 10:14

日頃メソッドを作るとき、パラメータがプロパティに存在するものはメンバを参照、そうでない場合は引数を追加するというような規則でコードを書いていますが、これってベストプラクティスなんでしょうか?

私としては、ユーザが必要最小の単位でパラメータを渡せれば楽だと、書く側もプロパティで使いまわせれば余計なパラメータの再定義を割けて楽だと、そのように思っていました。

しかし、いっそパラメータを引数に明示することでメソッドの処理が何のデータを要しているかが明確になったり、メソッド単位での単体テストが楽になるかもといった反対の視野もあるのかなと考えてポリシーを決めあぐねてしまいました。

もしそういった、広く共有される知見に沿ってないなら是正したいので質問しました。
特にそういうのがなければ個人的なご意見でも結構です。

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

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

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

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

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

guest

回答3

0

ベストアンサー

プロパティに言及しているということは、なんらかのレシーバ・インスタンスのあるメソッド(所謂staticではない)についての話だと思うのですが
そうすると、インスタンスを生成し、コンストラクタや設定用メソッドを呼び出しインスタンスを初期化/変更して、その後インスタンスに対して、目的の処理を行うための(場合によっては繰り返してや複数の)メソッドを呼ぶことになります。

この際、一連の/繰り返しの処理を通じて同一の値であるべきようなものは、インスタンスの設定/状態としてプロパティなどで実現するべきです。
そうではなく、たまたま複数の処理で同じ値を使っているだけのものであれば、一般的には引数で呼び出しごとに渡します。

また、引数の使いまわしが多いが状態として持たせるべきでない…という場合は引数用クラスの導入なども検討します。
(全体的に引数オブジェクトとしたり、一部だけをオプション引数として使いまわしたりなど)

2024/06/19 追記

おおよそ同じような認識

とコメントで言われていますが、こちらの意図と食い違っていたので補足しておきます。

質問としては「プロパティだと使いまわせて呼び出し側が楽」という方針だと思われます。

回答としては「正しいかどうかで使い分けるべき」という別の方針で

  • 一連の処理を通じて同一の値であるべきならプロパティなどで実現するべき
  • たまたま同じ値ならば全て引数で

と回答しています。

(この辺りは私の回答が言葉不足だったかもしれません)

「楽かどうか」という判断基準は、実際のところ「呼び出し側のコード」に依存してそのたびに結果が変わる可能性があります。
1回しか呼び出ししないものは全て引数でよいですし、複数回の呼び出しがあれば「たまたま同じ箇所」を共通化したくなります。

ですが、常に「正しいかどうか」で判断するとなると
例え1回しか呼び出ししないものであっても、「どうあるべきか」で考えて結果的にプロパティにする場合もありえます。
そうすると1回しか呼び出さないにも関わらずわざわざコンストラクタやsetterを用いるものと引数で渡すものを分けるため、
むしろ呼び出し側やテストが煩雑になることすらありえます。
(私はどちらかといえば、そちらの方が望ましいと考えています)

投稿2024/06/15 15:41

編集2024/06/18 16:24
pecmm

総合スコア647

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

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

nannoobje

2024/06/16 10:33

詳しいご意見をありがとうございました。おおよそ同じような認識でしたのでa安心いたしました。
pecmm

2024/06/18 16:25

解決済みになってますが、ちょっと気になったので追記しました。
nannoobje

2024/06/18 17:29

私の表現の足りないところかと思いますが、状態が不変であるか、という観点による設計の分岐は共感しますので同じような考えかと思いました。 最後の段落は「現状はたまたま不変だが、変更や拡張次第で異なるパラメータを取りうる」という将来性を加味した話であると推量いたします。 真摯なご返信ありがとうございます。
guest

0

場合 でしょう
1,2のプロパティしか必要ないなら それを渡すのもありですが、10個使う とかになるとメンバー渡しのほうがよいかと

依存、結合しすぎじゃねーの?
とか
メンバーの方のmethodじゃねーの
とかの声もありますが

投稿2024/06/15 12:21

winterboum

総合スコア23549

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

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

0

そこが気になるのは一つのクラスに機能を持たせすぎなのでは…。

投稿2024/06/16 01:24

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問