我只是想改进我在Python中的OO用法,对合成很感兴趣。在
例如,你有以下几类:
Class Breakfast(object):
__init__(self, eggs):
self.eggs = eggs
@property
def yolk(self):
return eggs.yolk
@property
def yolk_colour(self):
return eggs.yolk.colour
OR
return.eggs.yolk_colour
Class Eggs(object):
__init__(self, yolk):
self.yolk = yolk
@property
def yolk_colour(self):
return self.yolk.colour
Class Yolk(object):
__init__(self, colour):
self.colour = colour
并初始化它们
^{pr2}$当你想接触蛋黄时,是不是最好用链子锁起来
bkfast.eggs.yolk
或者通过一个酒店访问它
bkfast.yolk
第二个版本直接使用较少的链接,尽管仍在幕后进行。而第一个告诉你到底发生了什么。有没有更好的方法?在
编辑:我加入了蛋黄的属性,它有颜色。如果你想从早餐中获得这种颜色,那么最好是拥有一种称为鸡蛋属性的早餐属性,还是直接接触蛋黄本身?或者说它在幕后并不重要?在
精心设计的课程在某种程度上使问题变得复杂起来。这在某种程度上取决于您要做什么,或者具体地说,您正在使用的对象图是如何定义的。从}是不自然的……你不太可能直接跳到早餐总量中的蛋黄孩子身上。在
breakfast
跳到{在这种情况下,合同很可能是早餐会提供
egg
对象,因此您将返回,然后在需要时从那里获取蛋黄(但这只涉及egg
对象…breakfast
不再关心。在如果出于某种原因,你确实想一直抓住蛋黄,那么你应该使用委托。你永远不希望你的客户机代码比它必须或应该关心的更多(上面的德米特法则),你永远不想有任何东西,除了定义和管理的API泄漏到客户端代码。在
一个更合理的例子是假设你早餐时有不同形式的鸡蛋,因此鸡蛋可能来自盘子,或者一个小的煮鸡蛋架,或者来自一个玻璃“岩石”风格。在这种情况下,客户机代码仍然只需要鸡蛋,所以您需要使用委托,并从适当的盘子、支架或玻璃孩子中取出鸡蛋。
它可以归结为定义您向客户机代码公开的内容,并确保任何行李或实现细节都由接收对象处理和抽象。你总是想根据你所交付的东西而不是它的来源来工作。在
来自The Zen of Python
对我来说,这意味着你的例子没有具体问题就没有意义。如果你需要作曲,那就作曲吧。如果你不需要,就不用了。想想你的界面的意义,保持它的简单和明确。在
总之,早餐的蛋黄是关于什么的?在
在我看来,对于这个特定的例子,最好通过属性
bkfast.yolk
来访问它,因为这样您就可以自由地更改yolk的底层实现。在相关问题 更多 >
编程相关推荐