将服务作为构造函数中的参数传递或在每个类方法中传递它会更好吗?

时间:2015-02-25 15:51:40

标签: python unit-testing oop object-oriented-analysis

from government.powerSupply import power

案例1 :服务对象应该在类的构造函数中初始化,并且始终可以使用同样的能量

class Home(object):
    def __init__(self, rooms=4, people=2, services=None):
        self._services = services or power.Service()
        self.connectionType = 2 # MeghaWatts
        self.roomLights = {1:False, 2:False: 3: False, 4: False}

    def turnLightsOn(self, room=None, all=False):
        voltage = self._services.voltage()
        if all:
            for light, _ in self.roomLights.iteritems():
                    self.roomLights[light] = True
            return True
        else:
            if room:
                    self.roomLights[room]
                    return True

案例2 应该这样做,外面调用的函数应该有传递服务的选项,因此可以为打开灯的房间提供不同的电量。

class Home(object):
    def __init__(self, rooms=4, people=2, services=None):
        self._services = services or power.Service()
        self.connectionType = 2 # MeghaWatts
        self.roomLights = {1:False, 2:False: 3: False, 4: False}

    def turnLightsOn(self, room=None, all=False, services=None):
        # in this case service can be passed from outside when call to         
        # turnLights on is made, and service can have different voltage input 
        self._services = services or self._services
        voltage = self._services.voltage()
        if all:
            for light, _ in self.roomLights.iteritems():
                    self.roomLights[light] = True
            return True
        else:
            if room:
                    self.roomLights[room]
                    return True

今天,我正在努力在办公室更新Unittest,并发现案例2 很方便。因为在我的情况下,服务可以包含不同数量的电源电压以及多个服务,即浴室可能有​​电力服务或供水服务!!

1 个答案:

答案 0 :(得分:0)

考虑以下参数:

  1. 如果您完全确定在services主对象初始化后Home永远不会改变,那么您应该选择案例1
  2. 如果您不确定services是不可变的,或者即使您确定它可能会被更改,也绝对不会选择案例2
  3. 这里的要点是选择是基于如何处理业务规则中的不同变量。如果on变量永远不会改变,那么就没有理由允许。但是,如果有趣的是这个元素可能会被更改,那么Home用户应该给出这种可能性。您在代码中提供的默认值是一种很好的方法,因为大多数情况可能根本不需要更改此变量。