Интерфейсы и версии

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

ISomethingV01
ISomethingV02
etc

и я делаю это

public interface ISomething{
      void method();
}

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

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

или другим способом?

Ответ 1

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

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

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

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

Ответ 2

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

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

а затем Cwalina (и др.) повторили:

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

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

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

alt text

Ответ 3

Я согласен с Garo Yeriazarian, изменение интерфейса - серьезное решение. Кроме того, если вы хотите продвигать использование новой версии интерфейса, вы должны пометить старую версию как устаревшую. В .NET вы можете добавить ObsoleteAttribute.

Ответ 4

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

Лучше реализовать его как:

public interface ISomething

public class Something1 : ISomething
public class Something2 : ISomething

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

Ответ 5

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

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

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