1

この時点で 2 つのメソッドを持つクラスを作成したいと考えています (また、クラスを明らかに変更できるようにしたいと考えています)。

class ogrGeo(object):

    def __init__(self):
        pass

    def CreateLine(self, o_file, xy):
        #lots of code


    def CreatePoint(self, o_file, xy):
        # lot's of the same code as CreateLine(), 
        # only minor differences

物事をできるだけきれいに保ち、できるだけ少ないコードを繰り返すために、アドバイスを求めています。2 つの方法CreateLine()CreatePoint()は多くのコードを共有しています。冗長性を減らすには: 両方のメソッドが呼び出すことができる 3 番目のメソッドを定義する必要がありますか? この場合でも、別々に呼び出すことができます o = ogrGeo() o.CreateLine(...) o.CreatePoint(...)。それとも、それらを 1 つのメソッドにマージする必要がありますか? 私が考えていない、または何も知らない別の解決策はありますか?

すでにご提案いただきありがとうございます。

4

5 に答える 5

3

メソッドを 1 つにマージするかどうかは、API 設計の問題です。関数の目的が異なる場合は、それらを別々に保ちます。クライアントコードがパターンに従う可能性が高い場合は、それらマージします

if some_condition:
    o.CreateLine(f, xy)
else:
    o.CreatePoint(f, xy)

それ以外の場合は、マージしないでください。代わりに、共通コードをプライベート メソッドにリファクタリングするか、共通コードが に触れていない場合は独立した関数にリファクタリングしますself。Python には、言語に組み込まれた「プライベート メソッド」の概念はありませんが、先頭_に付いている名前はそのように認識されます。

于 2012-09-21T12:41:49.857 に答える
2

一般的なコードを (プライベート) ヘルパー メソッドに分解するのは、まったく普通のことです。

class ogrGeo(object)
    def __init__(self):
        pass

    def CreateLine(self, o_file, xy):
        #lots of code
        value = self._utility_method(xy)

    def CreatePoint(self, o_file, xy):
        # lot's of the same code as CreateLine(), 
        # only minor differences
        value = self._utility_method(xy)

    def _utility_method(self, xy):
        # Common code here
        return value

メソッドは値を返すか、 の属性を直接操作できますself

アドバイス: Python スタイル ガイドを読み、その慣習に従ってください。他のほとんどの Python プロジェクトはそうしており、そうすれば、他の Python 開発者がコードを理解しやすくなります。

于 2012-09-21T12:42:51.797 に答える
1

オーバーラップするコードについては、それらが独自の個別の関数になるかどうかを検討してください。次に、特定の関数へのいくつかの呼び出しで構成され、CreateLineに意味のあるパラメーターの選択が行われ、ポイントを作成するための適切なパラメーターを使用していくつかの関数呼び出しが行われます。CreateLineCreatePoint

これらの新しい補助関数が他の場所で使用されない場合でも、コードをコピーして貼り付けるよりも、それらを個別の関数としてモジュール化する方が適切です。しかし、これらの構造を作成するために必要な補助関数が非常に特殊である場合は、それらを独自のクラスに分割してみませんか?

オブジェクトを作成するためのすべての基本を含む「オブジェクト」クラスを作成し、「オブジェクト」から派生する「線」および「点」クラスを作成できます。これらのクラス内で必要な関数をオーバーライドして、コードの重複部分を基本「オブジェクト」クラスの補助関数に依存し、構築が固有になるようにします。

次に、ogrGeoクラスはこれらの他のクラスのインスタンスを構築します。「Line」または「Shape」の最終消費者が本格的なクラス オブジェクトを必要としない場合でも、この設計を使用してogrGeo、Line インスタンスまたは Point インスタンスのサブピースを返す機能を与えることができます。消費者は使用を希望します。

于 2012-09-21T12:44:49.403 に答える
1

それはほとんど問題ではありません。呼び出し元のプログラムでクラス メソッドをできる限り使いやすくしたい場合、作成するオブジェクトの型に追加のパラメーターを持つ単一のメソッドを使用するよりも、2 つのメソッドを使用する方が少し簡単で効率的です。

def CreateObj(self, obj, o_file, xy)    # obj = 0 for Point, 1 for Line, ...

推奨事項: 個別の API 呼び出しを使用し、共通コードをクラス内で呼び出すことができるメソッドに分解します。

于 2012-09-21T12:46:24.110 に答える
0

あなたも他の方向に行くことができます。特に次のような場合:

def methA/B(...):
    lots of common code
    small difference
    lots of common code

その後、あなたはすることができます

def _common(..., callback):
    lots of common code
    callback()
    lots of common code
def methA(...):
    def _mypart(): do what A does
    _common(..., _mypart)
def methB(...):
    def _mypart(): do what B does
    _common(..., _mypart)
于 2012-09-21T13:05:04.410 に答える