5

多層アプリケーション構造でデフォルトを設定するための最良の方法を考えています。具体的には、特定のワークフローでネストされた関数呼び出しのセットが必要な場合、デフォルトはすべての関数で指定されていますか、それとも最上位の関数だけで指定されて渡されますか?それとも完全に他のパターンですか?

たとえば、次の3つのレイヤーを持つWebアプリについて考えてみます。

  • リソースレイヤーはHTTPリクエストとレスポンスを処理し、クライアントからHTTPパラメーターを取得します
  • ビジネス層は、必要な情報を決定するために必要なビジネスロジックを実行します
  • データ層はデータベースにアクセスし、要求されたデータを返します。

クライアントが単一のオブジェクトを取得したいとします。この例では、そのオブジェクトを取得しPlaceます。場所オブジェクトには、type市、州、町、郡などがあります。

リソース関数は次のようになります(Django HTTPオブジェクトを使用)。

def resource_get_place(request, type=None):
    """ Gets a place of the specified type, or a place of any type if
     type is None """

   place = business_get_place(type=type)

   return HttpResponse(request, {
       "place" : place
   }

次に、他の2つは次のようになります。

def business_get_place(type):
    # Trivial in this case, used for consistency
    return data_get_place(type)

def data_get_place(type):
    # Get a place of specified type from the cache, or db,
    # or wherever else.  If type is None, get place of any type.
    return place

このスタックのリソースレイヤーの「下」にある2つの関数も、デフォルトのタイプを「なし」にする必要がありますか? 私の一部は、そうすることはDRYに違反すると思います。私の別の部分は、それを行う最も予測可能でモジュール式の方法は、スタック内のすべての関数がデフォルトのタイプ「賢明に」を「なし」にすることだと思います。

4

1 に答える 1

2

私は実際には、最高レベルではなく、デフォルトが必要な最低レベルでデフォルト設定を行います。

必要性の観点からこれを見ると、リソース層に関する限り、「タイプ」はオプションです。同じことがビジネス層にも当てはまります。タイプの値を必要とするロジックはありません。デフォルト値が必要であり、なんらかの意味を持つのは、データ レイヤーに到達するまではありません。

各レイヤーの機能は、「上」からの呼び出しに関係なく機能する必要があります。したがって、データ層で「タイプ」に何らかの値が必要な場合 (そして、誰が呼び出しても意味のあるデフォルト値がある場合)、デフォルト値をデータ層に入れます。

一貫性を保ちたい場合は、上位レイヤーでもデフォルトを指定しても問題ありません。ビジネス レイヤー関数の一部に、データ レイヤーに渡されるものすべてに値を必要とするロジックがある場合、そのレイヤー内のすべての関数にデフォルトを設定できます。しかし、私はそれが本当に必要だとは思わない。

重要なのは、デフォルトが実際に必要な場所にあるということです。

于 2013-02-04T06:02:10.940 に答える