您可以看到代码here
我试图解决的具体问题是这个。 假设我需要为一些建模的实体(在我的情况下为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&#39 ;:' by_name',' args':[' adam'} 将从集合中返回名为Adam的父。
这段代码有一些缺陷,但我希望你看到模板方法如何使控制流在这里,子类可以改变它们创建查询的方式,它们如何获取数据(项目处理程序需要调用query.one())和集合处理程序需要调用query.all()例如)
所以我可以用依赖注入替换create_query,fetch_data。但这会产生一个问题,即有人可能通过提供错误的依赖来创建错误的配置。这基本上就是我所做的,但改为使用部分功能。
所以我现在想的是,我可以通过为我需要的每种类型的处理程序创建工厂函数来解决这个问题,这将为处理程序提供适当的依赖。
我认为这与模板方法解决方案非常相似。差异主要在于模板方法的正确性依赖关系是由对象类型保证的,在我的解决方案中,它由工厂函数的类型保证。
对我的想法如此充分,我想知道你对此的看法? 功能世界的人们如何解决这类问题?