我已经开始用Python实现一个工具,它收集了几个系统指标(例如cpu利用率、cpu饱和、内存错误等),并将它们呈现给最终用户。理想情况下,这个工具应该支持尽可能多的平台(Linux、FreeBSD、Windows等)。在
对于一些我认为重要的指标,我已经完成了Linux系统的这个工具的实现,并且我刚刚开始为FreeBSD系统实现相同的度量。此工具的设计方式必须允许支持更多系统指标以及未来更多平台。此外,不久将添加一个web界面,它将从我的工具中接收数据。在
基于以上原因,我决定用Python实现这个工具(方便从许多系统上的不同来源读取数据,而且,我对它比较熟悉:)并且我对每个系统度量都遵循一个类结构(继承是很重要的,因为有些系统共享特性)不需要重写代码)。此外,我决定我有一个有效的用例来使用工厂方法。在
下面是一个CPU度量的类图示例(为便于提问而简化):
CpuMetrics (Abstract Base Class)
/ | \
/ | \
/ | \
/ | \
/ | \
/ | \
LinuxCpuMetrics FreeBSDCpuMetrics WindowsCPUMetrics (per OS)
/ \
/ \
/ \
/ \
/ \
/ \
/ \
ArchLinuxCpuMetrics DebianLinuxCpuMetrics (sometimes important per Distro or Version)
在名为CpuMetrics的抽象基类中,定义了一些应该通过继承类来实现的抽象方法和一个名为get_impl()的工厂方法。我对何时应该使用工厂方法(例如,答案如this)做了一些研究,我相信在我的例子中使用工厂方法是有效的。在
例如,我希望客户机(例如我的web界面)调用我的工具来获取CPU利用率指标,如下所示:
^{pr2}$按照上面分析的设计,让我的工厂方法知道我们现在在哪个系统上是非常重要的(“这是Linux,Windows吗?我现在应该带来哪个实现?”)。因此,我不得不严重依赖函数,比如platform.system()
或其替代品。所以我的工厂方法是(粗略地说一次):
def get_impl():
"""Factory method returning the appropriate implementation depending on system."""
try:
system = platform.system() # This returns: { Linux, Windows, FreeBSD, ... }
system_class = getattr("cpu", system + "CpuMetrics" )
except AttributeError, attr_err:
print ("Error: No class named " + system + "CpuMetrics in module cpu. ")
raise attr_err
return system_class()
我对此感到非常不舒服,原因有两个:
1)我强迫未来的程序员(甚至我自己)遵循类的命名约定。例如,如果有人决定扩展我的系统,比如说,对于Solaris,他必须将他的类命名为SolarisCpuMetrics
。在
2)如果在Python的未来版本中,platform.system()
(或我将选择使用的其他替代方法)的值被修改,那么我必须更改我的命名约定并大量修改我的工厂方法。在
所以,我的问题是:有没有解决我担心的问题的办法?我的代码会变得不可读还是我的关注点无效?如果你认为有一个解决办法,我需要多少修改/重构我的代码和改变我的设计?在
我没有从头开始设计项目的经验,所以我可以使用任何建议。另外,我在Java方面有更多的经验。在编写Python时,我试图用尽可能多的Python方式进行思考,但有时无法将两者恰当地分开。你的建设性批评是非常可取的。在
使用类修饰符来枚举类。并重写allocator。在
。。。在
^{pr2}$。。。在
^{3}$相关问题 更多 >
编程相关推荐