0

コードの再利用を最大化することを目標に、Python コード用にかなり複雑なクラス階層を作成しました。次のようになります。

class ElectionMethod
    class IterativeMethod
        class SNTV
        ...
    class NonIterativeMethod
        class OrderDependent
            class CambridgeSTV
            ...
        class OrderIndependent
            class WIGM
                class ERS97STV
                ...
            class Recursive
                class MeekSTV
                ...

クラス階層のリーフのみがオブジェクトにインスタンス化されます。これは、コードの再利用を最大化するという目的には役立ちますが、コード自体は複雑で (一部のクラスには 20 ほどのメソッドがあります)、多くのレベルを考えると、何かが実装されている場所を見つけるのに時間がかかる可能性があります。

機能のチャンクを引き出して、その機能を別のオブジェクトに入れようとしましたが、ほとんどすべての機能が共通のデータに依存しているため、これを行う良い方法が見つかりませんでした. つまり、一部のコードを別のオブジェクトに移動できますが、必要なデータを取得するために大きな複雑な階層を参照する必要があるため、実際にはカプセル化されていません。

これをより管理しやすくする方法について誰かアドバイスはありますか?

4

3 に答える 3

2

マルチメソッドは、アーキテクチャによっては、この種の問題に対する別の有効な解決策になる場合があります。アイデアは、メソッドに渡すことが望ましい任意のクラスインスタンスに作用できるモジュールレベルの関数をメソッドに作成することです。多重継承の代わりとしてそれらを調べる別のリンクがあります。それらを総称関数と呼びますが、考え方は似ています。また、Pythonの文書化されていない組み込みの概念の実装についても説明します。

クラスから特定のインスタンス値を設定または取得する必要のないすべてのものをモジュールレベルの関数に移動し、状態の公開/変更インターフェイスの実装に関係するクラスレベルのコードを使用できる場合は、マルチメソッドも必要です。

于 2010-08-19T19:34:00.707 に答える
2

何かが実装されている場所を見つけることが唯一の難点である場合は、おそらくリファクタリングする必要はありません。代わりに、現在のエディターの拡張機能を探すか、定義へのジャンプをサポートするものに切り替えてください。

たとえば、ropemacs がインストールされた emacsは、カーソルをオブジェクト名の上に置いてCtrl-c g押すと、定義にジャンプします。

vi/vim を使用する場合、同様のトリックがあると確信しています。

于 2010-08-19T18:39:52.927 に答える
0

これは古典的な問題であるため、普遍的な答えはありません (それ以外は問題ではありませんでした)。ただし、一般的に使用されるソリューションがいくつかあります。そのうちの 1 つ -設計におけるSOLID原則。したがって、階層のレベルで機能を検索する必要はありません。適切な単一責任コード要素で簡単に見つけて実装できます。また、一般的なデータにアクセスする必要がある場合は、このデータへのアクセスを担当するオブジェクトを作成する必要があります。

契約による設計、特に依存性注入の手法では、通常、フレームワークのサポートが必要になるため、適切なプラットフォームを検索してください。

于 2010-08-19T19:12:05.993 に答える