Альтернатива перезаписи методов в расширенных классах, особенно в моделях MVC - PullRequest
0 голосов
/ 16 марта 2012

Я чувствую, что, вероятно, существует хорошо продуманный шаблон проектирования для обработки ситуаций, подобных приведенной ниже, но я достаточно опытен, чтобы с ним столкнуться!

Основная проблема

Суть проблемы в том, что у меня есть myClass с методом myMethod, и у меня есть класс extClass, который расширяет myClass, и я хочу, чтобы myMethod имел слегка другое поведение в extMethod, тогда я могу перезаписать метод в расширенном классе, но затем я получу дублированный код.

Конкретные детали

Конкретная проблема, котораяЯ пытаюсь разобраться с использованием MVC, где у меня есть базовый класс модели, который определяет, как выполняются вставки и удаления.Для некоторых таблиц базы данных я реализовал управление версиями записей, которое выполняется с помощью класса version_model, который расширяет базовый класс и перезаписывает методы вставки / удаления, добавляемые в триггеры, для создания версий записей.Это все хорошо, за исключением того, что для некоторых конкретных моделей таблиц базы данных я хочу определить пользовательские методы вставки / удаления, которые будут автоматически обрабатывать вставки в нумерованные таблицы (например, таблица таблиц> адреса).Это нормально, за исключением случаев, когда мне нужно скопировать код из version_model или base_model в зависимости от того, какой из них расширяется.

Я думал, что это может быть решено с помощью хуков, поэтому мои методы вставки / удаления version_model и base_modelвызвал методы before_insert () и after_insert (), тогда я мог бы добавить дополнительную функциональность, не дублируя базовую функциональность.Есть ли лучший способ сделать это?

1 Ответ

1 голос
/ 16 марта 2012

Отделите код, который отличается от кода, который является общим, сохраните общий код в суперклассе и вызовите метод родителя из подкласса, например, (php)

protected function subclass_method() {
    $data = parent::superclass_method();

    // do stuff with data
}

Подход ловушек также работает, вв этом случае вы делаете более или менее то же самое, но помещаете логику в суперкласс, который является примером шаблона метода шаблона .

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

...