基于系统和设计问题的python类返回实现的工厂方法

2024-10-02 04:33:02 发布

您现在位置:Python中文网/ 问答频道 /正文

1) 简介

我已经开始用Python实现一个工具,它收集了几个系统指标(例如cpu利用率、cpu饱和、内存错误等),并将它们呈现给最终用户。理想情况下,这个工具应该支持尽可能多的平台(Linux、FreeBSD、Windows等)。在

对于一些我认为重要的指标,我已经完成了Linux系统的这个工具的实现,并且我刚刚开始为FreeBSD系统实现相同的度量。此工具的设计方式必须允许支持更多系统指标以及未来更多平台。此外,不久将添加一个web界面,它将从我的工具中接收数据。在

2) 到目前为止我的设计决策

基于以上原因,我决定用Python实现这个工具(方便从许多系统上的不同来源读取数据,而且,我对它比较熟悉:)并且我对每个系统度量都遵循一个类结构(继承是很重要的,因为有些系统共享特性)不需要重写代码)。此外,我决定我有一个有效的用例来使用工厂方法。在

2.1)阶级结构

下面是一个CPU度量的类图示例(为便于提问而简化):

                  CpuMetrics        (Abstract Base Class)
                 /      |    \
                /       |     \
               /        |      \
              /         |       \
             /          |        \
            /           |         \
LinuxCpuMetrics  FreeBSDCpuMetrics WindowsCPUMetrics   (per OS)
           /  \ 
          /    \
         /      \
        /        \
       /          \
      /            \
     /              \
ArchLinuxCpuMetrics  DebianLinuxCpuMetrics             (sometimes important per Distro or Version)

2.2)工厂法

在名为CpuMetrics的抽象基类中,定义了一些应该通过继承类来实现的抽象方法和一个名为get_impl()的工厂方法。我对何时应该使用工厂方法(例如,答案如this)做了一些研究,我相信在我的例子中使用工厂方法是有效的。在

例如,我希望客户机(例如我的web界面)调用我的工具来获取CPU利用率指标,如下所示:

^{pr2}$

3) 我的关心和我的问题(最后)

按照上面分析的设计,让我的工厂方法知道我们现在在哪个系统上是非常重要的(“这是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方式进行思考,但有时无法将两者恰当地分开。你的建设性批评是非常可取的。在


Tags: 工具方法代码度量linuxwindows工厂系统
1条回答
网友
1楼 · 发布于 2024-10-02 04:33:02

使用类修饰符来枚举类。并重写allocator。在

sysmap = {}

class metric:
  def __init__(self, system):
    self.system = system
  def __call__(self, cls):
    sysmap[self.system] = cls
    return cls

class CpuMetrics:
  def __new__(self):
    cls = sysmap.get(platform.system)
    if not cls:
      raise RuntimeError('No metric class found!')
    else:
      return cls()
   ...

。。。在

^{pr2}$

。。。在

^{3}$

相关问题 更多 >

    热门问题