在我的程序中,我画了一些四边形。我想为它们添加功能以扩展,然后向下,然后回到静态(引起注意)。在我的四边形中:
self.scale = 10
根据罪恶改变规模会很好。但是为我已经臃肿的四级增加频率,幅度和逻辑是我要避免的挑战。
这样的事情:
class mysin:
def __init__(self):
self.tick = 0.0
self.freq = 1.0
self.ampl = 1.0
def update(self, amount):
self.tick += amount
def value(self):
return math.sin(self.tick)
该类还将自己添加到逻辑系统(每帧获取更新调用)。然后我会这样做:
quad.scale = 10 # for static quad
quad.scale = mysin() # for cool scaling quad
问题在于某些计算期望比例保持一个值。我当然可以添加另一个类,其中value()返回一个(先前保存的)常量值并调整所有计算。
我现在想知道的是......这有一个名字吗,这是一种有效的技巧吗?我阅读了关于函数式编程的wiki文章,这个想法作为一个古怪的实现而浮现在脑海中(虽然我不确定它是否有资格作为FP)。我很可能被那篇文章吓到了。让我回到编码员的位置。
答案 0 :(得分:4)
区别
quad.scale= 10
和
quad.scale= MySin()
是次要的。在Quad
类定义中,“scale”属性可以是具有正确getter和setter函数的属性。
class Quad( object ):
@property
def scale( self ):
return self._scale
@scale.setter
def set_scale( self, value ):
# handle numeric and MySin() values appropriately.
具有显式property
功能的替代版本(我更喜欢)。
class Quad( object ):
def get_scale( self ):
return self._scale
def set_scale( self, value )
# Handle numeric and MySin() values
scale = property( get_scale, set_scale )
任何其他类都不应该知道或关心scale
具有什么类型的值。如果某个客户端这样做
quad.scale * 2
然后你有设计问题。您没有正确封装您的设计,Quad的客户端类对Quad非常友好。
如果你绝对必须这样做 - 因为你不能编写Quad的方法函数来封装它 - 那么你必须使MySin
成为一个合适的数字类,以便它可以响应{{1}请求正确。
答案 1 :(得分:1)
听起来你想要你的四边形是愚蠢的,并且拥有一个聪明的动画师课程。所以,这里有一些建议:
scale
以及其他任何内容)。Animator
课程中,在帧更新时,根据该属性迭代您的四边形,并决定如何对待每一个。这种方法的一个优点是它允许你在动画师中保持逻辑的同时改变不同的属性(比例,不透明度,填充颜色......你的名字)。
答案 2 :(得分:0)
有点像lazy-evaluation。如果使用得当,它绝对是一个有效的技术,但我认为这不是正确使用它的地方。它使代码变得混乱。
答案 3 :(得分:0)
这肯定是一种有效的技术,但一个名字?有一个object.value()而不是一个int?嗯。面向对象? :)
如果使用此值的方法需要一个整数,并且不会调用任何方法,您实际上可以创建自己的整数类,其行为与整数完全相同,但会更改该值。