Они делают тоже самое что и у тебя, просто они сгрупированы по разным классам и имеют свои контексты. Как показывает моя практика процедурный код - не позволяет подменять поведение без изменения кода, ООП код (я имею ввиду не классы как контейнеры для функций) поведение позволяет подменить, ну или как минимум позволяет это сделать более выразительно (за меньшее количество строк).
Вот тебе лайв пример:
Процедурка, немного строчек, все как ты любишь
function export($sql)
{
$data = getData($sql);
$content = prepareContent($data);
download($content);
}
export("SELECT * FROM users");
ООП вариант, различий в логике практически нет,
class Export
{
public $dataProvider;
public $contentDriver;
public $output;
public function download($sql)
{
$data = $this->dataProvider->getData($sql);
$this->contentDriver->setData($data);
$this->output->put($this->contentDriver);
}
}
$export = new Export;
$export->dataProvider = new DataProvider;
$export->contentDriver = new ContentProvider;
$export->output = new Output;
$export->download("SELECT * FROM users");
Вроде бы логично, что процедурка рулит, а нет, приходит смена требований,
нужно в зависимости от количества данных выдавать разный контентФункция export, ПЕРЕПИСЫВАЕТСЯ на половину, логика УСЛОЖНЯЕТСЯ, добавляются ДВЕ НОВЫХ функции, которые не могут наследовать функционал от предыдущей фунции prepareContent, а могут лишь только вызвать ее полностью.
function export($sql)
{
$data = getData($sql);
if (count($data) > 100000) {
$content = prepareCsvContent($data);
} else {
$content = prepareXmlContent($data);
}
download($content);
}
Возможно ты подумаешь, что можно и так
function prepareContent($data)
{
if (count($data) > 100000) {
$content = prepareCsvContent($data);
} else {
$content = prepareXmlContent($data);
}
return $content;
}
function export($sql)
{
$data = getData($sql);
$content = prepareContent($data);
download($content);
}
Но это приводит к тем же результатам, ты вносишь ЗНАЧИТЕЛЬНЫЕ ИЗМЕНЕНИЯ в существующую функциональность, просто по ветке вызова это будет немного дальше.
В ООП вариант будет лишь ОДНО НЕЗНАЧИТЕЛЬНОЕ ИЗМЕНЕНИЕ (в передаче зависимостей) и ТРИ НОВЫХ класса, два из которых при необходимости могут НАСЛЕДОВАТЬ функциональность устаревшей версии функционала
class ContentProviderManager
{
public function setData($data)
{
if (count($data) > 100000) {
$this->contentProvider = new ContentProviderCsv;
} else {
$this->contentProvider = new ContentProviderXml;
}
$this->contentProvider->setData($data);
}
public function __toString()
{
return $this->contentProvider->__toString();
}
}
$export = new Export;
$export->dataProvider = new DataProvider;
$export->contentDriver = new ContentProviderManager;
$export->output = new Output;
$export->download("SELECT * FROM users");
Если ты считаешь, что существенно изменять существующий код это в разы лучше чем создавать новый, то у меня нет больше аргументов.
_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации