web-dev-qa-db-ja.com

Pythonクラスの命名:ネストされたクラスまたは構成された名前?

どちらが最良(または最悪)の命名戦略であるかを決定できないシナリオに遭遇しました。コンテキストは次のとおりです。ノードで構成されるブラケット(トーナメントなど)。ノードは、シードされたプレーヤー、バイ、または別のノードへの参照の2つの抽象要素で構成されます。

概念的に言えば、包含の階層がはっきりとわかります。

Bracket > Node > Element = Seed, Bye, Reference

私はそれらに合成名で名前を付けるかどうかを決定できず、各クラスを同じレベルで宣言します(ネストなし):

class Bracket:
    pass

class BracketNode:
    pass

class BracketNodeElement:
    pass

class BracketNodeElementSeed(BracketNodeElement):
    pass

class BracketNodeElementBye(BracketNodeElement):
    pass

class BracketNodeElementReference(BracketNodeElement):
    pass

または、名前をもう少しDRYにしますが、名前を間違いなく醜くします:

class Bracket:
    class Node:
        class Element:
           pass

        class Seed(Element):
           pass

        class Bye(Element):
           pass

        class Reference(Element):
           pass

シードまたはバイへのアクセスは次のように表現する必要があります:Bracket.Node.SeedおよびBracket.Node.Bye

いつもの行き方は?

4
dabadaba

オプションC:シンプルな方が良い。各クラスをグローバルレベルで作成し、プレフィックスを削除します。

class Bracket:
    pass

class Node:
    pass

class Element:
    pass

class Seed(Element):
    pass

class Bye(Element):
    pass

class Reference(Element):
    pass

これらすべてがモジュールに存在するという事実は、大きくて面倒なクラス名を持たなくても、必要な名前空間を提供します。たとえば、これらをtournament.pyという名前のファイルに置いたとすると、どこからでもtournament.Brackettournament.Nodeなどを使用します。

7
Bryan Oakley