0

我是 OOP 的新手,我处于以下情况:我有一个类似报告“引擎”的东西,用于多个报告,唯一需要的是配置文件的路径。

我将用 Python 编写代码,但这是一个不可知的问题。所以,我有以下两种方法

A)类 ReportEngine 是一个抽象类,除了配置文件的路径之外,它具有所需的一切。这样你只需要实例化 ReportX 类

在此处输入图像描述

class ReportEngine(object):
    ...

class Report1(ReportEngine):
    _config_path = '...'

class Report2(ReportEngine):
    _config_path = '...'

report_1 = Report1()

B)类 ReportEngine 可以通过配置文件路径实例化

class ReportEngine(object):
    def __init__(self, config_path):
        self._config_path = config_path
    ...

report_1 = ReportEngine(config_path="/files/...")

哪种方法是正确的?万一这很重要,报表对象将被插入到另一个类中,使用组合。

4

3 回答 3

2

恕我直言,如果您需要实现彼此不同的报表引擎,A)方法会更好。如果您的报告使用不同的逻辑填充,请遵循此方法。

但是,如果您的报告引擎之间的唯一区别是_config_path我认为B)方法适合您。显然,通过这种方式,您将有一个共享逻辑来构建每个报告,而不管报告类型。

于 2013-01-22T16:28:48.407 回答
1

一般来说,将每个Report 具有的所有内容都放在超类中。将特定的东西放在子类中。

因此,在您的情况下,将 放在B)_config_path中的超ReportEngine类中(因为每个Report 都有一个),但是像A中那样实例化特定的 Reports ,而每个 Report 都可以设置自己的路径。_config_path

我不了解 Python,但快速搜索了Python 3.0+的正确语法,我希望它有意义:

class ReportEngine(object):
    def __init__(self, config_path):
        self._config_path = config_path

    def printPath(self):
        print self._config_path
    ...

class Report1(ReportEngine):
    def __init__(self):
        super().__init__('/files/report1/...')

然后一个

reportObj = Report1()
reportObj.printPath()

应该打印

'/files/report1/...'
于 2013-01-22T19:36:05.267 回答
0

基本上主要区别在于方法 A 比 B 更灵活(在一个报告中不相互更改不会影响其他报告),而 B 更简单、更清晰(准确显示差异在哪里)但影响一种报告类型的更改需要更多的工作。如果您非常确定报告不会及时更改 - 选择 B,如果您觉得未来不会出现差异 - 选择 A。

于 2013-01-22T10:25:05.960 回答