Решил сделать чистильщик тв-программы. Чистильщик будет иметь два режима: первый - загрузка и обработка текстовых файлов (их может быть до 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 и редактируется согласно его переменным. Поэтому и хотел привязаться к первой строке с названием канала...
Мне кажется в данном случае ваш класс нарушает принцип 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
уже реализовывать весь функционал по обработке данных с формы.
Оборудование для ресторана: новинки профессиональной кухонной техники
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
Подскажите, пожалуйста, замедляют ли фреймворки скорость работы кода? Как будет код работать быстрее - на чистом php или на фреймворке? И защищает...
Не работают брейкпоинтыВ службах у себя Apache не нашел, может в этом причина