Форум программистов, компьютерный форум, киберфорум
Наши страницы
PHP: ООП
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
bnt
0 / 0 / 0
Регистрация: 10.11.2016
Сообщений: 3
1

Правильное понимание и обоснование использования полиморфизма

08.12.2016, 16:40. Просмотров 1055. Ответов 34
Метки нет (Все метки)

Всем привет!
Помогите понять полиморфизм правильно. Так как примеров в Интернете много и все они отличаются друг от друга.

Как я его понимаю. Это когда свойство базового класса может использовать методы производных классов.

Пример кода.
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
class user {
 
    public $type = 'default_user';
 
    public function setName (){
    
    }
    public function Call (){
          return $this->setName();
    }
}
 
 class admin extends user {
     public function setName (){
         return $this->type = "admin<br>";
     }
 }
 
class superUsers extends user {
    public function setName (){
        return $this->type = "superUser";
    }
 
}
 
$super = new superUsers;
$admin = new admin;
$superUser = new superUsers;
 
 
echo $super->call();
echo $admin->setName();
echo $superUser->test();
Но часто можно встретить примеры где пишут вот так.

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
class user {
 
    public $type = 'default_user';
 
    public function setName (){
    
    }
    public function Call (){
          return $this->setName();
    }
}
 
 class admin extends user {
     public function setName (){
         return $this->type = "admin<br>";
     }
 }
 
class superUsers extends user {
    public function setName (){
        return $this->type = "superUser";
    }
 
}
$super = new superUsers;
$admin = new admin;
$superUser = new superUsers;
 
 
echo $super->call();
echo $admin->setName();
echo $superUser->test();
Или вообще не пишут в базовом классе метод setName.
Все приведенные мной примеры показывают полиморфизм или только первый ?
Заранее спасибо !
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.12.2016, 16:40
Ответы с готовыми решениями:

Не понимание полиморфизма и статического поля на примере представленного кода
Здравствуйте, Объясните мне пожалуйста по следующему коду: using System;...

Правильное понимание
ifstream file; file.open(way1.c_str()); getline(file, name);...

Правильное понимание последовательности арифметических операций
int i = 2; i+=i++ + ++i *i ++; То есть выражение можно разписать как i = i...

Смысл использования полиморфизма
#include &lt;iostream&gt; using namespace std; class A{ public: virtual...

Правильное понимание того, как работает ввод вывод в С++
Начал изучать тему ввода-вывода данных. Сделал схему, посмотрите ее...

34
Jodah
Эксперт PHP
2772 / 2425 / 1034
Регистрация: 01.08.2012
Сообщений: 8,562
08.12.2016, 17:19 2
Цитата Сообщение от bnt Посмотреть сообщение
Но часто можно встретить примеры где пишут вот так.
Кажется вы 2 раза один и тот же код показали.

Цитата Сообщение от bnt Посмотреть сообщение
Все приведенные мной примеры показывают полиморфизм или только первый ?
1. Метод call() потомок вызывает у родителя, поэтому да, полиформизм.
2. Полиформизм не показан, но присутствует - у admin есть возможность вызвать setName() родителя.
3. Будет ошибка, метод test() нигде не объявлен.
0
bnt
0 / 0 / 0
Регистрация: 10.11.2016
Сообщений: 3
08.12.2016, 17:48  [ТС] 3
Извиняюсь..

Вариант 1

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
class user {
 
    public $type = 'default_user';
 
    public function setName (){
 
    }
    public function Call (){
          return $this->setName();
    }
}
 
 class admin extends user {
     public function setName (){
         return $this->type = "admin";
     }
 }
 
class superUsers extends user {
    public function setName (){
        return $this->type = "superUser";
    }
 
}
 
 
 
 
$super = new superUsers;
$admin = new admin;
 
 
 
echo $super->call();
echo $admin->call();
Вариант 2

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
class user {
 
    public $type = 'default_user';
 
    public function setName (){
 
    }
 
}
 
 class admin extends user {
     public function setName (){
         return $this->type = "admin";
     }
 }
 
