10

したがって、これはクラスを理解しようとしている人にとっては哲学的な質問のようなものです。

ほとんどの場合、クラスの使用方法は実際には非常に悪い使用方法です。私は多くの関数を考えていますが、しばらくするとコードをインデントしてクラスにし、変数が何度も繰り返される場合はいくつかのものを self.variable に置き換えます。(私はその悪い習慣を知っています)とにかく...私が求めているのは:

 class FooBar:
       def __init__(self,foo,bar):
           self._foo = foo
           self._bar = bar
           self.ans = self.__execute()

       def __execute(self):
            return something(self._foo, self._bar)

現在、これを行うには多くの方法があります。

   class FooBar:
         def __init__(self,foo):
           self._foo = foo


       def execute(self,bar):
            return something(self._foo, bar)

どちらが悪いのか、どちらが悪いのか教えていただけますか?

またはこれを行う他の方法。

これは単なるおもちゃの例です(もちろん)。つまり、関数が1つしかない場合、ここにクラスを用意する必要はありません..しかし、__execute something()で他のメソッドのセット全体を呼び出すとしましょう.. ?? ありがとう

4

2 に答える 2

9

それぞれFooBarに責任がある場合barは、最初が正しいです。barのみが必要で、それ以外の問題execute()がない場合FooBarは、2 番目が正しいです。

于 2012-09-12T15:32:47.443 に答える
4

ここで気を付けたい正式な用語を一言で言えば、関心の分離です。

あなたの特定の例に応じて、2 つの例のどちらを選択するかは、FooBarとによって解決される問題によって異なりますbarbarが と同じ問題領域にある場合、または がへの参照を格納するFooBarことが理にかなっている場合、2 番目の例は正しいです。たとえば、 にを受け入れる複数のメソッドがあり、 の同じインスタンスを特定のインスタンスの関連メソッドのそれぞれに常に渡す場合、前の例は正しいです。それ以外の場合は、後者の方が正しいです。FooBarbarFooBarbarbarFooBarbar

理想的には、作成する各クラスは、プログラムの主要な問題を正確に 1 つモデル化する必要があります。「主要な関心事」の粒度を自分で決定する必要があるため、これは少し注意が必要です。依存関係ツリーを調べて、これが正しく行われているかどうかを判断してください。個々のクラスをプログラムから取り出して、他のすべてのクラスから分離してテストするのは比較的簡単です。これが非常に難しい場合は、懸念事項を正しく分割していません。より形式的には、関心の適切な分離は、まとまりがあり疎結合のクラスを設計することによって達成されます。

これはあなたが投稿した例には役に立ちませんが、より広いスケールでこれを達成するのに役立つ単純なパターンの 1 つは、制御の反転 (IoC、依存性注入と呼ばれることもあります) です。IoC の下では、クラスは依存関係を直接認識せず、依存関係が実装するインターフェイス (Python で言えばプロトコル) のみを認識するように記述されます。次に、実行時 (通常はアプリケーションの初期化中) に、主要なクラスのインスタンスがファクトリによって作成され、実際の依存関係への参照が割り当てられます。Python でこれを実現する方法については、この記事(この例を参照) を参照してください。

最後に、オブジェクト指向プログラミングの 4 つの原則を学びます。

于 2012-09-12T15:51:49.137 に答える