[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Объясните в чем преимущества ООП?
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18
slobotsky.denis
Цитата (inpost @ 31.10.2014 - 17:43)
slobotsky.denis
Конкретика. Сформулируй недостатки примера.

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

Но, если рассматривать задачу как часть ТЗ, главный недостаток: в коде не отображена предметная область. Ты же понимаешь, почему это недостаток? Я просто не хочу тут писать то, что досканально разжёванно в любой книге по ООП.


Цитата (Arh @ 31.10.2014 - 18:03)

Я не путаю, я спрашиваю и про то и про это. Спасибо почитаю.
В предыдущем сообщении писал про интерфейсы, читал различные примеры, и ваш пример тоже непонятен, для чего создан лишний бессмысленный класс.

В моём примере как-раз таки абстракный класс. Туда при необходимости можно дописать возможность ходить/говорить и пр. Но абстрактный он (т.е. объект этого класса нельзя создать) потому что не бывает бесполых детей. Это первая причина.
Для того, чтобы понять вторую причину, надо рассматривать этот абстрактный класс, как интерфейс. Интерфейс не в терминах PHP, а интерфейс в концептуальном смысле.
Все публичные методы любого класса считаются интерфейсом (в концептуальном смысле) этого класса. То есть, это такой набор инструкций, которыми клиент (так принято называть что-то что вызывает методы объекта) манипулирует объектами данного класса.
В методе Bathroom::childPee(Child $child) необходимо быть увереным, что $child умеет pee(). Туалету (в данном случае он клиент) не важно как в нём писают, важно лишь то, что объект умеет писать. Чтобы быть в этом уверенными, мы объявляем в сигнатуре метода, что $child имеет концептуальный интерфейс Child, т.е. в любом случаее умеет pee().

Скорее всего, Ваше недобонимание происходит от того, что php изначально не строго типизированный язык. На нём можно писать без без этих всяких концептуальных интерфейсов. Но когда в твоём проекте 100500 методов (или функций, не важно), запоминать в какой метод приходят какие данные и что с ними можно сделать, становиться сложно и чревато ошибками.

В общем, всё это нужно для того, чтобы облегчить жизнь программисту и переложить часть головной боли с его плеч на интерпретатор/компилятор.

_____________
PHP: The Right Way
Бесплатное обучение Symfony2

Tox: 55BB67DE54B1CB14F8C37B4F3AED64E6A45922988D22F85EF75039751F26F05460664D978F5C
inpost
slobotsky.denis
Сформулируй т/з, в котором реализация не максимально решена? Всё это пустые слова, так как я на процедурном уровне решил твою задачу полностью. Ты фанатеешь от ООП, а я видел на улицах фанатов от нацизма (я с Украины), а одногруппник в вк написал, что лично пойдёт убивать русских, если они ступят на землю нашу (ему 26 лет), а недавно смотрел фильм, где были фанаты куклус-клан. Нельзя зацикливаться на чём-то одном. vk отказались от ООП в своём kittyPHP, facebook создавался тогда, когда механизма ООП как такового и не было, у гугла страничка доставки пиццы тоже, скорее всего, без ООП, им же нужна скорость.
А в целом, фанаты - это очень плохо. Если увидишь эту проблему в себе, то сможешь её решить.

_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
twin
Цитата (slobotsky.denis @ 31.10.2014 - 13:39)

У Inpost и то намного более читаемый и менее избыточный пример, хоть и не лишённый своих недостатков.

И вот те раз... Задача то не выполнена.

Как же это:
Цитата
А вот кто мне расскажет, как без ООП нормальный полиморфизм применить?

Если так рассуждать, то у Arh код еще менее избыточен и проще читаем. И кстати надежнее. Ну если немного подправить.
function Boy_pee () {
// делаем это стоя
}

function Girl_pee () {
// леди не культурно об этом говорить
}

function Bathroom_childPee($sex) {
// тут мы проверяем, что унитаз не сломан
$function = $sex .'_pee';
$function();
}

Bathroom_childPee('Girl');
Bathroom_childPee('Boy');


По крайней мере не нужен один большой спагетти-класс, как у inpost, если понадобится много разных сущностей и множество их действий. Допустим та же собачка, птичка, рыбка и так далее. И все захотят не только писить, но и пить, кушать, какать, купаться.

Или код будет разнесен на множество классов. В одном все они писиют, во втором какают и так далее. В итоге код станет совершенно неуправляем.

Кроме того, как быть с птичкой, если её нет в ассортименте? Нужна проверка. Иначе будет ошибка, если в массиве окажется что то другое. Мало ли откуда массив. Соответственно код разрастается и перестает быть читабельным.

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

Вы уж тогда либо крестик снимите, либо трусы оденьте. Либо мы говорим о промышленном коде, либо о том, который
Цитата
менее избыточный
причем на начальном этапе.


_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
slobotsky.denis
Цитата (inpost @ 31.10.2014 - 18:54)
Сформулируй т/з, в котором реализация не максимально решена?

Нет. Более не вижу смысла дискутировать с человеком, который сравнивает ООП и нацизм, не читает моих предыдущих постов про "каждой задаче свой интсрумент", и оперирует ложными фактами.

_____________
PHP: The Right Way
Бесплатное обучение Symfony2

Tox: 55BB67DE54B1CB14F8C37B4F3AED64E6A45922988D22F85EF75039751F26F05460664D978F5C
FatCat
Цитата (twin @ 31.10.2014 - 00:01)
К примеру у меня есть класс постранички. Он лежит в библиотеках, есть пить не просит. Когда нужно, он подхватится автолоадом (тоже вопрос спорный об оптимальности) и отработает свою задачу. Не нужна постраничка - пусть лежит. Есть класс почты - соответственно. И так далее - пара десятков нужных классов в загашнике.

Именно так построен и работает движок нашего форума. Есть класс работы с БД, есть класс работы с пользователями, есть класс работы с полной версией форума, есть класс работы с упрощенной версией и т.д. Что нужно - то и подхватывается для генерации страницы. Что не нужно - не подхватывается, лежит себе на сервере.
В результате форум может работать даже на 4 Мб оперативной памяти, отвалятся лишь несколько наиболее нагруженных шаблонов; на 6 Мб оперативной памяти полный функционал.
Для сравнения, движок ИПБ 3.Х, написанный уже полностью на ООП, требует не меньше 64 Мб оперативной, оптимально 128-256-+++.

_____________
Бесплатному сыру в дырки не заглядывают...
Arh
slobotsky.denis
Цитата
В методе Bathroom::childPee(Child $child) необходимо быть увереным, что $child умеет pee().


Так ошибка будет в любом случае, забыли ли вы реализовать метод pee() от интерфейса (тогда будет ошибка, что метод должен быть реализован) или вы забыли реализовать метод pee() без использования наследований, тоже будет ошибка что такого метода не существует. Смысл тогда писать какие то прокладки, если ваш косяк в любом случае приведёт к понятной ошибке?

Цитата
Скорее всего, Ваше недобонимание происходит от того, что php изначально не строго типизированный язык. На нём можно писать без без этих всяких концептуальных интерфейсов.


Как бы я не старался черпать знания из таких тем и статей, мне всё больше кажется, что пхпэшникам пытаются навязать ООП люди, которые пришли из других языков, где это ООП необходимо. А я как пхпэшник читаю всё это и не пойму - писал всякие модули (вывод новостей, опросы, комментарии, гостевые книги, списки пользователей, менеджеры проектов, логи, профили, настройки доступа и конфигурации,регистрации, авторизации, генераторы кода, шаблонизатор, хлебные крошки, поиск, личные сообщения, карты сайта, подсказки, итд) и всё это работает вместе в совокупности, нет никаких зависимостей, есть контроллеры, которые используют обычные библиотеки (классы) , кешируют и выводят данные в шаблон с помощью всё тех же библиотек. Даже пространства имен использовал ради интереса, хотя вещь тоже наибесполезнейшая. Но ни разу не приходилось делать какието интерфейсы, абстракции, фабрики и другие вещи со страшными названиями. Можно любой сайт сделать, главное что бы были нужные модули, но я так и не придумал где использовать ООП.

P.S. не пытаюсь писать что то против ООП, я за, просто обидно, все используют ООП, кругом статьи о том как это хорошо, куча примеров со всякими туалетами, а я сижу и думаю что же я упустил, почему в моих модулях нет ни одного наследования, почему же они работают без ООП.



_____________
Промокод предоставляет скидку на заказ домена и/или хостинга reg.ru
BFCC-3895-8804-9ED2
slobotsky.denis
Цитата (twin @ 31.10.2014 - 19:03)
И вот те раз... Задача то не выполнена.

В рамках данной дискусии мы условились, что применение классов ещё не есть ООП. Так что в принципе всё норм. Я же не троль, к мелочам не придираюсь)

