i有一个程序(用户界面(,可以从5个不同的节点中收集数据,并在接收到的数据上执行过滤(移动平均,winsormean,模式和许多其他过滤器(。整个程序都是使用3个类设计的
-
类#1:
SerialComm
类提供读写方法只有一个串行端口与所有节点都与物理连接在一起。 -
类#2:
StatusBar
类提供更新用户的状态栏接口(错误消息,确认密钥的用户操作按(。 -
类#3:
Node
类保存5个节点中的每个数据,使用各种过滤技术。
串行端口可以具有一个实例,但是每个节点实例都需要将此实例用于get_data()
。同样,StatusBar
也只有一个,目前我将SerialComm
和StatusBar
的实例传递给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)
这种方法很好。构造函数的全部要点是,您必须为其提供最小参数数量,以便在实例化后可以起作用。如果您的节点依赖于状态栏实例,则应将其传递给每个节点。
这使您可以灵活地在不同关系中具有多个节点,状态栏和串行对象。这对于模拟和单位测试尤其重要。不要诱使使用某种全局黑客,例如使用单例或静态变量作为单例。这些很快变得很难测试。