class superUsers extends user {
    public function setName (){
        return $this->type = "superUser";
    }
 
}
 
 
 
 
$super = new superUsers;
$admin = new admin;
 
 
 
echo $super->setName();
echo $admin->setName();
Бывает, что еще в базовом классе не пишут метод setName и говорят, что это полиморфизм.
0
zontik24
9 / 9 / 4
Регистрация: 14.06.2013
Сообщений: 386
08.12.2016, 19:43 4
bnt, да, все верно, override (переопределение) - тоже полиморфизм
0
Jewbacabra
Эксперт PHP
3501 / 2911 / 1301
Регистрация: 24.04.2014
Сообщений: 8,857
08.12.2016, 23:09 5
Цитата Сообщение от bnt Посмотреть сообщение
Как я его понимаю. Это когда свойство базового класса может использовать методы производных классов.
Полиморфизм - это один интерфейс, несколько реализаций. Достаточно знать о наличии у объекта определенных методов, при этом не обязательно знать какому классу они на самом деле принадлежат.
Цитата Сообщение от bnt Посмотреть сообщение
Бывает, что еще в базовом классе не пишут метод setName и говорят, что это полиморфизм.
Это особенность типизации php. Желательно все же в базовом классе указывать все необходимые методы, если в рамках данного класса нет возможности реализовать какой-либо метод его следует объявлять абстрактным. Таким образом код становится самодокументируемым, его легче поддерживать и читать другим программистам. В сочетании с возможностью указывать типы аргументов функции облегчает поиск ошибок.
0
bnt
0 / 0 / 0
Регистрация: 10.11.2016
Сообщений: 3
09.12.2016, 15:34  [ТС] 6
Полиформизм не показан, но присутствует - у admin есть возможность вызвать setName() родителя.
Вот этот момент не очень понятен. Это как не показан, но присутствует ? То есть если бы я использовал $admin->call(); , то был бы полиморфизм ? а если $admin->setName() , то не показан, но присутствует ?
Или все-таки как объяснили мне ниже если использую $admin->setName(); , то это переопределение (что тоже считается).

Народ, большое спасибо за ответы!!!)
0
Madrid
4 / 45 / 2
Регистрация: 26.12.2009
Сообщений: 382
24.12.2016, 20:37 7
Забей на этот полиморфизм.
Это все - ненужная академическая ерунда.
Кто это спрашивает на собеседовании - тот просто сам плавает и не понимает, чего хочет от программиста.
0
Jodah
Эксперт PHP
2772 / 2425 / 1034
Регистрация: 01.08.2012
Сообщений: 8,562
24.12.2016, 20:53 8
Madrid, пожалуйста, не спамьте по всем темам общие фразы про плохое ООП. Это никому не нужно и в решении задач не помогает. Если чешутся руки - создайте отдельную тему "ООП - зло" и изливайте там душу.
1
Madrid
4 / 45 / 2
Регистрация: 26.12.2009
Сообщений: 382
24.12.2016, 21:29 9
ООП нужно применять там, где это нужно!
Применение его там, где не нужно, признак лоха.

ООП - это только инструмент. Не принимайте все так близко к сердцу.
0
Jodah
Эксперт PHP
2772 / 2425 / 1034
Регистрация: 01.08.2012
Сообщений: 8,562
24.12.2016, 22:01 10
Цитата Сообщение от Madrid Посмотреть сообщение
ООП нужно применять там, где это нужно!
Хорошо, пусть так. Но человек спрашивает про основы ООП, а вы ему отвечаете, что всё это ерунда и изучать не стоит. Очевидно, вы не за ТСа радеете, а просто ищете повод, чтобы облить грязью один из подходов к программированию.
Цитата Сообщение от Madrid Посмотреть сообщение
Применение его там, где не нужно, признак лоха.
А кто решает, где применять ООП нужно, а где нет? Вот скажем, лендинг, блог, интернет-магазин - где здесь нужно использовать ООП? Если этой информации недостаточно, то по каким критериям это определять? Должна же быть какая-то система. Официальная, конечно, чтобы это было не просто вашим личным мнением.
Цитата Сообщение от Madrid Посмотреть сообщение
ООП - это только инструмент.
Только вы этого понять не можете. ООП - это возможность программно смоделировать какую-либо сущность. Чтобы товар был не просто массивом с названием и ценой, а чем-то более полноценным, обладающим своим поведением и состоянием.

