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

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

ただいまの
回答率

90.61%

  • オブジェクト

    91questions

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

  • 命名規則

    35questions

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

  • インターフェース

    26questions

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

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

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 247

siic

score 17

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

class A():
    def __init__(self, x, y, z):
        self.x, self.y, self.z = x, y, z
    def set_by_b(self, b):
        b.set_a_props(self.y, self.z)

class B():
    def __init__(self, o):
        self.o = o
        self.y = 0
        self.z = 0
    def set_a_props(self, y, z):
        self.y = y
        self.z = z

def main():
    a = A(100, 200, 300)
    b = B(95)
    a.set_by_b(b)

if __name__ == '__main__':
    main()

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

checkベストアンサー

+1

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 18:54

    tetatailのバグですねー

    キャンセル

  • 2018/04/19 02:20

    コメントもらわなきゃ気が付きませんでした。
    ありがとうございます。

    あぁ~。書き直そうかな削除依頼しようかな。

    キャンセル

  • 2018/04/19 06:36

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

    キャンセル

  • 2018/04/19 07:15

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

    キャンセル

+1

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/18 08:25

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

    キャンセル

  • 2018/04/18 08:26

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

    キャンセル

+1

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/19 00:29

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

    キャンセル

0

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

class A():
    def __init__(self, x, y, z):
        self.x, self.y, self.z = x, y, z
    def get_props_for_b(self):
        return (self.y, self.z)

class B():
    def __init__(self, o):
        self.o = o
        self.y = 0
        self.z = 0
    def set_a_props(self, y, z):
        self.y = y
        self.z = z

def main():
    a = A(100, 200, 300)
    b = B(95)
    b.set_a_props(*a.get_props_for_b())

if __name__ == '__main__':
    main()

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • オブジェクト

    91questions

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

  • 命名規則

    35questions

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

  • インターフェース

    26questions

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