Цитата (twin @ 31.10.2014 - 19:03)
если понадобится много разных сущностей и множество их действий

А если не понадобится?) Странно, обычно в "а что если" винят как-раз таки приверженцев ООП. Типа сидят они дни на пролёт и строят никому не нужные супер универсальные абстракции.
Пишите код, который легко покрывается модульными тестами и волшебным образом он станет лего расширяем)

Цитата (twin @ 31.10.2014 - 19:03)
Если это разовый функционал, то да, так оно и правильно. Но вроде я слышал слово "полиморфизм" в задаче? Или мне показалось?

Просто я уже стараюсь не провоцировать холивары на новые темы. В промышленном коде (который про enterprise и деньги, а не амбиции и личные предпочтения) данная тема вообще бессмыслена, ибо давно уже сформировались определённые стандарты, проверенные временем и чьи-ми то кошельками. И я бы здесь не отписывался, если бы не некоторые проекты, с которыми иногда сталкиваюсь, и при взгляде на код которых хочется сначала оторвать руки такому вот порицателю ООП, писавшему сей код, а потом выколоть глаза себе и уйти на больничный. Навсегда. Прошу прощения за эмоции.

_____________
PHP: The Right Way
Бесплатное обучение Symfony2

Tox: 55BB67DE54B1CB14F8C37B4F3AED64E6A45922988D22F85EF75039751F26F05460664D978F5C
bestxp
да тут вообще сплошное непонимание ООП и принципа разработки, ты можешь написать все в функциональном стиле и будет красиво и мало строк кода, но будет ли быстро? нет не будет проверено на реальных данных