Это совсем другой подход к построению приложений. И вопрос использования ООП должен решать сам программист в зависимости от личных предпочтений.

Поэтому я считаю, что если человек пишет в ООП стиле одностраничник, это ни в коем случае не характеризует его как лоха, а лишь отражает его вкус.
1
Madrid
4 / 45 / 2
Регистрация: 26.12.2009
Сообщений: 382
24.12.2016, 22:27 11
Кто-то более умный за {censored} ООП, отписавшихся тут, написал:
Все эти ваши инкапсуляции, private, protected, наследование, полиморфизм это {censored} мишура.

ООП, функциональщина или процедурщина это просто инструмент. Каждый из которых хорошо работает в одних кейсах и не работает в других.

Вообще, подавляющее большинство программистов вместо того чтобы решать задачи с помощью подходящих инструментов просто {censored} на свои любимые инструменты. Представьте плотника который наяривает на свой молоток, или слесаря который смотрит документальное кино с отвертками. Это просто смешно. Но так выглядит современное IT.

Простой пример: Иннокентию нужно забить гвоздь в стену. Он как прошаренный малый берет свой любимый молоток и забивает гвоздь. Потом ему нужно вкрутить винт. Он берет свой любимый молоток и забивает винт. Затем ему нужно вырыть яму. Он берет любимый молоток и роет им яму. Подумать головой и попробовать закрутить винт отверткой, а яму выкопать лопатой? Зачем? Кеша лучше поспорит с коллегами какую ручку лучше подбирать к молотку: деревянную или прорезиненную. А в свободное время поупражняется в вырезании узорчиков на ручке. Через пару десятков вырытых ям и общению с другими копателями, Кеша разочаровывается в молотке и начинает {censored} на лопату. Теперь он яростно доказывает коллегам что они лохи, молотки это прошлый век и вообще лопаты круче. И продолжает рыть ямы лопатой, завинчивать винты лопатой(заметьте, лопатой можно завинтить винт, а молотком нет) и забивать гвозди лопатой.

Узнали? Кеша - типичный {censored} с хабра в обнимку с ооп и функциональщиной.
Ну заодно оцените ущербность языков, не позволяющих использовать несколько парадигм.

Что стало с индустрией? Догматическое мышление во все поля. Какой-то очень важный человек сказал что функциональщина это {censored} и все принялись везде её пихать. Спорят что лучше статическая типизация или динамическая. Про макак от мира веба, которые берут скриптик из 2 строк, рисуют к нему красивое лого и называют технологией, я вообще молчу.

Повторюсь, то что обсуждается тут - {censored} мишура. Если геттеры, сеттеры или {censored} в данном случае лучшее решение, используте их. Если глобальная переменная в конкретном кейсе - оптимальный выбор, используйте её а не носитесь с "глобальные переменные это плохо потому что это плохо".

Главное помните что споры про подобные мелочи, это не что-то важное, а просто {censored} на узорчики на ручке молотка.
Добавлено через 2 минуты
Это, {censored}, даже тупая постановка вопроса.

"Типа пишу код, ходу сделать полиморфизм."

{censored}, тебе задачу нужно решить, или полиморфизм присобачить?

Добавлено через 21 минуту
Цитата Сообщение от Jodah Посмотреть сообщение
Хорошо, пусть так. Но человек спрашивает про основы ООП
Уже на хабре была статья, что наследование - говно.

Есть 2 подхода:
1. Решать задачу и искать подходящие способы ее решения.
2. Подстраивание решения задачи под "лучшие практики", описанные в интернете.

Цитата Сообщение от Jodah Посмотреть сообщение
а вы ему отвечаете, что всё это ерунда и изучать не стоит
Это именно ерунда.
Эти 3 кита ООП - ерунда.

