我有一个程序(用户界面)来收集来自5个不同节点的数据,并对接收到的数据执行过滤(移动平均,winsormean,模式和许多其他过滤器)。整个程序使用3个类
设计 Class#1:SerialComm
类提供读写方法
只有一个串口,所有节点都是物理连接的。
Class#2:StatusBar
类提供更新用户的状态栏
接口(错误消息,确认密钥的用户操作
印刷中)。
第3课:Node
类保存5个节点中每个节点的数据
通过串行接口收集的数据使用各种后处理
过滤技术。
串行端口可以有一个实例,但每个节点实例都需要将此实例用于get_data()
。同样地,StatusBar
也只有一个,目前我正在将SerialComm
和StatusBar
的实例传递给5个节点的每个实例,如下所示。
我不喜欢这种将实例传递给每个对象的方法,有没有更好的方法来处理它?</ strong>
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)
答案 0 :(得分:1)
这种方法很好。构造函数的重点是必须为它提供最少数量的参数,以便它可以在实例化后运行。如果您的节点依赖于状态栏实例,那么您应该将其传递给每个节点。
这使您可以灵活地在不同的关系中拥有多个节点,StatusBars和SerialComm对象。这对于模拟和单元测试尤为重要。不要试图使用某种全局黑客,比如使用单例或静态变量作为单例。那些很快就变得非常难以测试。