2016-10-05 4 views
0

BasketItemという2つのクラスがあるとします。各バスケットにはアイテムのリストが含まれています。私はバスケットにアイテムのidを保管するか、直接アイテムオブジェクトを保管することができます。どちらが最善の解決策であり、なぜ(メモリ使用量、コビネスなどの面で)?OOP:異なるクラスのオブジェクト間の関係をコード化する最良の方法

CASE

class Basket(object): 

    def __init__(self, basket_name): 
     self._name = basket_name 
     self._items = [] 


    def add_item(self, item_id) 
     self._items.append(item_id) 


class Item(object): 

    def __init__(self, item_id): 
     self._id= item_id 

>>> b = Basket('My_Basket') 
>>> i1 = Item(1) 
>>> i2 = Item(2) 
>>> b.add_item(1) 
>>> b.add_item(2) 

CASEのB

class Basket(object): 

    def __init__(self, basket_name): 
     self._name = basket_name 
     self._items = [] 


    def add_item(self, item) 
     self._items.append(item) 


class Item(object): 

    def __init__(self, item_id): 
     self._id= item_id 


>>> b = Basket('My_Basket') 
>>> i1 = Item(1) 
>>> i2 = Item(2) 
>>> b.add_item(i1) 
>>> b.add_item(i2) 
+2

私はケースBを好むでしょう。そうでなければ、誰が仕事をしているのですか?それらのIDでオブジェクトをルックアップするためのデータベースとして機能する他のクラスを維持しなければならないのですか?オブジェクトとしてオブジェクトを渡すことは意味的に意味があります。この場合、 'Basket'に' Item'を置くことは、別のレベルの間接指定を追加するよりも「オブジェクト指向」です。 – CoryKramer

+2

コードサンプルは同等ではありません。スニペットAで 'Basket'インスタンスを持つ' Item'インスタンスにアクセスする方法はありませんが、スニペットBでも可能です。 –

+2

Pythonのすべての変数は参照であり、スペースの使用について心配することなくオブジェクトを直接格納できます。納得のいかんについては、あなたの必要がすべてです。 –

答えて

3

あなたが直接アイテムを保存する必要があります。前述したように、リソースの問題はなく、バスケットにアイテムに直接アクセスできます。バスケットの重量がどれくらいあるか知りたいとします。あなたのitemsクラスに.weightメソッドを追加すると、あなたのバスケットに含まれているすべてのアイテムを反復処理し、それらの重量を返すことができます。

1

私はIDでなくオブジェクトを格納することをお勧めします。あなたがあなたのアイテムで何かをしなければならないたびに、何らかの形でこのオブジェクトをIDで取得/ロードする必要があるからです。しかし、これは一般的なケースです。

アイテムがたくさんあり、フルリストで操作されていない場合(たとえば、バスケットは、フルコレクションではなく単一のオブジェクトに対してのみアクションを実行します)、IDのみを保存することができます。

1

通常はオプションBが最適なオプションです。これは、オブジェクト指向プログラミングが機能するためです。オブジェクトを直接使用しているため、コード内でオブジェクトに直接アクセスすることもできます。リンクオプションを使用した場合、特定のItemにアクセスするには、そのオブジェクトを見つけるために何らかの種類のクエリを実行する必要があります。 Pythonが本質的に何をしているのかを直接オブジェクトを使用すると、そのリンクが作成されます。オブジェクトは2回コピーされるのではなく、Basketオブジェクト内の_itemsリストで参照されます。

あなたは、そのIDを見つける必要がないでしょうので、また、

def __init__(self, item_id): 
    self._id= item_id 

self._id= item_idが必要とされないであろう、ひいては:

>>>i1 = Item(1) 
>>>i2 = Item(2) 

は単純になる:

>>> i1 = Item() 
>>> i2 = Item() 
1

すべてはPythonでオブジェクトですが、他のオブジェクトのIDとして使用される整数も含まれます。したがって、ケースAとケースBの両方で、オブジェクトへの参照をBasket._itemsリストに追加しています。

AとBの違いは何ですか? IDだけを保存すれば、元のオブジェクトをどのように参照しますか?それらが名前空間に存在することを保証することは難しいです。 itemインスタンスからプロパティをルックアップするコードは、そのトラップに入る可能性があります。

関連する問題