我有一个具有许多参数的复杂构造过程的类。多个客户端共享该类的对象,这些客户端参数的并集用于实例化该类。因此我有一个工厂类来存储这些需求,检查各种客户请求的一致性,并实例化该类。
此外,还有一组通用的使用模型(或参数集)可供多个客户用于多个工厂。
例如,考虑一个例子。(请注意,实际代码是 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
这似乎是“喜欢非会员/非朋友而不是会员”范式的一个很好的例子。
我正在努力解决的问题是,在更大的 OO 代码框架内,这些类型的非成员函数/装饰器应该在哪里存在,无论是就命名空间还是就实际文件而言?
他们应该住在工厂的文件/命名空间中吗?它们与工厂密切相关,但仅限于一般工厂,不需要使用工厂。
他们应该存在于客户的文件/命名空间中吗?客户端了解这些使用模型,但这会限制多个客户端之间的重用。
他们是否应该使用客户端的公共基类(例如,可以想象一个“教师”类/命名空间,它还将提供非成员函数 makeTeacherRoom(),该函数将由 MathTeacher 和 GeographyTeacher 继承。
他们应该完全住在其他地方,在“utils”文件中吗?如果是这样,在哪个命名空间中?