Цитата Сообщение от Jodah Посмотреть сообщение
Очевидно, вы не за ТСа радеете, а просто ищете повод
Я просто помню, как сам ранее переводил свой код на ООП без понимания. Просто начитался, что нужно использовать только ООП, а все остальное - лоховство.

Цитата Сообщение от Jodah Посмотреть сообщение
Должна же быть какая-то система.
Вы же ниже сами написали, что программист должен сам думать головой, что использовать.

А, вообще, в вебе чрезмерное ООП не нужно.
Это ж просто вывод html-я.

Цитата Сообщение от Jodah Посмотреть сообщение
Чтобы товар был не просто массивом с названием и ценой, а чем-то более полноценным, обладающим своим поведением и состоянием.
Хм, какое поведение должно быть у товара на сайте?

Цитата Сообщение от Jodah Посмотреть сообщение
Поэтому я считаю, что если человек пишет в ООП стиле одностраничник, это ни в коем случае не характеризует его как лоха, а лишь отражает его вкус.
Если он решил сам писать так, с пониманием того самого ООП, то ок, вопросов нет.
А вот когда он так решил из-за хайпа - то он - лох. Сужу по себе, когда применял ООП без понимания.
0
Jodah
Эксперт PHP
2772 / 2425 / 1034
Регистрация: 01.08.2012
Сообщений: 8,562
24.12.2016, 23:06 12
Цитата Сообщение от Madrid Посмотреть сообщение
Кто-то более умный за {censored} ООП, отписавшихся тут, написал:
1. Только начали, и уже ярлык и оскорбление.
2. Цитату вам стоило бы перечитать, ведь это вы затеваете "споры про подобные мелочи" сразу в куче тем. Да ещё и вразумить пытаетесь тех людей, которые только учатся и сами ООП ещё слабо понимают.
Цитата Сообщение от Madrid Посмотреть сообщение
Это, {censored}, даже тупая постановка вопроса.
"Типа пишу код, ходу сделать полиморфизм."
Абсолютно нормальный вопрос. Человек хочет понять, что это.

Цитата Сообщение от Madrid Посмотреть сообщение
тебе задачу нужно решить, или полиморфизм присобачить?
Не присобачить, а изучить. И кто сказал, что изучение полиформизма - это не конечная задача? Может ТС в институте учится или просто любознательный.

Цитата Сообщение от Madrid Посмотреть сообщение
Уже на хабре была статья, что наследование - говно.
А я видел 10 статей, что процедурный подход отстой. И что?

Цитата Сообщение от Madrid Посмотреть сообщение
Это именно ерунда.
Эти 3 кита ООП - ерунда.
Звучит как "ручка молотка - это ерунда, а вот боёк - да, хорошая вещь". Даже если отбросить теорию, реализация 3 столпов в PHP позволяет существенно упростить код.

Цитата Сообщение от Madrid Посмотреть сообщение
Я просто помню, как сам ранее переводил свой код на ООП без понимания. Просто начитался, что нужно использовать только ООП, а все остальное - лоховство.
Так ТС и пытается понять.

Цитата Сообщение от Madrid Посмотреть сообщение
Вы же ниже сами написали, что программист должен сам думать головой, что использовать.
Нет, моя позиция заключается в том, что программист волен писать в том стиле, который ему нравится. Какая разница, делать магазин в ООП или процедурном стиле? Практически никакой, для заказчика уж тем более.

Ваша позиция - ООП больше подходит для одних ситуаций, процедуры - для других. Вот я и прошу описать, в каких конкретных случаях использовать ООП неправильно.

Цитата Сообщение от Madrid Посмотреть сообщение
А, вообще, в вебе чрезмерное ООП не нужно.
Это ж просто вывод html-я.
Ну уж далеко не только вывод html. Для парсинга чего-либо html не нужен, однако же времени на разработку можно потратить прилично.

Цитата Сообщение от Madrid Посмотреть сообщение
Хм, какое поведение должно быть у товара на сайте?
Поменяли размеры товара -> автоматически поменялся объём -> автоматически перерасчиталась стоимость доставки.

