OOP:与其他类(过滤)的多个实例共享类(硬件端口)的实例(硬件端口)



i有一个程序(用户界面(,可以从5个不同的节点中收集数据,并在接收到的数据上执行过滤(移动平均,winsormean,模式和许多其他过滤器(。整个程序都是使用3个类设计的

  • 类#1:SerialComm类提供读写方法只有一个串行端口与所有节点都与物理连接在一起。

  • 类#2:StatusBar类提供更新用户的状态栏接口(错误消息,确认密钥的用户操作按(。

  • 类#3:Node类保存5个节点中的每个数据,使用各种过滤技术。

串行端口可以具有一个实例,但是每个节点实例都需要将此实例用于get_data()。同样,StatusBar也只有一个,目前我将SerialCommStatusBar的实例传递给5个节点的每个实例,如下所示。

我不喜欢将实例传递给每个对象的方法,是否有更好的处理方法?

class StatusBar:
   def __init__(self):
      self.status_message = 'none'
   def get_status_msg(self):
      return self.status_message
   def update_status_msg(self, msg):
      self.status_message = msg

class SerialComm:
   def __init__(self, portnum, obj_statusbar, baud=19200):
     # More code follows
     self._portNumber = portnum
     self.statusMsg = obj_statusbar
     try:
        self._portInstance = serial.Serial(self._portNumber,baud, timeout=0.05)
     except IOError, e:
        print e
   def write_bytes(self,len):
     # Write method
   def read_bytes(self,len):
     # read method
class Node:
   def __init__(self,obj_statusbar, obj_comm, n_address, n_location=0, ref_rssi=-50,
                n_color=(255,255,0)):
     self._address= n_address
     self._location=n_location
     self._status_bar =obj_statusbar
     self._comm_port = obj_comm
   def read_sensor(self):          
        if(  self._comm_port.read_bytes(10) != "112233445566778899AA"):
               self._status_bar.update_status_msg(" Data out of boundary")  
     ...
     # More code follows
status_bar = StatusBar()
comm_interface = SerialComm('COM4', status_bar, 19200)
Node_1 = Node(status_bar,comm_interface,0x9,Point(0, 0),-57,RED)
Node_2 = Node(status_bar,comm_interface,0xA,Point(2, 0),-57,GREEN)
Node_3 = Node(status_bar,comm_interface,0xB,Point(1, 2),-57,BLUE)
Node_4 = Node(status_bar,comm_interface,0xC,Point(1, 3),-57,ORANGE)
Node_5 = Node(status_bar,comm_interface,0xD,Point(1, 0),-57,BPINK)

这种方法很好。构造函数的全部要点是,您必须为其提供最小参数数量,以便在实例化后可以起作用。如果您的节点依赖于状态栏实例,则应将其传递给每个节点。

这使您可以灵活地在不同关系中具有多个节点,状态栏和串行对象。这对于模拟和单位测试尤其重要。不要诱使使用某种全局黑客,例如使用单例或静态变量作为单例。这些很快变得很难测试。

最新更新