будет ли удобно разрабатывать надежную систему в процедруном стиле? Нет не будет, нам нужна надежность, а не ваша удобносто, в этом плане процедурный стиль проиграет, начнешь вводить классы как это было сделано Twin упрешься в тоже самое ООП, сейчас тенденция такая у PHP что он уходит в русло ООП от процедурки и это верное решение.


Кто-то упоминал там гугл? Читай про python поймешь как у них сделано, а потом еще Go который они пилят и используют =)


Забудте уже про процедурку как страшный сон, это устарелая технология, не хотите ООП иди в функциональщину LISP Clojure Haskell Scala etc , но хватит холивара на тему ООП


VK ушел в пользу Kitten, не использует ООП и тд, мир не единым VK живет, а давайте посмотрим например на LinguaLeo или Sotmarket или wamba, простите но доводы отказался VK от ООП это их выбор, у них и иструменты другие, и код простой по сути, там можно обойтись без ООП, там логика вся в хранилищах данных, а пхп выводит эти данные, все не сравнивайте и не вспоминайте его


Хочешь сделать бложик используй пожайлуста что угодно, но как только проект начинает разрастаться, начинаются проблемы с поддержкой кода, притом ковырятся и вспоминать что в каждом массиве значит какой ключ и чуть более сложная логика и все пздц вешайтесь


Тут вы начинаете класс для того, класс для этого и вот вы приходите к ООП в своем извращенном виде ( привет twin ) потом развиваясь вы понимаете что чего-то не хватает и приходите к классическому ООП, а дальше что? А дальше привет функциональщина где уже другой подход к прогаммированию, у вас нет классов у вас структуры данных, функции и векторы, если надо вы оборачиваете функцию и тд, но монады и прочее это вам не PHP там порог вхождения уже другой.


Сейчас весь текст сошелся к тому что я не люблю ООП потому что он "медленный" привет админам которые в свое время говорили " я не буду ставить ie7 потому что он сырой" и второй тип я не люблю ООП потому что не понимаю


А потом уходят в ту же Java которая вообще onlyOOP

Да на меня набросятся хейтеры сейчас, но у щит мой крепок и непробиваем)

И еще пока инструмент решает поставленные задачи от него не откажется никто =)
Arh
bestxp
а я не заметил тут никого кто против, я заметил тех, кто либо пытается разобраться, либо говорит что использовать надо там где надо, с умом.

