ここでコードを見ることができます
私が解決しようとしている具体的な問題はこれです。データベースに保存されたツールを使用して、モデル化されたエンティティ (私の場合は 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 を依存性注入に置き換えることができます。しかし、それは誰かが間違った依存関係を与えることによって間違った設定を作成する可能性があるという問題を引き起こします. それは基本的に私が行ったことですが、代わりに部分関数を使用しています。
したがって、私が今考えているのは、ハンドラーに適切な依存関係を与える、必要なすべてのタイプのハンドラーのファクトリー関数を作成することで、この問題を解決できるということです。
それは私が思うテンプレートメソッドソリューションと非常によく似ています。基本的な違いは、テンプレート メソッドの正確さの依存関係はオブジェクト タイプによって保証され、私のソリューションではファクトリ関数のタイプによって保証されることです。
私の考えはここまでにして、あなたがそれについてどう思うか知りたいのですが?機能的な世界の人々は、この種の問題をどのように解決するのでしょうか?