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

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

新規登録して質問してみよう
ただいま回答率
85.48%
インターフェース

インターフェイスという用語はハードウェア・ソフトウェアの両方に使うことができます。 一般的に、インターフェイスは内部処理の詳細を見せないように設定されます。オブジェクト指向プログラミングにおいて、インターフェイスはabstractクラスとして定義されます。

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

命名規則

命名規則は、プログラミングする際に識別子の名称である文字列を決める表記法のことです。ネーミング規則・ネーミング規約・命名規約とも呼びます。

Q&A

解決済

4回答

1058閲覧

あるオブジェクトの要素を別のオブジェクトにセットするときのメソッド名や作法

noc

総合スコア73

インターフェース

インターフェイスという用語はハードウェア・ソフトウェアの両方に使うことができます。 一般的に、インターフェイスは内部処理の詳細を見せないように設定されます。オブジェクト指向プログラミングにおいて、インターフェイスはabstractクラスとして定義されます。

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

命名規則

命名規則は、プログラミングする際に識別子の名称である文字列を決める表記法のことです。ネーミング規則・ネーミング規約・命名規約とも呼びます。

0グッド

0クリップ

投稿2018/04/17 23:02

編集2018/04/17 23:21

2種類のオブジェクト a b があって、a の特定のプロパティを b にセットするとき、どうするのが自然でしょうか?
私の現在の案は、まず a に b を渡すメソッド a.set_by_b を用意して、その中で b の b.set_a_props を呼び出し、b にセットしたいプロパティを与えるということです。

python

1class A(): 2 def __init__(self, x, y, z): 3 self.x, self.y, self.z = x, y, z 4 def set_by_b(self, b): 5 b.set_a_props(self.y, self.z) 6 7class B(): 8 def __init__(self, o): 9 self.o = o 10 self.y = 0 11 self.z = 0 12 def set_a_props(self, y, z): 13 self.y = y 14 self.z = z 15 16def main(): 17 a = A(100, 200, 300) 18 b = B(95) 19 a.set_by_b(b) 20 21if __name__ == '__main__': 22 main()

便宜上 a のメソッド名を set_by_b としましたが、実際こういう設計の場合で一般的に使われるメソッド名があるのならそれを使いたいです。
また、この設計はおかしいとか、こうする方が自然という意見がございましたらご指摘いただけたらと存じます。

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

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

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

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

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

guest

回答4

0

ベストアンサー

a,bそれぞれの関係性によると思います。

オブジェクト指向的には、値を渡すというのはあまり良くありません。
aの要素(サンプルの場合y,z)が変化してもbの要素は変更しませんし、逆にbの要素が変更されてもaの要素は変更されません。

これを防ぐために、bは要素としてaを持ち、bのメソッドでaの要素が必要な場合はaのgetterメソッド(またはプロパティ)から都度値を取得する方法があります。

またはaがほとんどbを作るだけに存在する一時的なオブジェクトだとするなら、set_by_bとするのではなく、make_bやcreate_bなどのメソッド(サンプルの場合、引数にoが入る)でオブジェクトを作るという手もあります。

そして、aから一つずつ要素を取り出してbにセットする方法などもあります。

他にも言語によっていろいろなパターンがあると思いますが、実際どのような関係を持ちどのように使われるかが大事でソースコードが一番読みやすくなる方法を選ぶ必要があります。

”場合による”という応えになっていない回答ですが正直なところです。

投稿2018/04/18 05:44

編集2018/04/18 22:14
iwamoto_takaaki

総合スコア2883

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

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

y_waiwai

2018/04/18 09:54

tetatailのバグですねー
iwamoto_takaaki

2018/04/18 17:20

コメントもらわなきゃ気が付きませんでした。 ありがとうございます。 あぁ~。書き直そうかな削除依頼しようかな。
y_waiwai

2018/04/18 21:36

編集ボタン押したら出てきますよw
iwamoto_takaaki

2018/04/18 22:15

サポートありがとうございます。
guest

0

標準のクラスやライブラリでどうやってるのかを見ていって、極力それにあわせるようにする、ということで。

言語が指定されてませんが、言語により作法が違う場合もあったりするので、標準のものにあわせるのがいいかと。

投稿2018/04/17 23:35

y_waiwai

総合スコア87747

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

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

noc

2018/04/18 15:29

ありがとうございます。標準のクラスやライブラリの読み方がよくわかっておらず、そもそもあるオブジェクトの要素の一部を別のオブジェクトにセットするパターンが使われている場所も使われているかどうかも解っていないのですが、そういう状況に心当たりがあるのなら教えていただきたいという趣旨でございます。
guest

0

set_by_b は b によってセットするという意味なので目的語が無く意味不明になっています。
それでも b を使って何かをセットするんだろうと読んでいくと b をセットするのでびっくりします。

またこのコードを読む限り b は a のサブセットになっているので a には x y z プロパティは不要で b を保持または b を継承していればいいように見えます。

投稿2018/04/17 23:12

Zuishin

総合スコア28660

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

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

noc

2018/04/17 23:25

すいません、実際 b は a のサブセットではない、全然別種のものとお考え下さい。 別種のオブジェクトからあるプロパティの値を別のオブジェクトにセットするのにどういうスタイルをとるべきかという話です。
Zuishin

2018/04/17 23:26

この仕様を生かすならメソッド名は私なら set_position_to のように目的語をはっきりさせます。 しかしそれよりも x y z をひとまとめにしたクラスを作って a と b にプロパティとして持たせます。 b が a のサブセットでしかないなら回答本文の通りです。
guest

0

初めの設計が一般的でないとみなして、下記の設計に修正しました。
ab にセットするための要素を返すゲッターを持ち、b にすぐ受け渡すようにしました。
標準的な設計というものに疎いので、これが正しい設計なのかおかしな設計なのかどうか判別がつきません。
ご意見がございましたならおっしゃってください。

python

1class A(): 2 def __init__(self, x, y, z): 3 self.x, self.y, self.z = x, y, z 4 def get_props_for_b(self): 5 return (self.y, self.z) 6 7class B(): 8 def __init__(self, o): 9 self.o = o 10 self.y = 0 11 self.z = 0 12 def set_a_props(self, y, z): 13 self.y = y 14 self.z = z 15 16def main(): 17 a = A(100, 200, 300) 18 b = B(95) 19 b.set_a_props(*a.get_props_for_b()) 20 21if __name__ == '__main__': 22 main()

投稿2018/04/18 15:20

noc

総合スコア73

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問