Изменили характеристики товара -> автоматически изменилось название (актуально для магазинов техники, где названия типа ПК Офигенный i3-3220 | 4Gb PC-3200 | 500Gb | DVD)

Цитата Сообщение от Madrid Посмотреть сообщение
А вот когда он так решил из-за хайпа - то он - лох.
Я так не считаю. Это нормальная эволюция программиста. Начать с процедурного стиля - узнать, что ещё есть ООП - начать изучение - набыдлокодить - (повторить предыдущие 2 пункта n раз) - познать дзен.
1
Madrid
4 / 45 / 2
Регистрация: 26.12.2009
Сообщений: 382
24.12.2016, 23:57 13
Цитата Сообщение от Jodah Посмотреть сообщение
1. Только начали, и уже ярлык и оскорбление.
1.

Тема {censored} была в цитате. Поэтому так. Вы же {censored} на ООП, раз так задело? Не {censored} на ООП, и все.
2. Так я говорю, что это ерунда, на которую не стоит обращать внимания.

Цитата Сообщение от Jodah Посмотреть сообщение
А я видел 10 статей, что процедурный подход отстой. И что?
Просто модно обсирать процедурный подход и возносить ООП. Везде. В том числе в вакансиях.

А тут такая разгромная статья на хабре

Цитата Сообщение от Jodah Посмотреть сообщение
Звучит как "ручка молотка - это ерунда, а вот боёк - да, хорошая вещь". Даже если отбросить теорию, реализация 3 столпов в PHP позволяет существенно упростить код.
Не, просто на говнособеседованиях часто спрашивают: назовите 3 кита ООП.
{censored}, ну это как-то показывает умение программиста программировать?

Цитата Сообщение от Jodah Посмотреть сообщение
Какая разница, делать магазин в ООП или процедурном стиле?
Хм.
Я как бы не говорю, что магазин нужно делать только в ООП стиле, или только в процедурном.
Магазин - это по сути такой же сайт.

Определенные части можно сделать в таком стиле, определенные - в другом.

Когда есть какой-то код в одном методе action определенного класса контроллера, но он не использует другие методы этого контроллера - то это по сути plain-код, просто оформленный в методе контроллера.

Классы более удобно использовать лишь для группировки и автозагрузки.
Городить же ООП огород - зачастую не нужно.

Цитата Сообщение от Jodah Посмотреть сообщение
Для парсинга чего-либо html не нужен, однако же времени на разработку можно потратить прилично.
И что? Для парсинга нужно городить ООП-огород?
Большинству сайтов никакой парсинг не нужен.

Можно вообще ограничиться json_decode()

Цитата Сообщение от Jodah Посмотреть сообщение
Поменяли размеры товара -> автоматически поменялся объём -> автоматически перерасчиталась стоимость доставки.
Хм.
Для этого нужен метод в товаре?

Это можно реализовать несколькими строками кода в обработчике события изменения товара.

Ну и смотря чья доставка.
Если доставка на аутсорсе, то лучше написать, кто аутсорсит и расчитывать цену доставки в момент заказа.

Товар же не меняется сам в объемах.
Он не расдувается и не сжимается.
У него нет такого свойства.
Это просто фикс неправильных данных.

Цитата Сообщение от Jodah Посмотреть сообщение
Изменили характеристики товара -> автоматически изменилось название
Это тоже можно реализовать несколькими строками кода в обработчике.
Выносить эти несколько строк в отдельный метод, раз он используется только в одном месте, я бы не стал.
Кто-то вынес бы. Но все равно, я бы не совал это в сущность товара.
Кстати, что у Вас сущность товара?
Это типа ActiveRecord? Ну, то есть, товар умеет сам себя сохранять и вытягивать из базы?

Цитата Сообщение от Jodah Посмотреть сообщение
познать дзен
Да, методом проб и ошибок.
Но если он так и не научился программировать? Если продолжает прыгать с фреймворка на фреймворк, ибо внезапно предыдущий стал УГ, а все хайпят новенький.

