【问题标题】:What's the naming convention for classes in the DataAccess Project?DataAccess 项目中类的命名约定是什么?
【发布时间】:2010-12-29 16:16:10
【问题描述】:

我通常在业务项目中按类命名为 Manager.cs,如 BaseManager.cs、CommentsManager.cs、ProfileManager.cs 等...

如何命名 DataAccess 项目中的类?你叫它 CommentsDA、CommentsDB 还是什么?

只是好奇...顺便说一句,我使用的是 .NET C#。

【问题讨论】:

    标签: c# .net naming-conventions class n-tier-architecture


    【解决方案1】:

    软件层之间的命名约定

    我曾经像您询问的那样为每种软件层分离类命名约定。然而在 .NET 世界中,一旦意识到每一层都是它自己的程序集,并且程序集通常可以用实现相同接口的程序集替换,我发现命名空间是最重要/有效的变化,并删除了特定于类的前缀和后缀,大多数情况下。

    比如我以前有Customer(业务)和CustomerDAL(数据访问层)

    .. 这在我最近的项目中经常更改分别为 ...

    Com.Example.ProjectName.Business.CustomerCom.Example.ProjectName.Data.Customer 在它们之间使用ICustomer 接口,而不是直接访问目标项目中的任何特定类。

    低内聚改变了类命名的重要性

    通常,通过实现类后缀或前缀,您可以防止紧密耦合的程序集之间发生命名冲突

    但是,通常建议通过接口来使用松散耦合的程序集;副作用是您不再直接使用具体的类名。否则,通过使用紧密耦合的程序集,您不妨将它们组合成一个程序集,因为它们直接相互依赖,而单独程序集的好处就会减少。

    有时我的软件采用更具描述性的方法,例如 CustomerCustomerData 类,我意识到这是使用后缀,但其目的是为了自然流动,而不是为了防止命名冲突,因为无论如何我的接口都位于它们之间。

    简而言之,低内聚使问题变得没有意义,即在项目的任何层中相对于彼此应该/可以/将命名哪些类。而且因为您已经有单独的业务程序集和数据责任,你必须隐含地希望存在低内聚性。因此,根据问题的概念,我在应用程序设计方面的回答是客观上没有类后缀或前缀更好

    C# 代码示例

    为了一个有用的代码示例,我包含以下 C# 框架来显示我倾向于使用的类命名策略(或者缺少策略可能更准确)。

    注意:这个例子在某些方面是不完整的,但展示了类命名在程序集之间是如何无关紧要的概念(即使它是相同的类名),因为它们是使用接口分隔的。

    Business.dll - 业务层组装

    参考 Shared.dll 程序集。

    namespace Com.Examle.MyProject.Business {
        using Com.Example.MyProject.Shared; // for ICustomer
    
        class Customer {
            // Reference obtained to an ICustomer implementation (not shown).
            // Composition of the data customer, just for illustration purposes
            ICustomer _cust;
    
            // From business, a data access usage example:
            public void GetData() {
                _cust.SaveToDataSource();
            }
        }
    }
    

    业务使用 ICustomer,而不是硬连线到 Data.dll 程序集。

    Shared.dll - 共享程序集 - 通用类型被引用到业务和数据程序集中。

    // This is the only required link between business and data assemblies. 
    // Business is shielded from Data concrete class names and vice-versa. 
    namespace Com.Example.MyProject.Shared {
        public interface ICustomer {
            void SaveToDataSource();
        }
    }
    

    Data.dll - 数据访问层

    参考 Shared.dll 程序集。

    namespace Com.Example.MyProject.Data {
        using Com.Example.MyProject.Shared; // for ICustomer
    
        class Customer : ICustomer { // implement ICustomer - other assemblies can too
            public void SaveToDataSource() {
                // logic to save data to the data source
            }
        }
    
    }
    

    【讨论】:

    • 其实我一般都是有后缀而不是前缀...cmetsManager,或者cmetsDB。所以你是说去掉后缀?
    • 是的,我修改了答案以包含“后缀”
    • @JohnK,你能在这里回答我的问题吗:stackoverflow.com/questions/14366815/…?它专门针对这个问题。谢谢。
    • 很好的答案!我也使用了CustomerDal 并移到了Customer
    • @JohnK,我通常更喜欢将具有这些接口的程序集称为“ProjectName.Types”......因为接口通常定义和鼓励类型系统,可以这么说。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-15
    • 2012-11-25
    • 2010-11-26
    • 2011-08-20
    • 2012-11-09
    • 2011-10-06
    • 2022-06-28
    相关资源
    最近更新 更多