Бгг... Ты и у своей девушки будешь требовать наличие привычной для тебя щетины с твоего фото? Volt(220), не смеши. В языках с динамической типизацией она не имеет смысла - все есть, пиши код и все будет работать и немаловажный плюс не надо писать надцать функций/методов (бриться каждый день).
Я не требую. Если взять, скажем, пример со switch, то либо придется писать код в case, либо в каждом case вызывать соответствующий метод/функцию. Таким образом либо усложняется читабельность, за счет втискивания разнородного кода в один метод, либо мы опять получаем эти "надцать функций/методов", только названных по-разному.
Это фикция. Практически во всех случаях лишний код будет заключаться в нескольких строчках сетапа параметров перед основным кодом метода, которые ничего не усложнят. Если у тебя приходится заключать основной код внутрь case и он разный в разных ветках - то стоит поправить в консерватории, а не жаловаться на язык. Учитесь делать декомпозицию.
Т.е. если один и тот же метод слишком по-разному обрабатывает разные данные, то скорей всего проблема в проектировании и/или алгоритме?
Скорей всего это должны быть два разных метода Смысл в перегрузке в том, чтобы мы с разными параметрами сделали фактически одно и тоже и выдали одинаковый результат. Если параметры разные, логика разная, результат разный... то что-то тут не так P.S. вставка в БД может принимать массив, объект, многомерный массив (массивов/объектов). Как несложно заметить работа со всем этим будет практически одинаковой итерируемся(возможно рекурсивно) и обрабатываем данные абсолютно одинаковой логикой. Можно для красоты добавить возможность передачи строки запроса - но это чаще всего только повредит (что и видно в этом примере, если мы уж передаем строку, то почему бы не использовать сразу метод $this->directQuery($sql) зачем мы толкаем ее в $this->insert() ?)
Просто временая неоптимизированность в связи с относительной молодостью. Это всё исправится в штатном режиме. Поспособствовать можно багрепортами
Не-не... параметры разные, логика разная, результат одинаковый. Все дело в том, что в данном случае мои кони более сферичны и вакуумность пространства плотнее. PHP: <?php $db->directQuery("insert ...."); $db->directQuery("update ...."); $db->directQuery("delete ...."); $db->directQuery("select ...."); ?> PHP: <?php $db->insert("insert ...."); $db->update("update ...."); $db->delete("delete ...."); $db->select("select ...."); ?> Второй вариант по-моему читабельнее. Особенно в общей массе кода. Ну и продолжая рассматривать вакуум, вдруг мне понадобиться что-то делать только при insert запросах.
первый вариант проще для мозга, ибо второй наталкивает на странные мысли о сознании его автора. а вот если убрать тавтологию то жить сразу становится проще PHP: <?php $db->insert("...."); $db->update("...."); $db->delete("...."); $db->select("...."); ?> это если я правильно понял все эти сфеерические вакуумные конизмы, упомянутые выше.
В смысле? параметры разные (строка и массив), логика разная(использовать строку и составить строку из массива по правилам), результат одинаковый (готовый запрос). Разве это не перегрузка? На какие? Что конкретно понимается под "это"? У меня пока работает именно второй вариант.
Дело в том, что если уж ковырять определения, то любые два метода с одинаковым названием уже перегружены. Но вопрос "перегрузка тут причем?" был как раз для того, чтобы подумать, почему у тебя методы с одинаковым названием но выполняющие очень разные вещи. Я уже писал Если пользоваться первым абзацем, то сложностей вообще нет никаких. Но и с "красотой" нет ничего невозможного (всего лишь +3 строки в методе) PHP: <?php // вариант только с массивами и объектами public function insert($params) { $sql = $this->buildQuery('insert', 'table', $params); return $this->execute($sql); } // + строка запроса public function insert($params) { if (is_array($params)) { $sql = $this->buildQuery('insert', 'table', $params); } else { $sql = $params; } return $this->execute($sql); } При излишнем усложнении ты получаешь геморрой и начинаешь жаловаться на отсутствие присутствующего. Поскольку даже приведенные тобой примеры ничего не показывают Тебя не затруднит привести пример с большей сферичностью, где возможности PHP были бы недостаточны для реализации параметрического или ad hoc полиморфизма (сиречь перегрузки) по отношению к методам? Поскольку в текущем варианте все есть и все работает
Потому что чтобы сломать пенопласт достаточно колена, а чтобы сломать бревно потребуется топор или пила. По-моему мы топчемся на месте... Насколько я понял основная мысль твоего сообщения - "В PHP есть средства для организации перегрузки. Используя их можно написать качественный код." Но это мы обсудили чуть раньше... Что я упускаю?
Не-не-не. Пенопласт то ты ломаешь, а вот бревно ты жуешь. В результате конечно получается примерно одинаковая крошка... но? почему ты это называешь словом "сломать" в обоих случаях? Я тебе помогу. Код (Text): sort(list) sort(array) Выполняем одинаковое действие (с разной внутренней логикой), над разными типами. P.S. чтобы тебе не казалось, что топчешься на одном месте - определись с целью дискуссии Я собирался всего лишь показать что перегрузка в PHP от рождения и слова об ее отсутствии не соответствуют действительности. Чего хочешь ты - тебе виднее.
Потому что "получается примерно одинаковая крошка". Т.е. мне важно не действие, но результат этого действия. А на мой взгляд это не перегрузка, а ее имитация/замена. Из этого похоже и возникла дискуссия. Но это лишь вопрос "привычки к понятию" и конкретному способу. Если это так, тогда я не вижу 1) что еще конструктивного можно здесь обсудить. 2) причин для изменения понимания мною этого понятия. =))
Но метод это таки действие А ты не с той стороны смотришь. Необходимость в перегрузке возникла из-за строгой типизации параметров. В динамических языках - эта проблема отсутствует как класс. Улавливаешь? У мальчиков нет критических дней
на такие простые мысли. если есть метод ->insert то какой смысл ему скармливать полноценный запрос начинающийся с инсерта? или я че не понял?
Чисто логическое деление. Так же к примеру insert запрос может использовать другого юзера для работы с базой нежели select