Цитата Сообщение от Jodah Посмотреть сообщение
Начать с процедурного стиля
В php для банальной обработки формы не нужно городить и процедуры.
0
Jodah
Эксперт PHP
2772 / 2425 / 1034
Регистрация: 01.08.2012
Сообщений: 8,562
25.12.2016, 00:29 14
Цитата Сообщение от Madrid Посмотреть сообщение
Просто модно обсирать процедурный подход и возносить ООП. Везде. В том числе в вакансиях.
А тут такая разгромная статья на хабре
На хабре полно статей, друг другу противоречащих, ну что мы будем это обсуждать

Цитата Сообщение от Madrid Посмотреть сообщение
Не, просто на говнособеседованиях часто спрашивают: назовите 3 кита ООП.
{censored}, ну это как-то показывает умение программиста программировать?
Т.е. полиформизм - ерунда, потому что про него спрашивают на собеседованиях?

Цитата Сообщение от Madrid Посмотреть сообщение
Классы более удобно использовать лишь для группировки и автозагрузки.
Городить же ООП огород - зачастую не нужно.
Это вопрос вкуса. Для меня ООП в целом более удобен. Скажем, работа с куками/сессиями через классы с методами get/set вместо $_COOKIE/setcookie и $_SESSION, меня такая абстракция только радует.

Но некоторые вещи не могу переварить, например кверибилдеры $db->select()->from()->where()->join()...

Цитата Сообщение от Madrid Посмотреть сообщение
И что? Для парсинга нужно городить ООП-огород?
А чем плох огород? Да, несколько файлов вместо одного, зато с чётким разграничением задач. Опять же, дело вкуса.

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

Цитата Сообщение от Madrid Посмотреть сообщение
Для этого нужен метод в товаре?
Это можно реализовать несколькими строками кода в обработчике события изменения товара.
Сеттер тоже займёт несколько строчек кода.

Цитата Сообщение от Madrid Посмотреть сообщение
Товар же не меняется сам в объемах.
Он не расдувается и не сжимается.
Мы говорим об объекте, а не 3D модели. Он также не пахнет и звуков не издаёт, хотя такими свойствами мы его можем наделить.

Цитата Сообщение от Madrid Посмотреть сообщение
Кстати, что у Вас сущность товара?
Это типа ActiveRecord? Ну, то есть, товар умеет сам себя сохранять и вытягивать из базы?
Нет, использую Entity + Mapper.

Добавлено через 43 секунды
Цитата Сообщение от Madrid Посмотреть сообщение
В php для банальной обработки формы не нужно городить и процедуры.
На одних формах далеко не уедешь.
0
tarasalk
1210 / 723 / 288
Регистрация: 13.06.2013
Сообщений: 2,543
25.12.2016, 09:53 15
Цитата Сообщение от Jodah Посмотреть сообщение
Если чешутся руки - создайте отдельную тему "ООП - зло" и изливайте там душу
Поддерживаю. И чтобы у многоуважаемого Madrid не было лишних соблазнов, предлагаю модераторам ограничить его доступ исключительно этой темой, все равно ни о чем другом он не пишет.
1
Madrid
4 / 45 / 2
Регистрация: 26.12.2009
Сообщений: 382
25.12.2016, 16:25 16
Цитата Сообщение от Jodah Посмотреть сообщение
На хабре полно статей, друг другу противоречащих
Сам факт наличия статьи усомнившейся в наследовании
Можете поискать, вдруг что-то полезное найдете.
Хотя да, там в последнее время много противоречивых статей.

Цитата Сообщение от Jodah Посмотреть сообщение
Т.е. полиформизм - ерунда, потому что про него спрашивают на собеседованиях?
Нет, полиморфизм - ерунда. Эту ерунду спрашивают на собеседованиях.

Цитата Сообщение от Jodah Посмотреть сообщение
меня такая абстракция только радует
Хм, чем же объект лучше?
Это у Вас глобальный объект?
Или статические методы класса?

Цитата Сообщение от Jodah Посмотреть сообщение
Мы говорим об объекте, а не 3D модели.
Так и я о том же.

Цитата Сообщение от Jodah Посмотреть сообщение
На одних формах далеко не уедешь.
Хм, а что такое сайт?
Это обработка GET/POST запроса.

