2017-08-15 50 views
0

假设我们有一个表示盒的类:好的设计为参数,涉及到单个配置

class Box: 
    pass 

它的构造可以采取一些参数,其表示对象,例如长度,宽度和高度:

class Box: 

    def __init__(self, length, width, height): 
     self.length = length 
     self.width = width 
     self.height = height 

现在,我想补充的可能性增加阴影的框,但它必须是可选的,假设阴影可以shadowcolorshadowstrength描述。有3种方式如何添加参数描述阴影的构造器:

class Box: 

    def __init__(self, ..., drop_shadow=False, shadowcolor=None, shadowstrength=None): 
     if drop_shadow: 
      pass 

这是最明确的方式,但drop_shadow这里是有点多余,因为我们可以只检查是否shadowcolorshadowstrengthNone和将阴影设置为框:

class Box: 

    def __init__(self, ..., shadowcolor=None, shadowstrength=None): 
     if shadowcolor and shadowstrength: 
      pass 

我们放弃了一个冗余参数,但现在添加阴影的可能性更加隐含。

另一种方法是有一个参数 - shadow那就是2个参数的元组,其中第一个是shadowcolor,另一个是shadowstrength

class Box: 

    def __init__(self, ..., shadow=None): 
     self.shadowcolor = shadow[0] 
     self.shadowstrength = shadow[1] 

现在我们有一个说法,但含蓄程度甚至更高。

我非常关心这个,因为这将被用在开源包中,并且我想尽可能地使用一个类。

你会如何推荐处理这种“in-constructor”配置的另一个对象?

+0

这上面的代码可能是[代码审查](https://codereview.stackexchange.com/)一个更好的问题。 – cole

+0

你有python3吗? – shockawave123

+0

@ shockawave123是的 – pythad

回答

1

让你的函数接受所有参数的字典。例如

创建:通过

def __init__(self, length, width, height, params): 
     self.length = length 
     self.width = width 
     self.height = height 

     for key, value in params.items(): 
      if key == "dropShadow": 
      self.dropShadow = value 
      elif key == "shadowColor" 
      self.shadowColor = value 

如果你不希望使用硬编码字符串(我不建议)

parameters = {"dropShadow": true, "shadowColor": "#019201"} 

通行证然后创建一个形状模型类将所有属性定义为静态变量。例如

class ShapeModel: 
    DROP_SHADOW = "dropShadow" 
    SHADOW_COLOR = "shadowColor" 

然后替换

 def __init__(self, length, width, height, params): 
     self.length = length 
     self.width = width 
     self.height = height 

     for key, value in params.items(): 
      if key == ShapeModel.DROP_SHADOW: 
      self.dropShadow = value 
      elif key == ShapeModel.SHADOW_COLOR: 
      self.shadowColor = value 
+0

好主意,会考虑如果。 想要提及的是,没有必要循环字典,你可以访问元素'getattr(params,'key',None)' – pythad

+0

ahh cool!不知道。我会更新我的答案。 – shockawave123

+0

不幸的是我无法更新答案,但我明天就可以做到。我很抱歉。随意编辑它,如果你想。 @pythad – shockawave123