Интерфейсы и управление версиями - PullRequest
11 голосов
/ 05 сентября 2008

Я проектирую новую Систему, и у меня есть много Интерфейсов, которые со временем будут расти вместе с системой. Как лучше называть эти интерфейсы

ISomethingV01
ISomethingV02
etc

и я делаю это

public interface ISomething{
      void method();
}

тогда я должен добавить метод 2, так что теперь, что я делаю?

public interface ISomethingV2:ISomething{
      void method2();
}

или так же иначе?

Ответы [ 5 ]

7 голосов
/ 05 сентября 2008

Я думаю, что вы перегружаете интерфейсы.

Мейер и Мартин сказали нам: «Открыто для расширения, но закрыто для модификации!»

, а затем Квалина (и др.) Повторила:

Из Руководства по проектированию рамок ...

В целом, классы являются предпочтительными конструкция для выставления абстракций. Основным недостатком интерфейсов является что они гораздо менее гибки, чем классы, когда дело доходит до учета Эволюция API. Как только вы отправите интерфейс, набор его членов исправлено навсегда. Любые дополнения к интерфейс сломал бы существующие типы Реализация интерфейса.

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

alt text

5 голосов
/ 05 сентября 2008

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

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

Если вы изменили способ использования интерфейса, то вам нужно создать отдельный интерфейс (скорее всего, с другим именем) для поддержки этого альтернативного шаблона использования.

Даже если вы в конечном итоге создадите ISomething, ISomething2 и ISomething3, пользователям ваших интерфейсов будет непросто выяснить, в чем различия между интерфейсами. Когда они должны использовать ISomething2 и когда они должны использовать ISomething3? Затем вы должны начать процесс устаревания ISomething и ISomething2.

4 голосов
/ 05 сентября 2008

Я согласен с Гаро Йериазарян , изменение интерфейса является серьезным решением. Также, если вы хотите продвигать использование новой версии интерфейса, вы должны пометить старую версию как устаревшую. В .NET вы можете добавить Устаревший атрибут .

2 голосов
/ 05 сентября 2008

Я не знаю, почему люди понижают ваш пост. Я думаю, что хорошие правила именования очень важны.

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

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

2 голосов
/ 05 сентября 2008

Цель интерфейса - определить абстрактный шаблон, который должен реализовывать тип.

Было бы лучше реализовать как:

public interface ISomething

public class Something1 : ISomething
public class Something2 : ISomething

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

...