Как правильно прикрутить класс?

134
28 апреля 2018, 16:59

Решил сделать чистильщик тв-программы. Чистильщик будет иметь два режима: первый - загрузка и обработка текстовых файлов (их может быть до 30, но названия не меняются), второй - когда копируешь текст одного файла, вставляешь в <textarea> и получаешь результат. Для первого режима почти все готово и вроде пока он работает. Я сделал класс и прописал переменные:

public $fileName, $startTime, $endTime, $findAndDelete;
public function Raw(){...}
public function Del($array){...}

Здесь указаны, соответственно:

название файла для обработки, время начала тв-программы, время ее конца (остальное за пределами времен удаляется или переносится в следующий день). Raw() читает файлы построчно с помощью file() приводит к нормальному виду и возвращает массив. Del() удаляет все лишнее в соответствии с $findAndDelete из полученного массива Raw() и возвращает обработанный массив.

Например, для канала Discovery будет выглядеть следующим образом:

$disc_eu_s = new Channel;
$disc_eu_s->fileName = 'disc_eu_s.txt';
$disc_eu_s->startTime = '10:00';
$disc_eu_s->endTime = '02:00';
$disc_eu_s->findAndDelete = array(
    '~с Беаром Гриллсом~u',
    '~с Эдом Стаффордом~u'
);
result( $disc_eu_s->del( $disc_eu_s->raw() ) );

Итак, вопрос.

Как правильно "прикрутить" класс ко второму режиму так, чтобы оба режима обрабатывали текст одинаково вне зависимости от того, я загрузил его как файл или открыл файл скопировал и вставил текст?

В первом режиме файлы читаются построчно и во втором режиме вставленный текст тоже будет читаться построчно explode("\n", ...). Единственное, что я зря сделал, это завел переменную public $fileName, - она бесполезна для второго режима. Кстати, вот что еще общего у обоих режимов (что может помочь в моем вопросе) - это первая строка в файле и первая строка во вставленном тексте, - здесь указано название канала, но как здесь правильно подвязаться?

P.s Я забыл в своем вопросе обозначить один важный момент. Обработка в первом режиме происходит согласно плану, то есть, если файл disc_eu_s.txt, то время начала и конца, а также findAndDelete у него соответствующие. И если я открываю этот же файл, копирую содержимое и вставляю в textArea, то приложение (если можно так сказать) должно распознать, что это текст будто из disc_eu_s.txt и редактируется согласно его переменным. Поэтому и хотел привязаться к первой строке с названием канала...

Answer 1

Мне кажется в данном случае ваш класс нарушает принцип SOLID SRP. Получается сейчас у класса две обязанности: получение данных и их переработка в методе del.

Я бы сделал так:

1) Инкапсулировал данные в конструктор.

2) В конструктор Channel передавал дополнительно некий объект вместо disc_eu_s.txt

Получилось бы так:

$disc_eu_s = new Channel(new DataFile('$fileName'),'10:00', '02:00', findAndDelete); //для режима с файлом

$disc_eu_s = new Channel(new DataTextArea(),'10:00', '02:00', findAndDelete);//для режима с полем. Можно передавать конструктору название поля, тут уж как вы считаете нужным.

$disc_eu_s->fileName из класса убрать.

Методу Raw() передавать на вход объект данных, который будет вызывать его методы для извлечения строк.

interface idata{
public function Raw();
}
Class DataFile implements idata{
...
}
Class DataTextArea implements idata{
...
}

И в DataTextArea уже реализовывать весь функционал по обработке данных с формы.

READ ALSO
Замедляет ли php framework скорость работы кода?

Замедляет ли php framework скорость работы кода?

Подскажите, пожалуйста, замедляют ли фреймворки скорость работы кода? Как будет код работать быстрее - на чистом php или на фреймворке? И защищает...

197
Не могу настроить в Visual Studio Code - PHP Debug

Не могу настроить в Visual Studio Code - PHP Debug

Не работают брейкпоинтыВ службах у себя Apache не нашел, может в этом причина

138
Как работать с for в twig?

Как работать с for в twig?

Искал в google,но так и не разобрался как в twig написать :

159