_____________
Промокод предоставляет скидку на заказ домена и/или хостинга reg.ru
BFCC-3895-8804-9ED2
slobotsky.denis
Цитата (Arh @ 31.10.2014 - 19:28)
Так ошибка будет в любом случае, забыли ли вы реализовать метод pee() от интерфейса (тогда будет ошибка, что метод должен быть реализован) или вы забыли реализовать метод pee() без использования наследований, тоже будет ошибка что такого метода не существует. Смысл тогда писать какие то прокладки, если ваш косяк в любом случае приведёт к понятной ошибке?

Обоснованно. А представте себе, что кто-то по ошибке отправил собаку в детский туалет. Собака тоже умеет pee(). Но сабаки дожны делать свои дела в других местах. В детский туалет им нельзя.

Цитата
почему же они работают без ООП

А почему они должне не работать без ООП? ООП это не про расширенный функционал, ООП про удобсвто разработки. Когда в команде штук пять разрабов и у всех своё представление о том, где хранить файлы с функциями, называть их модулями или библиотеками, использовать ассоциативный массив или "ой, а я на хабре читал, что ассоциативные массивы в php это жутко медленно, давайте откажемся от них, можно ведь по БД индекс нужного столбца высчитать", стоит стукнуть каждому книгой о паттернах по голове и отправить её читать. И ещё парой книг в догонку кинуть, типа "Code complete" Макконела и "Clean code" Мартина.

_____________
PHP: The Right Way
Бесплатное обучение Symfony2

Tox: 55BB67DE54B1CB14F8C37B4F3AED64E6A45922988D22F85EF75039751F26F05460664D978F5C
S.Chushkin
Цитата (slobotsky.denis @ 31.10.2014 - 17:39)
Для корпоративного - нет. Если программист уже не позиционирует себя как юниора (и получает соответствующую не юниорскую зп), штрафовать за такой код надо. Ибо он реально наносит убытки заказчику в плане увеличения времени разработки при привлечении новых разработчиков.

Не всё так просто. Как правило корпоративные проекты (код) пишутся один раз. Иногда редко, или даже очень редко, изменяются. Конечно можно писать идеальный код, но стоить он будет в разы дороже. И тут начинает действовать ваша фраза "он реально наносит убытки". smile.gif
В общем, "всё хорошо, что в меру" (с) народная мудрость

_____________
Рекламка / ad.pesow.com Хрень / mr-1.ru
inpost
slobotsky.denis
Тебя смущает то, что фанатизм ООП я сравнил с фанатизмом нацизма? Как тебе показать, что люди бывают безумны в своих делах и совершают миллионы ошибок?
Давай уйдем от образом. Я говорю прямо: ты допускаешь ошибку из-за того, что фанатеешь от ООП. Фанатизм - это плохо.

_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
slobotsky.denis
S.Chushkin
Что Вы имеете в виду, говоря "копоротивный проект"? Мне кажется, мы о разных вещах говорим.

_____________
PHP: The Right Way
Бесплатное обучение Symfony2

Tox: 55BB67DE54B1CB14F8C37B4F3AED64E6A45922988D22F85EF75039751F26F05460664D978F5C
S.Chushkin
Цитата (slobotsky.denis @ 31.10.2014 - 20:19)
S.Chushkin
Что Вы имеете в виду, говоря "копоротивный проект"? Мне кажется, мы о разных вещах говорим.

Проект для внутреннего использования. Не важно, фирменный сайт это или какая учётка или ещё что, главное "сделали и забыли навсегда", возможно, "надолго".

_____________
Рекламка / ad.pesow.com Хрень / mr-1.ru
Arh
slobotsky.denis
Цитата
Обоснованно. А представте себе, что кто-то по ошибке отправил собаку в детский туалет. Собака тоже умеет pee(). Но сабаки дожны делать свои дела в других местах. В детский туалет им нельзя.


class human {

}


class dog {

}


function wc (human $obj) {
$obj->pee();
}

function tree (dog $obj) {
$obj->pee();
}
$dog = new dog;
wc($dog);


Разве функция wc не ругнётся что там должен быть экземпляр класса человек?

_____________
Промокод предоставляет скидку на заказ домена и/или хостинга reg.ru
BFCC-3895-8804-9ED2
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.