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
   }

那么另外两个可能是:

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

这个堆栈中资源层“下方”的两个函数是否也应该默认类型为无? 我的一部分认为这样做会违反 DRY。我的另一部分认为,最可预测和模块化的方法是堆栈中的每个函数都将默认类型“明智地”设置为 None。

4

1 回答 1

2

我实际上会在需要默认而不是最高级别的最低级别进行默认设置。

从必要性的角度来看——就资源层而言,“类型”是可选的。您的业​​务层也是如此——那里没有需要类型值的逻辑。直到您深入到数据层,才需要默认值并且具有任何意义。

无论从“上方”调用什么,每一层中的函数都需要能够工作。因此,如果您的数据层需要某种类型的“类型”值(并且无论是谁调用它,都有一个有意义的默认值),那么将默认值放在数据层中。

如果您想保持一致,那么在较高层中指定默认值也没有错。也许如果您的某些业务层功能的逻辑需要为传递到数据层的任何内容提供值,您可以为该层中的所有功能设置默认值。但是,我真的认为没有必要。

关键是默认值会出现在实际需要的地方。

于 2013-02-04T06:02:10.940 回答