- 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/
介绍代码: public interface Course { /** * returns the number of units (hours) a specific course
我正在制作一个简单的 3D CAD 软件。在类图中,许多对象需要通过(x,y,z)来与其他对象区分。我创建了一个所谓的“Position”类,但问题是它看起来高度耦合,因为许多类都与位置一起工作。有什
我有一长串汽车广告标题和另一个所有汽车品牌和型号的列表,我正在搜索标题以在品牌/型号列表中找到匹配项。到目前为止我有这个: for make in carmakes: if m
我有一个网络服务,它为我提供生成的 .resx(仅限 XML),然后我将其转换为二进制 .resources 文件。我目前正在使用 al.exe 生成一个程序集文件。这是我的论点: /t:lib /c
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: What is “loose coupling?” Please provide examples. 是什么
我一直在尝试使用 WPF 并在网络浏览器中呈现严格的 XAML 标记,也称为松散 XAML(解释 here 和 here)。 我觉得它最适合显示静态内容。但是,似乎也可以绑定(bind)到 XML 数
每当我从我的 Remote 中 pull 出时,我都会收到以下关于压缩的错误。当我运行手动压缩时,我得到了相同的结果: $ git gc error: Could not read 381378312
Git的 fsck doc谈论“悬空”对象,而 the gc doc只谈论“松散的物体”。有严格的划分。 但是在浏览一些相关的 SO 帖子时,这些术语似乎可以互换使用。在 Git Book v2还有
我想创建一个具有以下形状的 Redux 存储: store = { loaded: Boolean, loading: Boolean, view: Object, // uses com
我似乎无法理解“松散耦合”的概念。我认为“松散”这个词通常具有负面含义,这没什么帮助,所以我总是忘记松散耦合是一件好事。 有人可以展示一些“之前”和“之后”代码(或伪代码)来说明这个概念吗? 最佳答案
很多时候,在阅读 Babel 及其插件的文档时,我会遇到 loose 选项。我还没有看到足够好的例子来理解它是什么。 这是 preset-es2015 中的示例文档。 loose boolean, d
这就是我要实现的目标: 在 TabWidget 中使用 TextView(即调用 TabHost.TabSpec.setIndicator(View) 而不是 TabHost.TabSpec.setI
我已经向本地分支提交了一些内容,然后尝试执行 git fetch。它因以下错误而失败: fatal: loose object 7b36029a951eacd979d24e993e020c4d018c
我的同事试图从我们的主人那里做一个git pull。他得到了这个错误: $ git pull fatal: loose object f7630cc30248df1e19bcb40c9de1b60b7
我的一个克隆存储库是从 git fsck 获取的 fatal: loose object 40bda4e3b79c3d7bf598df31d9e68470f97a3f79 (stored in .gi
优化Group By最有效的办法是当可以直接使用索引来完全获取需要group的字段。使用这个访问方法时,MySQL使用对关键字排序的索引的类型(比如BTREE索引)。这使得索引中用于group的字段
好的,我知道这已经讨论过 here但没有提供明确的答复。我经常需要将 XML 文件导入 InDesign,其中包括许多脚注。当然,在这种情况下,InD 无法自动使用标签。除了所有脚注都失去了样式之外,
我最近在更新我的应用程序时遇到了一些重大问题。许多用户在迁移到最新版本后提示数据丢失。 几个小时后,我仍然不确定发生了什么,但我想证实一个理论。 Apple 在文档中说: 迁移和 iCloud 对于与
我在我的项目中实现了一个工厂,最近有人建议我在我的类上使用属性,这样工厂就可以确定要实例化和传回哪个类。我是开发领域的新手,并试图严格遵循松耦合规则,我想知道依赖“钩子(Hook)”(作为属性)是否违
我的目标是在单击 span(带有 Show Me 文本)时显示带有 show 类的 p 标签。我曾尝试使用 :focus 伪选择器来执行此操作,但使用此方法使得 p 标记仅在单击其他位置之前显示,其中
我是一名优秀的程序员,十分优秀!