Каково соглашение о присвоении имен для классов в Проекте DataAccess?

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

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

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

8
задан Prabhu 23 December 2009 в 23:20
поделиться

1 ответ

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

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

Например, у меня был Customer (business) и 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 - Сборка 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 - Уровень доступа к данным

Ссылка на общую сборку.

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
        }
    }

}
15
ответ дан 5 December 2019 в 11:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: