architecture - 多层架构中的默认函数值

标签 architecture default dry three-tier least-astonishment

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

例如,考虑一个具有 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。

    最佳答案

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

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

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

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

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

    关于architecture - 多层架构中的默认函数值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14659225/

    相关文章:

    javascript - 检查函数参数是否为 JavaScript 中的默认参数

    javascript - 我如何压缩/优化这段代码(jQuery)?

    php - Symfony2 DTO,实体转换

    architecture - 可扩展的存储 + 处理集群(我需要 Hadoop 吗?)

    perl - 在非默认浏览器中打开的浏览器中启动 url

    c# - 遵循 ASP.NET 中的 DRY 原则

    java - 这里如何同时遵守 "composition over inheritance"和DRY原则呢?

    sockets - 为软件创建不同的可执行组件是否是一种好习惯?

    design-patterns - 使用依赖注入(inject)时,所有新的操作符都去哪里了?

    Java:切换默认覆盖 try-catch