Какое соглашение об именах для классов в проекте DataAccess? - PullRequest
8 голосов
/ 24 декабря 2009

Я обычно называю по классам в бизнес-проекте как Manager.cs, например BaseManager.cs, CommentsManager.cs, ProfileManager.cs и т. Д. *

Как вы называете свои классы в проекте DataAccess? Вы называете это CommentsDA, CommentsDB или как?

Просто любопытно ... Кстати, я использую .NET C #.

1 Ответ

14 голосов
/ 24 декабря 2009

Соглашения об именах между уровнями программного обеспечения

Раньше я разделял соглашения об именах классов для каждого типа программного слоя, как вы и просили Однако в мире .NET, осознав, что каждый слой является его собственной сборкой, и сборки часто заменяются сборками, реализующими один и тот же интерфейс / интерфейсы, я обнаружил, что пространство имен является наиболее важным / эффективным изменением, и отбросил префиксы и суффиксы для конкретных классов, по большей части.

Например, раньше у меня были Customer (бизнес) и CustomerDAL (уровень доступа к данным)

.. и это часто менялось в моих недавних проектах на соответственно ...

Com.Example.ProjectName.Business.Customer и Com.Example.ProjectName.Data.Customer с интерфейсом ICustomer, используемым между ними вместо прямого доступа к какому-либо конкретному классу в целевом проекте.

Значение именования классов изменяется из-за низкой сплоченности

Обычно, реализуя суффикс или префикс класса , вы пытаетесь предотвратить конфликт имен между тесно связанными сборками .

Однако обычно рекомендуется иметь слабосвязанные сборки с помощью интерфейсов ; побочный эффект - вы больше не используете конкретное имя класса. В противном случае, используя тесно связанные сборки, вы также можете объединить их в одну сборку, поскольку они напрямую зависят друг от друга, а преимущество от отдельных сборок уменьшается.

Иногда мое программное обеспечение использует более описательный подход, например классы Customer и CustomerData , и я понимаю, что для этого используется суффикс, но целью является естественный поток, а не предотвращение конфликты имен, потому что мой интерфейс находится между ними независимо.

В двух словах, низкая сплоченность ставит вопрос о том, какие классы должны / могли бы быть названы в любом слое проекта относительно друг друга. И поскольку у вас уже есть отдельные сборки для бизнеса и ответственность за данные, вы должны безоговорочно хотеть присутствовать низкой сплоченности. Таким образом, мой ответ в контексте разработки приложения: без суффикса или префикса класса объективно лучше в соответствии с концепцией вопроса.

Пример кода 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
        }
    }

}
...