多くのパラメータを持つ複雑な構築プロセスを持つクラスがあります。複数のクライアントがこのクラスのオブジェクトを共有し、これらのクライアントパラメータの和集合を使用してクラスをインスタンス化します。したがって、これらの要件を格納し、さまざまなクライアントの要求の整合性をチェックし、クラスをインスタンス化するファクトリクラスがあります。
さらに、複数のクライアントが複数のファクトリに使用する共通の使用モデルのセット(またはパラメータのセット)があります。
たとえば、例を考えてみましょう。(実際のコードはC ++ですが、私の経験はPythonであるため、Pythonで擬似コードを作成します。はい、この例は実際にはそのままでは機能しないことを知っています。)
class Classroom:
def __init__(self, room_size=None, n_desks=None, n_boards=None,
n_books=None, has_globe=False, ... ):
...
class ClassroomFactory:
def __init__(self):
self._requirements = dict()
def addRequirement(self, name, value):
if name.startswith("n_"):
self._requirements[name] = max(value, self._requirements.get(name, 0))
...
def createClassroom(self):
return Classroom(**self._requirements)
# instantiate the factory
factory = ClassroomFactory()
# "client 1" is a geography teaacher
factory.addRequirement("n_desks", 10)
factory.addRequirement("n_boards", 1)
factory.addRequirement("has_globe", True)
# "client 2" is a math teacher
factory.addRequirement("n_desks", 10)
factory.addRequirement("n_boards", 1)
# "client 3" is a after-school day-care
factory.addRequirement("room_size", (20,20))
factory.addRequirement("has_carpet", True)
room = factory.createClassroom()
一般的な使用モデルは教師としてであり、10台の机とボードが必要です。これは、次のような非メンバー関数/デコレータによって最適に提供されると思います。
def makeTeacherRoom(factory):
factory.addRequirement("n_desks", 10)
factory.addRequirement("n_boards", 1)
return factory
これは、「メンバーよりも非メンバー/非友人を優先する」パラダイムの優れた例のようです。
私が苦労しているのは、はるかに大きなオブジェクト指向コードのフレームワーク内で、名前空間と実際のファイルの両方の観点から、これらのタイプの非メンバー関数/デコレーターはどこに存在する必要があるかということです。
それらはファクトリのファイル/名前空間に存在する必要がありますか?これらは工場と密接な関係がありますが、一般的な工場の制限であり、工場を使用するために使用する必要はありません。
それらはクライアントのファイル/名前空間に存在する必要がありますか?クライアントはこれらの使用モデルを理解していますが、これにより複数のクライアント間での再利用が制限されます。
クライアントの共通の基本クラスと一緒に住んでいる場合(たとえば、MathTeacherとGeographyTeacherによって継承される非メンバー関数makeTeacherRoom()も提供する「教師」クラス/名前空間を想像できます。
「utils」ファイルで、完全に別の場所に住む必要がありますか?もしそうなら、どの名前空間で?