接口和匈牙利表示法

时间:2013-03-21 22:25:38

标签: vb.net design-patterns

请查看以下问题: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还是我错过了什么?

2 个答案:

答案 0 :(得分:2)

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

首先,避免像DAL这样的缩写。 Code Analysis对缩写词和缩写词大喊大叫;你应该把它写出来。根据我的经验,这是明智的建议。打开充满缩写的古代代码会导致很多不必要的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


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

Imports Company.Product.BusinessLogic

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

答案 1 :(得分:1)

  

请注意,由于这个原因;接口必须完全限定命名空间。为此原因;使用匈牙利表示法命名接口不是更好的例如IPersonBLL和IPersonDAL还是我错过了什么?

我看到你在说什么,但我不明白为什么完全限定名字是坏的,或者为什么用“匈牙利”符号命名界面会“更好”。 (我说这是Simonyi的应用程序匈牙利语真正不悔改的粉丝。)

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

如果确实让你输入名字(并且Intellisense没有安慰),你可以使用带有using指令的namespace alias之类的东西。但是我会小心过度使用这些 - 我认为它使代码更难阅读。