Добавлено через 6 минут
Цитата Сообщение от Jodah Посмотреть сообщение
Если чешутся руки - создайте отдельную тему "ООП - зло" и изливайте там душу.
ООП не зло...
Его нужно применять к месту.

Цитата Сообщение от tarasalk Посмотреть сообщение
И чтобы у многоуважаемого Madrid не было лишних соблазнов, предлагаю модераторам ограничить его доступ исключительно этой темой, все равно ни о чем другом он не пишет.
Хм.
Я еще в чем-то не прав в последних ООП-темах? )

Создайте тему, обсудим.

Добавлено через 59 секунд
php - это не Java, где все - объект.
0
Jodah
Эксперт PHP
2772 / 2425 / 1034
Регистрация: 01.08.2012
Сообщений: 8,562
25.12.2016, 17:36 17
Цитата Сообщение от Madrid Посмотреть сообщение
Нет, полиморфизм - ерунда. Эту ерунду спрашивают на собеседованиях.
Так я прошу объяснить, почему это ерунда, а вы отвечаете, что про него спрашивают на собеседованиях. Ответьте конкретно, в чём ерундовость полиформизма. Я понимаю, что есть статья на хабре, но сами понимаете, это не аргумент.

Цитата Сообщение от Madrid Посмотреть сообщение
Хм, чем же объект лучше?
Это у Вас глобальный объект?
Или статические методы класса?
Не лучше, а удобней лично для меня.
Он не глобальный (вернее, глобальным его делает сервис-локатор), не статический (хотя можно и статикой сделать).

Цитата Сообщение от Madrid Посмотреть сообщение
Его нужно применять к месту.
Мы ходим по кругу. Вы сказали, что ООП нужно применять там, где это нужно. Я ответил, что если человек, знающий ООП, пишет с его применением какой-то очень простой проект - эта нормальная ситуация. Вы согласились:
Цитата Сообщение от Madrid Посмотреть сообщение
Если он решил сам писать так, с пониманием того самого ООП, то ок, вопросов нет.
Теперь вы опять говорите, что ООП подходит не для всего. И я тогда тоже повторюсь - приведите пример ситуации, когда ООП использовать нецелесообразно. Я считаю, что ООП можно использовать везде, если того пожелает разработчик.

Цитата Сообщение от Madrid Посмотреть сообщение
Хм, а что такое сайт?
Это обработка GET/POST запроса.
Что такое машина? Просто средство передвижения. Как тележка, только больше, да?
0
Madrid
4 / 45 / 2
Регистрация: 26.12.2009
Сообщений: 382
25.12.2016, 18:09 18
Цитата Сообщение от Jodah Посмотреть сообщение
Ответьте конкретно, в чём ерундовость полиформизма.
Ерундовость в том - что я вообще не понимаю зачем на ООП полиорфизм вообще обращать внимание.
Есть и другие виды полиморфизма.
В разных классах метод может делать разные вещи. Ну и что тут особенного? Это ж просто наследование с возможностью переопределения или просто реализация интерфейса. Ну реализовывай как хочешь. Из этого делать кита ООП?
Цитата Сообщение от Jodah Посмотреть сообщение
Я понимаю, что есть статья на хабре, но сами понимаете, это не аргумент.
Статья не о полиморфизме...

Цитата Сообщение от Jodah Посмотреть сообщение
Не лучше, а удобней лично для меня.
Я именно это и имел в виду.

Цитата Сообщение от Jodah Посмотреть сообщение
Теперь вы опять говорите, что ООП подходит не для всего.
Хм, когда начинают городить огород из stdClass (то есть анемичное ООП), преобразовывать туда-сюда объекты в массивы - то лучше использовать сразу массив. (Лучше - это значит, что так удобнее для меня )

Цитата Сообщение от Jodah Посмотреть сообщение
Я ответил, что если человек, знающий ООП, пишет с его применением какой-то очень простой проект - эта нормальная ситуация.
Познать дзен - это не быдлокодить только на ООП.
Не ООП ж единым.
Вы что-то кроме ООП признаете?
ООП код удобен в сопровождении? Во вливании новых программистов в проект?

