Антропоморфизирующие интерфейсы - хорошая или плохая идея?

2

Я какое-то время пытался антропоморфизировать (что означает читаемый человеком) имена, которые я даю интерфейсам, для меня это то же самое, что дать интерфейсу имя на основе роли - попытка захватить цель интерфейса в названии.

У меня была дискуссия с другими разработчиками, которые считают, что это немного странно и по-детски.

Что думают люди SO?

Примеры (синтаксис С#):

public interface IShowMessages
{
    void Show(string message);
    void Show(string title, string message);
}

public class TraceMessenger : IShowMessages
{
}

public interface IHaveMessageParameters
{
    IList<string> Parameters { get; }
}

public class SomeClass : IHaveMessageParameters
{
}
  • 0
    public interface IHazTehCodez{IList<Codez> Codez{get;}}
  • 0
    Так IDisposable должен был быть IAmDisposable? Но как это применяется в Java, где не принято префиксировать интерфейсы с помощью «I»?
Показать ещё 1 комментарий
Теги:
design
interface

9 ответов

1
Лучший ответ

Интерфейсы описывают поведение, поэтому я называю их так, чтобы сообщать о поведении, которое они выполняют. Это "обычно" означает, что имя - это глагол (или наречие) или некоторая форма описания действия. В сочетании с интерфейсом "I" для интерфейса это похоже на то, что вы делаете...

ICanMove, IControllable, ICanPrint, ISendMesssages и т.д.

используя наречия, как в IControllable, IDisposable, IEnumerable и т.д., передает ту же мысль, что и глагольная форма, и является термином, поэтому я также использую эту форму...

Наконец, более важно (или, по крайней мере, не менее важно), чем то, что вы называете интерфейсом, заключается в том, чтобы поддерживать интерфейсы, которые вы проектируете как маленькие и логически содержащиеся, насколько это возможно. Вы должны стремиться к тому, чтобы каждый интерфейс представлял как малое и логически связанное множество методов/свойств, насколько это возможно. Когда интерфейс имеет настолько много в нем, что нет очевидного имени, которое бы описывало все поведение, которое оно задает, это признак того, что в нем слишком много, и что его нужно реорганизовать на два или более меньших интерфейса. Таким образом, игровые интерфейсы в том виде, в котором вы предлагаете, помогают обеспечить такой тип организационного дизайна, что хорошо.

10
  • 0
    Жаль, что нет отдельного голосования за самый смешной ответ. ;)
  • 3
    Мнения хорошие. Оправдания лучше.
Показать ещё 8 комментариев
4

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

Однако использование длинных идентификаторов не делает ваши идентификаторы более "читаемыми". Для любого разумно опытного программиста "tmp" передает столько информации, сколько "временная переменная". То же самое касается "i" и "dummyCounter" и т.д.

В вашем конкретном примере имена интерфейсов на самом деле очень раздражают, так как кто-то, кто использовал для разработки объектно-ориентированных систем, будет читать наследование как "is a". И "SomeClass - это IHaveMessageParameters" звучит глупо.

Попробуйте вместо этого использовать IMessagePrinter и IMessageParameterProvider.

3

Да, это звучит неплохо.

Какая альтернатива?

Код должен быть удобочитаемым для человека. Любой дурак может написать код, который компьютер может понять. Трудная часть - это код, который человек может понять.

Люди должны поддерживать код, поэтому очень важно, чтобы он был максимально прост в обслуживании - это включает в себя, что код должен быть максимально читабельным.

1

В примерах OP антропоморфный способ хорошо сопоставляется с альтернативами - например: IShowMessages против чего-то типа IMessageShower. Но - это не всегда так. Интерфейсы, которые я использовал при программировании игровых объектов: IOpenClosable и ILockable. Альтернативы, такие как ICanBeOpenedAndClosed и ICanBeLocked, будут более подробными. Или вы можете просто сделать IAmOpenClosable и IAmLockable, но тогда вы бы добавили "Am" только для антропоморфного эффекта без реальной информационной выгоды. Я все свожу к минимуму многословия, если передано такое же количество информации.

1

По моему мнению, этот подход просто добавляет большую нагрузку на разработчиков, чтобы придумать такие имена, поскольку он интегрирует я как часть предложения. Например, я не считаю IDisposable более трудным для чтения, чем ICanBeDisposed.

1

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

Но суть в том, что работает для вас и понимается вами и вашей командой в порядке. Вы должны пойти с тем, что работает.

  • 0
    Вот почему я упомянул синтаксис C #, Исторически я пришел из Windows C ++ \ COM фона, и это обозначение застрял JSUT. Я знаю, что многие люди не используют синтаксис «я» ...
0

Умышленное использование соглашения "Я для интерфейса" у первого лица кажется немного глупым, чтобы быть честным. То, что начинается, как милый каламбур, становится невозможным последовательно следовать, и в конечном итоге заканчивается смысловым смыслом. Тем не менее, ваш отдельный пример читается достаточно ясно, и у меня не было бы проблем с ним.

0

До тех пор, пока семантика того, что пытается быть достигнута, не потеряна, и терпение не будет непоправимо скомпрометировано (IDoLotsOfThingsWhichIncludesTheFollowingColonSpace...). Я вообще не думал бы об этом, кроме меня. Тем не менее, существует множество контекстов, в которых терпение имеет первостепенное значение, в котором это было бы неприемлемым.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню