Расширение/изменение простого скрипта

abracadabra

Новичок
Есть относительно простой скрипт (350 строчек, что выполняет - не важно, но вообще это callback на вызов платёжной системы), задача который расширить. При этом поведение скрипта несколько меняется, но новое поведение должно быть доступно только при включении соответствующей настройки (пусть просто булева переменная $new).
Скрипт - это простой код без классов.

Проблема состоит в том, что дописание кода с использованием конструкции if (if($new) {/*новое поведение*/} else {/*старое поведение*/}), постепенно превращает код в гордеев узел для чтения. Затем может понадобиться и ещё что-то дописать и код будет устрашающе расти и запутываться.

Решение превратить код в класс, разделить всё выполнение на методы, а затем наследованием расширить этот класс до нового класса, переопределив только те методы, которые поменялись - красивое, но существует вероятность при превращении исходного кода в класс что-то забыть, что-то напутать (например, какую-то переменную, которая должна быть доступна во всех методах, забыть сделать свойством объекта класса), и в итоге что-то где-то сломается, то есть нужно будет ещё одно серьёзное тестирование (тестировать данный скрипт не очень просто, так как он много что меняет в базе и уследить за всем не просто).

Пытаясь найти идеальную середину между читаемостью кода (простотой последующего расширения) и Гиппократовским принципом "не навреди", что посоветуете?

Спасибо большое!
 

Larson

Новичок
А что мешает сделать два скрипта - старый и новый и подключать (вызывать) их в зависимости от требуемого поведения?
 

abracadabra

Новичок
AmdY
Мммм... мммм... неприятно показаться тупым, но не настолько хорошо читаю английский, чтобы в большом тексте сразу выхватить то, что было предложено прочесть =) Напиши, пожалуйста, ссылку с якорем на конкретный раздел текста. Спасибо большое!

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

AmdY

Пью пиво
Команда форума
abracadabra
смотри, там создаётся просто слушатель, который может перехватывать управление, типо preInsert - postInsert
в класс добавляются нужные слушатели $this->addListener(new TimestampListener());

соотвеветственно в основном классе делается проверка
PHP:
final public function insert($data) {
    .....
    foreach($this->getListen() AS $listen) { // вызываем слушателей
          $listen->preInsert($event);
    }
    .....
    if (!$event->isPropagationStopped()) {
        // выполняем код по умолчанию
    }
}
 
Сверху