python - Good design for arguments that relate to a single configuration -
suppose have class represents box:
class box: pass it's constructor may take arguments represent object, example length, width , height:
class box: def __init__(self, length, width, height): self.length = length self.width = width self.height = height now want add possibility add shadow box, has optional, suppose shadow can described shadowcolor , shadowstrength. there 3 ways how add arguments describe shadow constructor:
class box: def __init__(self, ..., drop_shadow=false, shadowcolor=none, shadowstrength=none): if drop_shadow: pass this explicit way, drop_shadow here bit redundant, because can check if shadowcolor , shadowstrength not none , set shadow box:
class box: def __init__(self, ..., shadowcolor=none, shadowstrength=none): if shadowcolor , shadowstrength: pass we dropped redundant argument possibility of adding shadow more implicit.
another approach have single argument - shadow tuple of 2 arguments, first 1 shadowcolor , other shadowstrength:
class box: def __init__(self, ..., shadow=none): self.shadowcolor = shadow[0] self.shadowstrength = shadow[1] now have single argument, level of implicitly higher.
i care because used in opensource package , want make make usage of class easy possible.
how recommend deal sort of 'in-constructor' configuration of object?
have function accept dictionary of params. example
create:
parameters = {"dropshadow": true, "shadowcolor": "#019201"} pass through
def __init__(self, length, width, height, params): self.length = length self.width = width self.height = height key, value in params.items(): if key == "dropshadow": self.dropshadow = value elif key == "shadowcolor" self.shadowcolor = value if don't want use hardcoded string (which wouldn't suggest) create shape model class defines of properties static variables. example
class shapemodel: drop_shadow = "dropshadow" shadow_color = "shadowcolor" then replace above code
def __init__(self, length, width, height, params): self.length = length self.width = width self.height = height key, value in params.items(): if key == shapemodel.drop_shadow: self.dropshadow = value elif key == shapemodel.shadow_color: self.shadowcolor = value
Comments
Post a Comment