У меня есть несколько классов, которые выполняют похожую функцию. Это парсинг разных источников. У них 60-70% одних и тех же методов. При этом есть методы, которые абсолютно идентичны, а есть методы, которые чуточку отличаются. Также есть методы с идентичным названием, но полностью разным содержимым. А также методы с разным типом или количеством входных параметров. В общем каша получается. Сейчас классы разделены по принципу - на каджый ресурс, который парсится, один класс. Но чем больше будет классов, тем сложнее будет поддерживать изменения в дублирующемся коде. Я понимаю, что повторяющийся код - это всегда плохо. Подскажите, гуру, как вы справляетесь с похожими проблемами? Код рабочий, но хочется, чтобы он был еще и грамотно написан.
Вынести повторяющийся функционал в отдельный класс. У нас тут парсеры обсуждать нельзя, так бы я показал, что я выношу в общие классы для своих парсеров.
Если я вынесу в отдельный класс некоторые методы, а некоторые оставлю, то у меня решается проблема с повторяющимся кодом, но появляется проблема с тем, что классы будут разделены на части не по принципу логической структуры, а по другому принципу. Это ОК? Это вопрос общий, мне не нужны примеры с парсерами, я хочу понять как это делается по-хорошему.
PHP: abstract class name { // повторяющиеся методы } PHP: class Родитель1 extends [abstract class] { ... } PHP: class Родитель2 extends [abstract class] { ... } PHP: class Родитель3 extends [abstract class] { ... }
Вам надо extend и trait... extend используется тогда когда есть объекты одного типа но отличающиеся некими методами и свойствами.. но имеющие общие принципы поведения.. делаете базовый класс типа ModelBase - в котором описываете то как модель должна работать... потом делаете классы у которых этот класс родительский... Order extend ModelBase и все объекты начинают сразу работать с БД используя методы родительского класса)) trait используется тогда когда у Вас есть какие то одинаковые наборы методов описывающие поведение разных объектов... к примеру есть модели Order, Good, Category - и вы хотите в них добавить кэширование... а в остальные модели не хотите) делаете трейт что то типа Cacheable и в нужные модели его добавляете use Cacheable - и модели которые Вы хотите что бы обладали поведением кэширования сразу становятся кешируемые)) пример с кэшированием очень вольный)) но тем не менее отображает принципы основные)
Ну не обязательно наследование. Есть ещё агрегация --- Добавлено --- Но Занстру уже посоветовали, так что есть, что почитать.
Слишком общо́ описано. Я могу представить класс и декораторы к нему. --- Добавлено --- Парсинг это тоже плохо. --- Добавлено --- Если классы не родня по своей природе, но похожи во внешнем проявлении, то ИМХО, наследование не вариант, а вот примеси норм. --- Добавлено --- … или агрегация