Architecture 多层体系结构中的默认函数值

Architecture 多层体系结构中的默认函数值,architecture,default,dry,three-tier,least-astonishment,Architecture,Default,Dry,Three Tier,Least Astonishment,想知道在多层应用程序结构中设置默认值的最佳方法。具体来说,如果某个工作流需要一组嵌套的函数调用,那么默认值是在所有函数上指定的,还是仅在顶层函数上指定并传递?还是完全是另一种模式 例如,考虑一个3层的Web应用程序: 资源层处理HTTP请求和响应,从客户端获取HTTP参数 业务层执行确定所需信息所需的业务逻辑 数据层访问数据库并返回请求的数据 假设客户机想要得到一个对象——在本例中,假设它是一个Place对象。放置对象的类型为城市、州、镇、县等 资源函数可能如下所示(使用Django HTT

想知道在多层应用程序结构中设置默认值的最佳方法。具体来说,如果某个工作流需要一组嵌套的函数调用,那么默认值是在所有函数上指定的,还是仅在顶层函数上指定并传递?还是完全是另一种模式

例如,考虑一个3层的Web应用程序:

  • 资源层处理HTTP请求和响应,从客户端获取HTTP参数
  • 业务层执行确定所需信息所需的业务逻辑
  • 数据层访问数据库并返回请求的数据
假设客户机想要得到一个对象——在本例中,假设它是一个
Place
对象。放置对象的类型为城市、州、镇、县等

资源函数可能如下所示(使用Django HTTP对象):

那么另外两个可能是:

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

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

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

从必要性的角度来看,就资源层而言,“类型”是可选的。同样的事情也适用于您的业务层——其中没有需要类型值的逻辑。直到您深入到您的数据层,默认值才是必需的,并且具有任何意义

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

如果您希望保持一致,那么在更高的层中指定默认值也没有什么错。如果某些业务层函数的逻辑要求传递到数据层的任何内容都有一个值,那么您可以为该层中的所有函数设置默认值。然而,我真的不认为这是必要的

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

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