你可以在这里看到代码
我试图解决的具体问题是这个。假设我需要使用存储在数据库中的一些工具为一些建模的实体(在我的例子中是 sqlalchemy)提供 REST 接口。说这个集合叫做父母。
我需要这样的处理程序
GET /parents
GET /parents/some_id
POST /parents
DELETE /parents/some_id
从概念上讲,所有这些处理程序都非常相似。他们都从 url 获取 id,然后创建适当的查询。然后他们使用该查询获取数据,然后将此数据转换为 dict,然后调用jsonify
以创建正确的 http 响应。
因此,使用 OOP,我可以这样设计。
class AbstractHandler():
def __init__(serializer, **specs):
self.specs = specs
def handle_request(self, spec_data, *_ids):
q = self.create_query(_ids)
d = self.fetch_data(self.specs[spec_data['name']](**(spec_data['args'] + (query, ))
out = serializer(d)
return jsonify(out)
规范是一个函数,它接受一些参数和查询,并根据这些参数生成更精细的查询。
因此,例如 GET /parents?spec={'name': 'by_name', 'args': ['adam'} 将从集合中返回名为 Adam 的父级。
这段代码有一些缺陷,但我希望你能看到模板方法如何在这里实现控制流,子类可以改变它们如何创建查询、如何获取数据(项目处理程序需要调用 query.one() 和集合处理程序将需要调用 query.all() 例如)
所以我可以用依赖注入替换create_query、fetch_data。但这会产生一个问题,即有人可能通过提供错误的依赖项来创建错误的配置。这基本上就是我所做的,但使用部分函数代替。
所以我现在想的是,我可以通过为我需要的每种类型的处理程序创建工厂函数来解决这个问题,这会给处理程序提供适当的依赖。
这与我认为的模板方法解决方案非常相似。区别基本上在于,在模板方法中,正确性依赖关系由对象类型保证,而在我的解决方案中,它由工厂函数的类型保证。
我的想法已经够多了,我想知道您对此有何看法?功能世界中的人们如何解决这类问题?