2015-07-08 1 views
1

У меня есть определенный класс Thing и интерфейс, который он реализует, с именем IThing. Все, кто использует IThing, могут предположить, что это действительно Thing, так как это единственный класс, который реализует этот интерфейс, но в то же время он понимает, что он может получить доступ только к определенному подмножеству публичных членов Thing, и есть неплохой дизайн причина для этого - в основном, IThing - это версия только для чтения Thing (это немного сложнее, но давайте притворимся, что это просто чтение и запись для решения вопроса).Имеет класс Thing, который реализует интерфейс IThing с плохой практикой?

Это хорошая конвенция, хотя? В качестве альтернативы я мог бы назвать этот интерфейс IThingReadOnly или назвать класс ThingWritable, или что-то вроде этого, но кажется, что эти имена будут громоздкими и менее читаемыми в большой базе кода.

Я также широко использую методы расширения для интерфейса и класса, поэтому у меня есть ThingExtensions и IThingExtensions. Это очень полезно, потому что каждый, кто читает код этих расширений, может работать из предположения, что он использует только публичные элементы Thing и IThing соответственно. Тем не менее, наличие как ThingExtensions, так и IThingExtensions файлов, сидящих рядом с проектом, по некоторым причинам немного сбиты.

Итак, какой вариант лучше - сохранить Thing и IThing рядом или переименовать один из них?

Update о близком голосовании:

Это вопрос на основе мнений, потому что это вопрос о наилучших практики - но это не вопрос прежде всего мнение на основе (пожалуйста, внимание различия). У SO есть много замечательных вопросов и ответов о лучших практиках, поэтому я думаю, что либо существует разница между этим вопросом и другим вопросом лучшей практики, который я не вижу, либо этот вопрос имеет такое же право на существование, как и любое другое передовой опыт.

+0

Является ли 'Thing' обозначенным внутренним и' IThing' общедоступным? Являются ли свойства и методы 'IThing' явно реализованы в' Thing'? –

+0

Нет, они оба публичные. Да, они явно реализованы. –

ответ

1

Прежде всего, я предлагаю использовать методы расширения только для типов, на которые у вас нет контроля, например. типы .NET, такие как IEnumerable. Однако вы можете рассмотреть возможность создания двух разных интерфейсов, одного базового интерфейса для чтения (давайте назовем его IThingRead) и другого, который представляет ваш фактический Thing-тип (IThingWrite) с некоторыми модификаторами записи.

В любом случае создание интерфейса для каждого класса является хорошей практикой и облегчает тестирование путем издевательства над вашими типами.

+0

Я не планирую использовать эти интерфейсы для насмешек, поэтому мне действительно не нужно 'IThingWrite'. Я использую только отдельный интерфейс для разделения доступа на запись из доступа только для чтения. –

+1

Методы расширения очень полезны с типами, которые вы контролируете, если этот тип является интерфейсом. –

0

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

Иначе продолжайте использовать IThing и Thing (это обычное соглашение об именах). Я бы создал только IThingExtensions, хотя

+0

Я описал еще одну причину использования отдельного интерфейса и класса в вопросе. –

 Смежные вопросы

  • Нет связанных вопросов^_^