0

私はOOPを初めて使用し、次のような状況にあります。いくつかのレポートに使用されるレポート「エンジン」のようなものがあります。必要なのは構成ファイルのパスだけです。

Pythonでコーディングしますが、これは不可知論的な質問です。したがって、次の2つのアプローチがあります。

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/...")

どちらのアプローチが正しいですか?重要な場合は、compositionを使用してレポートオブジェクトを別のクラスに挿入します。

4

3 に答える 3

2

互いに異なるレポート エンジンを実装する必要がある場合は、IMHO A)アプローチの方が適しています。レポートが別のロジックを使用して作成されている場合は、このアプローチに従います。

しかし、レポート エンジン間の唯一の違いがB)_config_pathアプローチであると私は考えています。明らかに、このようにして、レポートの種類に関係なく、すべてのレポートを作成するための共有ロジックが得られます。

于 2013-01-22T16:28:48.407 に答える
1

一般的に言えば、すべての Report が持つすべてのものをスーパークラスに入れます。特定のものをサブクラスに入れます。

したがって、あなたの場合、B)のように_config_pathスーパークラスに入れます(すべてのレポートには) がありますが、 A) のように特定のレポートをインスタンス化しますが、すべてのレポートは独自のパスを設定できます。ReportEngine_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 よりも柔軟である (1 つのレポートの相互変更が他のレポートに影響しない) のに対して、B はよりシンプルで明確です (違いがどこにあるかを正確に示します) が、1 つのレポート タイプに影響を与える変更が必要になることです。より多くの仕事。レポートが時間内に変更されないことが確実な場合は、B を使用します。将来、違いが一般的ではないと思われる場合は、A を使用します。

于 2013-01-22T10:25:05.960 に答える