Цитата Сообщение от Jodah Посмотреть сообщение
Что такое машина? Просто средство передвижения. Как тележка, только больше, да?
Цитата Сообщение от Jodah Посмотреть сообщение
На одних формах далеко не уедешь.
В php далеко уедешь. Можно даже пешком идти.
0
Jodah
Эксперт PHP
2772 / 2425 / 1034
Регистрация: 01.08.2012
Сообщений: 8,562
25.12.2016, 20:11 19
Цитата Сообщение от Madrid Посмотреть сообщение
Ерундовость в том - что я вообще не понимаю зачем на ООП полиорфизм вообще обращать внимание.
Так с этого и надо было начинать. Вы не понимаете.
Цитата Сообщение от Madrid Посмотреть сообщение
В разных классах метод может делать разные вещи. Ну и что тут особенного? Это ж просто наследование с возможностью переопределения или просто реализация интерфейса. Ну реализовывай как хочешь. Из этого делать кита ООП?
Если мы говорим об ООП вообще, то полиформизм - это возможность объектов с одинаковой спецификацией иметь различную реализацию.

Если мы говорим об ООП в PHP, то помимо просто переопределения есть возможность унификации принимаемых параметров в методах. К примеру, следующий код вызовет ошибку:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
abstract class Mail
{
    public function send(string $message)
    {
        echo 'sended';
    }
}
 
class SomeMail extends Mail
{
    public function send(array $messages)
    {
        echo 'sended';
    }
}
Ошибка: Declaration of SomeMail::send(array $messages) should be compatible with Mail::send(string $message).

В обоих случаях полиформизм в PHP шире, чем вы описываете.

Цитата Сообщение от Madrid Посмотреть сообщение
Хм, когда начинают городить огород из stdClass (то есть анемичное ООП), преобразовывать туда-сюда объекты в массивы - то лучше использовать сразу массив.
Сама по себе замена массива на stdClass не имеет ничего плохого. Лично мне второй вариант нравится больше:

PHP
1
2
3
4
5
6
7
8
9
10
$book = [
    'author' => 'Дарья Донцова',
    'title' => 'Бредофилия как стиль жизни',
    'price' => 1500,
];
 
$book = new stdClass;
$book->author = "Дарья Донцова";
$book->title = 'Бредофилия как стиль жизни';
$book->price = 1500;
Преобразование вообще проще некуда:
PHP
1
var_dump((array) $book);
А если мы говорим об ООП ради ООП, типа:

PHP
1
2
3
4
5
6
7
8
class Controller
{
    public function show()
    {
        $data = (object) $_POST;
        $products->add((array) $data);
    }
}
То здесь скорее вопрос к адекватности программиста, чем к самому ООП.

Цитата Сообщение от Madrid Посмотреть сообщение
ООП код удобен в сопровождении? Во вливании новых программистов в проект?
Зависит от квалификации программистов, кода (в т.ч. архитектуры, движка и т.п.), документации.
0
Azdeman
Фрилансер
Эксперт HTML/CSSЭксперт PHP
1738 / 1281 / 579
Регистрация: 12.01.2011
Сообщений: 5,082
25.12.2016, 21:00 20
Madrid, Я посмотрел ваши темы в разделе PHP и OOП , и складываются такое чувство что вы 'профи' и знаете где нужно использовать ООП, а где нет. Кому использовать , а кому не использовать.
Так вот, предлагаю Вам создать тему в которой вы опишите все свои мысли и доводы про ООП. Если хотите можете даже записать на аудио/видео съемку , возможно у Вас стоит 'поучится' ООП.

кто знает , кто знает.....
0
25.12.2016, 21:00
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.12.2016, 21:00

Пример использования генератора случайных чисел для демонстрации динамического полиморфизма
Пример использования генератора случайных чисел для демонстрации динамического...

Обоснование отказа от БД
Привет, сделал программу заполнения нарядов(для большого числа машин) с...

Математическое обоснование календаря
Интересуют сами формулы (примеры тут есть). Почему так. Обычно, хватаются за...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru