- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我写了一些代码来使用 pySerial
获取数据,如下所示。
我的类依赖于不符合“松散耦合”规则的串行类。
我应该使用接口(interface)来解耦我的类吗?
非常感谢您的指导。
import serial
class ArduinoConnect:
def __init__(self):
pass
def serial_connect(self, serial_port, serial_baudrate):
self._serial_port = serial_port
try:
self.ser = serial.Serial(
port=self._serial_port,
baudrate=serial_baudrate,
parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_ONE,
bytesize=serial.EIGHTBITS,
)
except serial.serialutil.SerialException, e:
print str(e)
def serial_disconnect(self):
self.ser.close()
def get_quaternion(self, number_of_data=50):
buff = []
self.ser.write('q')
self.ser.write(chr(number_of_data))
for j in range(number_of_data):
in_string = self.ser.readline()
buff_line = in_string.split(",")
buff_line.pop()
buff_line = self.hex_to_quaternion(buff_line)
buff.append(list(buff_line))
return buff
def hex_to_quaternion(self, list_of_hex=None):
#......
pass
arduino = ArduinoConnect()
arduino.serial_connect(serial_port="COM5", serial_baudrate=115200)
print arduino.get_quaternion()
arduino.serial_disconnect()
我按照建议调整了我的代码。
DI有助于分离串行过程,工厂方法有助于封装DI过程。
我还能做些什么来满足“松散耦合”规则吗?
感谢您的帮助。
import serial
class ArduinoConnect:
def __init__(self, serial_to_arduino):
self._serial_to_arduino = serial_to_arduino
def get_quaternion(self, number_of_data=50):
buff = []
self._serial_to_arduino.write('q')
self._serial_to_arduino.write(chr(number_of_data))
for j in range(number_of_data):
in_string = self._serial_to_arduino.readline()
buff_line = in_string.split(",")
buff_line.pop()
buff_line = self.hex_to_quaternion(buff_line)
buff.append(list(buff_line))
return buff
def hex_to_quaternion(self, list_of_hex):
......
def __getattr__(self, attr):
return getattr(self._serial_to_arduino, attr)
class SerialToArduino:
def __init__(self):
pass
def serial_connect(self, serial_port="COM5", serial_baudrate=115200):
self._serial_port = serial_port
try:
self.ser = serial.Serial(
port=self._serial_port,
baudrate=serial_baudrate,
parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_ONE,
bytesize=serial.EIGHTBITS,
)
except serial.serialutil.SerialException, e:
print str(e)
def serial_disconnect(self):
self.ser.close()
def readline(self):
return self.ser.readline()
def write(self, data):
self.ser.write(data=data)
def get_ArduinoConnect():
'factory method'
return ArduinoConnect(serial_to_arduino=SerialToArduino())
arduino = get_ArduinoConnect()
arduino.serial_connect(serial_port="COM5", serial_baudrate=115200)
print arduino.get_quaternion()
arduino.serial_disconnect()
最佳答案
我能想到两种可能的解决方案
做依赖注入(inject),像这样
def serial_connect(self, engine, serial_port, serial_baudrate)
1 的更新:我提到了 http://en.wikipedia.org/wiki/Adapter_pattern当您想将具体实现与抽象分开时,通常会使用它。将其视为旅行插头适配器。
对于像Java这种接口(interface)严格什么都有的语言特别有用。在您的情况下,因为在 Python 中我们没有“接口(interface)”,您可以使用抽象类来模拟它
class AbstractAdapter():
def serial_connect(self, serial_port="COM5", serial_baudrate=115200):
raise("Needs implementation")
# do the same thing for the rest of the methods
然后在 ArduinoConnect
中,您可以检查类型
def __init__(self, serial_to_arduino):
if not isinstance(serial_to_arduino, AbstractAdapter):
raise("Wrong type")
这会强制您的 serial_to_arduino
扩展 AbstractAdapter
,它强制实现所有抽象方法,因此是一个适配器。
这可能不是最“pythonic”的做事方式,但从 OOP 的角度来看,您可以这样做以获得最高级别的松散耦合(在我看来)
P/s:实际上,我认为在这种情况下正确的模式应该是 Strategy,它们在实现方面非常相似,但它们的目的不同。您可以阅读更多有关 Strategy、Proxy、Command、Mediator 等模式的更多信息,这些模式通常用于实现松散耦合
关于python - 在 python 中执行 "loose coupling"的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30230614/
关闭。这个问题是opinion-based .它目前不接受答案。 想改进这个问题?更新问题,以便 editing this post 可以用事实和引用来回答它. 3年前关闭。 Improve this
介绍代码: public interface Course { /** * returns the number of units (hours) a specific course
我正在尝试“耦合”NSWindows。 我的意思是 2 个大小相同、并排放置的 NSWindows。如果我移动其中一个,另一个也必须移动以保持两者并排。 我尝试对子窗口执行此操作,但是当移动子窗口时,
它们矛盾吗? 解耦是一件伟大但很难实现的事情。然而,在大多数应用程序中,我们并不真正需要它,所以我可以设计高度耦合的应用程序,它几乎不会改变任何明显的副作用,例如“你不能分离组件”,“单元测试是痛苦的
#include #include #include #include struct s_A { bool bin; s_A(): bin(0) {} }; class c_A
我正在制作一个简单的 3D CAD 软件。在类图中,许多对象需要通过(x,y,z)来与其他对象区分。我创建了一个所谓的“Position”类,但问题是它看起来高度耦合,因为许多类都与位置一起工作。有什
我喜欢以函数式风格进行编程。但我突然想到,将函数作为参数传递有时可能会在组件之间产生比使用非函数参数传递更强的耦合。 例如,在下面的(人为的)示例中:A、B 和 C 通过 C 的函数参数的输出类型、C
我似乎无法理解“松散耦合”的概念。我认为“松散”这个词通常具有负面含义,这没什么帮助,所以我总是忘记松散耦合是一件好事。 有人可以展示一些“之前”和“之后”代码(或伪代码)来说明这个概念吗? 最佳答案
我在理解低耦合和高内聚这句话时遇到问题。我用谷歌搜索并阅读了很多相关内容,但仍然发现很难理解。 据我了解,高内聚意味着我们应该拥有专门执行特定功能的类。希望这是正确的吗?就像信用卡验证类一样,专门用于
所以我的前端页面需要来自促销、产品、制造商和零售商服务的数据——当然每个数据都包含一个后端 API 我应该... A) 在前端(对每个服务)进行 4 个单独的调用以从 4 个位置获取数据? 或者 B)
好的,我不确定耦合是否真正描述了我的问题。问题是,我正在创建自己的基于食人魔的 3d 游戏引擎。我也在使用物理库 PhysX,但由于我需要在我的主引擎代码和 PhysX 之间创建一个抽象层——以防万一
我有一个 GUI,它根据 slider 值向 Web 服务器发出命令。其中一些 slider 在 Web 服务器上“耦合”,因此更改其中一个可能也会更改另一个。耦合是通过网络服务器返回一个值列表来完成
我在我的项目中实现了一个工厂,最近有人建议我在我的类上使用属性,这样工厂就可以确定要实例化和传回哪个类。我是开发领域的新手,并试图严格遵循松耦合规则,我想知道依赖“钩子(Hook)”(作为属性)是否违
情侣数据库配置文件录入,这将是保存数据的最佳方式。此外,数据将通过 php 编码检索,如果可以使用一个理想的查询代码将其关闭。 在 site_member 表中为每个字段创建多个字段...例如:m_f
我在我的应用程序中遇到用户唯一性对的问题... 我有用户女巫可以链接到一些联系人。我使用关系表来做我的链接(女巫也有一个级别属性 - 用于不同级别的关系) 所以我有用户、联系人和关系。我的问题是这对
在使用元类崩溃后,我深入研究了 Python 中的元编程主题,我有几个问题,恕我直言,可用文档中没有明确回答。 在元类中同时使用 __new__ 和 __init__ 时,它们的参数必须定义相同吗?
dismissViewControllerAnimated:completion: 在我的应用程序中工作正常,除了解雇之间的延迟。 [api loginWithUsername:[dict objec
你能给我解释一下下面的短语(摘自 an answer to Stack Overflow question What are the differences between Deferred, Pro
我正在开发一个 WordPress 插件,并努力确保最佳实践。我有两个类,我的插件类“Jargonaut”是必需的,然后是另一个名为“Dictionary”的类,它随 require_once() 包
早在 12 月,就有 this post答案是“可以使用具体类型 [用于简单对象]”。 但是我不断在示例项目中看到越来越多的带有接口(interface)的简单实体,甚至是我刚刚控制的非常大的企业应用
我是一名优秀的程序员,十分优秀!