Необходимо ли создать интерфейс, когда там (в настоящее время) будет только одним классом, который реализует его?

add_filter('term_link', function( $url, $term, $taxonomy ) {
    if( $term -> term_id == 120 ) // 120 is the term ID which you want to change
        $url = "http://exapmle.com";

    return $url;
}, 10, 3);
6
задан Davy8 6 April 2009 в 02:39
поделиться

6 ответов

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

Теперь, когда не означает игнорировать возможность интерфейса - думают об открытых методах объекта и такой глазом к созданию интерфейса позже, но не создают помехи Вашей кодовой базе ничем, в чем Вы на самом деле не НУЖДАЕТЕСЬ.

8
ответ дан 8 December 2019 в 12:22
поделиться

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

Например, Платформа.NET команда Библиотеки классов Bas призналась в преждевременной разработке ICollection когда это включало a SyncRoot свойство. Для более позднего дженерика ICollection<T> они решили удалить его (http://blogs.msdn.com/bclteam/archive/2005/03/15/396399.aspx).

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

3
ответ дан 8 December 2019 в 12:22
поделиться

Всегда будет тест, которые используют его, право (Вы делаете модульные тесты, не так ли?). Что означает, что это всегда N + 1 класс, которые используют его, где N является количеством классов, которые используют Ваш класс в приложении.

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

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

3
ответ дан 8 December 2019 в 12:22
поделиться

Я сказал бы, что это зависит больше от того, сколько мест Вы собираетесь использовать класс, и меньше на том, сколько классов могло бы возможно реализовать интерфейс. Если бы Вы только используете Папку в одном или двух местах затем, я сказал бы, ожидают, пока нет фактическая потребность для интерфейса, прежде чем Вы реализуете его и осуществите рефакторинг. Однако, если Папка будет используемой в 100 различных местах, то можно сэкономить некоторое время путем программирования к интерфейсу впереди.

2
ответ дан 8 December 2019 в 12:22
поделиться

Думайте об интерфейсе как о контракте для определения семантики или понятия. Это - общий подход и не действительно конкретный язык. В контексте OO, если Вы работаете в модели единичного наследования, существует превосходный случай, который будет сделан для предпочтения интерфейсов по классам для определения Вашей объектной модели, так как та единственная трасса суперкласса довольно драгоценна, и Вы хотите сохранить его для чего-то более 'существенного', чем определение свойств, которые выставляются на объекте или методах.

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

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

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

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

Надежда, которая помогает.

2
ответ дан 8 December 2019 в 12:22
поделиться

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

1
ответ дан 8 December 2019 в 12:22
поделиться
Другие вопросы по тегам:

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