【问题标题】:Interfaces and hungarian notation接口和匈牙利符号
【发布时间】:2013-03-21 22:25:37
【问题描述】:

请看以下问题:What's the naming convention for classes in the DataAccess Project?

JDK 谈到使用命名空间来分隔数据逻辑层和业务逻辑层,而不是使用匈牙利符号来命名接口,例如IPersonDAL 用于数据访问层。我在下面的代码中遵循了这个回答者的建议:

Imports com.app.BusinessLogicLayer.Interfaces
Imports com.app.DataLogicLayer.Interfaces
Namespace BusinessLogicLayer

        Public Class Order
            Implements com.app.BusinessLogicLayer.Interfaces.IOrder
            Public Sub Insert()
                Dim IOrder As com.app.DataLogicLayer.Interfaces.IOrder = New com.app.DataLogicLayer.Order
            End Sub
        End Class
    End Namespace

    Namespace DataLogicLayer
        Public Class Order
            Public Sub Insert()

            End Sub
        End Class
    End Namespace

    Namespace BusinessLogicLayer.Interfaces
        Public Interface IOrder

        End Interface
    End Namespace

    Namespace DataLogicLayer.Interfaces
        Public Interface IOrder

        End Interface
    End Namespace

业务逻辑层中的类,例如订单实现接口(来自业务逻辑层的 IOrder)和使用接口(来自数据逻辑层的 IOrder),即表示层与业务逻辑层通信,业务逻辑层通过接口与数据逻辑层通信。请注意,由于这个原因;接口必须完全符合命名空间。为此原因;使用匈牙利符号命名接口不是更好吗? IPersonBLL 和 IPersonDAL 还是我遗漏了什么?

【问题讨论】:

标签: vb.net design-patterns


【解决方案1】:

嗯,这是一个主观的话题,但这里是......

首先,避免使用 DAL 等缩写词。代码分析对首字母缩略词大喊大叫;你应该把它写出来。根据我的经验,这是明智的建议。打开充满缩写的古老代码会导致很多不必要的 WTF 时刻(双关语)。

即使拼写出来,当您的 BusinessLogic 文件夹中有 50 个类时:

Company.Product.BusinessLogic
实体
订单实体
材质实体
员工实体
客户实体
等等

我的直觉告诉我是时候重构了。我觉得最好将 Entity 标签移动到命名空间,所以你有这个:

Company.Product.BusinessLogic.Entity

订购
材质
员工
客户
等等

同样的事情也适用于接口。

这也使得重构更容易。如果我想开始调用我的实体“BusinessObjects”,我只需要重命名命名空间,而不是类名和文件名。

限定类名可能会很痛苦,但您通常只需要指定父命名空间,而不是完全限定它们。 Resharper -> 清理代码在这里创造了奇迹。

总之,我不会为了让引用更容易处理而将匈牙利符号添加到我的接口/类名中。


更新:示例

数据访问层

Namespace Company.Product.DataAccess.Adapter
    Public Class Product
    End Class
End Namespace


业务层

Imports Company.Product.DataAccess

Namespace Company.Product.BusinessLogic.Entity
    Public Class Product
        Dim adapter As New Adapter.Product()
    End Class
End Namespace


用户界面(理想情况下,您的 UI 应该只与业务层交互,而不是直接与数据层交互):

Imports Company.Product.BusinessLogic

Namespace Company.Product.UserInterface.Webpage
    Public Class Product
        Dim productEntity As New Entity.Product()
    End Class
End Namespace

【讨论】:

  • 这意味着您必须使用完全限定的命名空间来区分业务逻辑层中的接口和数据逻辑层中的接口(正如我在问题中所述)。你同意?我同意这是一种干净的方式。 +1。
  • 你必须让他们获得资格,但是使用“进口”使得你只需要获得下一个级别的资格。我会在我的回答中举个例子
【解决方案2】:

注意因为这个原因;接口必须完全符合命名空间。为此原因;使用匈牙利符号命名接口不是更好吗? IPersonBLL 和 IPersonDAL 还是我遗漏了什么?

我明白你在说什么,但我不明白为什么完全限定名称是不好的,或者为什么使用“匈牙利”表示法命名接口会“更好”。 (我是作为 Simonyi 的匈牙利应用程序的忠实粉丝说的。)

请记住,无论类/接口的名称和位置如何,编译器都会生成相同的目标代码。明显的嵌套级别不会将您的代码“减慢”到任何可察觉的程度。

如果 真的 打扰您输入名称(而 Intellisense 并不能安慰您),您始终可以使用 namespace alias 之类的东西和 using 指令。但我会小心过度使用这些——我认为这会使代码更难阅读。

【讨论】:

  • +1 评论:“我不明白为什么完全限定名称是不好的,或者为什么使用“匈牙利”表示法命名接口会“更好”。
猜你喜欢
  • 2011-11-28
  • 2011-08-27
  • 2011-11-27
  • 1970-01-01
  • 1970-01-01
  • 2010-09-17
  • 2014-06-06
  • 1970-01-01
  • 2011-01-09
相关资源
最近更新 更多