За последние 24 часа нас посетили 22118 программистов и 1118 роботов. Сейчас ищут 679 программистов ...

Повторяющийся код в нескольких классах - как избавиться?

Тема в разделе "PHP для новичков", создана пользователем Novak, 22 янв 2020.

Метки:
  1. Novak

    Novak Новичок

    С нами с:
    22 янв 2020
    Сообщения:
    2
    Симпатии:
    0
    У меня есть несколько классов, которые выполняют похожую функцию. Это парсинг разных источников. У них 60-70% одних и тех же методов. При этом есть методы, которые абсолютно идентичны, а есть методы, которые чуточку отличаются. Также есть методы с идентичным названием, но полностью разным содержимым. А также методы с разным типом или количеством входных параметров. В общем каша получается. Сейчас классы разделены по принципу - на каджый ресурс, который парсится, один класс. Но чем больше будет классов, тем сложнее будет поддерживать изменения в дублирующемся коде.

    Я понимаю, что повторяющийся код - это всегда плохо. Подскажите, гуру, как вы справляетесь с похожими проблемами? Код рабочий, но хочется, чтобы он был еще и грамотно написан.
     
  2. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.555
    Симпатии:
    1.754
    Вынести повторяющийся функционал в отдельный класс. У нас тут парсеры обсуждать нельзя, так бы я показал, что я выношу в общие классы для своих парсеров.
     
    AlexProg и Novak нравится это.
  3. Novak

    Novak Новичок

    С нами с:
    22 янв 2020
    Сообщения:
    2
    Симпатии:
    0
    Если я вынесу в отдельный класс некоторые методы, а некоторые оставлю, то у меня решается проблема с повторяющимся кодом, но появляется проблема с тем, что классы будут разделены на части не по принципу логической структуры, а по другому принципу. Это ОК? Это вопрос общий, мне не нужны примеры с парсерами, я хочу понять как это делается по-хорошему.
     
  4. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
  5. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.752
    Симпатии:
    1.322
    Адрес:
    Лень
    PHP:
    1. abstract class name
    2. {
    3.    // повторяющиеся методы
    4. }
    PHP:
    1. class Родитель1 extends [abstract class]
    2. { ... }
    PHP:
    1. class Родитель2 extends [abstract class]
    2. { ... }
    PHP:
    1. class Родитель3 extends [abstract class]
    2. { ... }
     
    AlexProg и Novak нравится это.
  6. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    Вам надо extend и trait...

    extend используется тогда когда есть объекты одного типа но отличающиеся некими методами и свойствами.. но имеющие общие принципы поведения.. делаете базовый класс типа ModelBase - в котором описываете то как модель должна работать...
    потом делаете классы у которых этот класс родительский... Order extend ModelBase и все объекты начинают сразу работать с БД используя методы родительского класса))

    trait используется тогда когда у Вас есть какие то одинаковые наборы методов описывающие поведение разных объектов...
    к примеру есть модели Order, Good, Category - и вы хотите в них добавить кэширование... а в остальные модели не хотите) делаете трейт что то типа Cacheable и в нужные модели его добавляете use Cacheable - и модели которые Вы хотите что бы обладали поведением кэширования сразу становятся кешируемые))

    пример с кэшированием очень вольный)) но тем не менее отображает принципы основные)
     
    Novak нравится это.
  7. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.555
    Симпатии:
    1.754
    Ну не обязательно наследование. Есть ещё агрегация :)
    --- Добавлено ---
    Но Занстру уже посоветовали, так что есть, что почитать.
     
  8. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.076
    Симпатии:
    1.237
    Адрес:
    там-сям
    Слишком общо́ описано. Я могу представить класс и декораторы к нему. :)
    --- Добавлено ---
    Парсинг это тоже плохо.
    --- Добавлено ---
    Если классы не родня по своей природе, но похожи во внешнем проявлении, то ИМХО, наследование не вариант, а вот примеси норм.
    --- Добавлено ---
    … или агрегация
     
    TeslaFeo нравится это.