Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > PHP: Избранное > объектное vs процедурное |
Автор: Gold Dragon 28.12.2006, 07:22 |
ладно, примерно понял.. Только не видят проблем те, кто это умеет делать ![]() Тогда вопрос в развитие темы.. Я разбирался в разных готовых скриптах и вижу что все спользуют классы. Я почему-то обхожусь одими функциями. Есть ли вообще смысл в классах (немного не так спросил ![]() |
Автор: -=Ustas=- 28.12.2006, 10:30 |
Функции это рутина, которая в конечном счете превращается в кашу, в которой потом разработчик начинает месить грязь. Классы, это иерархическая структурированная модель твоего приложения. Обратись к литературе по ООА и ООП, не важно какой язык, лишь бы теория была. ЗЫ. Могу посоветовать почтитать на досуге Гради Буч-а "Объектно-ориентированный анализ и проектирование". Занимательная весч ![]() Добавлено @ 10:35 Тем более что в пятом PHP полностью переработана объектная модель ![]() |
Автор: Mal Hack 28.12.2006, 15:46 |
Gold Dragon, разницы в подходе - никакой. Реализация просто несколько более запутанная и менее структурированная получается. |
Автор: -=Ustas=- 28.12.2006, 16:04 |
Т.е.?! Можешь пояснить? |
Автор: Mal Hack 28.12.2006, 16:11 |
-=Ustas=-, когда ты пишешь на ООП, ты в нужном месте делаешь $obj = new MyModulClass(), где MyModulClass - класс подключаемого модуля. Получается универсализм. Дальше работает уже сам модуль, через конструктор. Тоже самое с функцями. Ты вызовешь какую-ть MainMyModulFunction, которая примет управление на себя и дальше будет вызывать те функции модуля, которые ей надо. Т.е. ядро только вызывает главную функцию модуля. Все. Ядру плевать что будет делать сам модуль. |
Автор: Mal Hack 28.12.2006, 18:06 | ||
-=Ustas=-, это все так, ты прав, но моей ключевой мыслью было то, что:
Уж как это будет представлено - другой вопрос, ООП так ООП, СП, так СП. Давай будем реалистами. Применительно к PHP, объекты все равно несут лишь информационную модель скрипта, событиыйности-то нету ![]() |
Автор: -=Ustas=- 28.12.2006, 18:32 |
Ну объектной модели PHP еще ползти ![]() Ну это уже парадигма, сложенная на протяжении нескольких тысячилетий ![]() ![]() ![]() |
Автор: Mal Hack 28.12.2006, 19:02 | ||
Но событийности, без изменения концепции языка, в нем все равно не будет. |
Автор: Vaulter 28.12.2006, 22:43 |
а если взять конкретно OOП и PHP? ведь по сути обьекта удобно это когда он существует "лопатя" запросы и т.д. а в PHP важно в тоже время скорость обработки запроса ![]() кстати давно задумывался над PHPшными демонами ![]() |
Автор: Mal Hack 28.12.2006, 22:49 | ||
Это уже надо смотреть на конкретной реализацией. Все-таки это не PHP'шное дело. |
Автор: Gold Dragon 29.12.2006, 14:30 | ||
Так народ, что такое ПОП и ООП? ![]() всё равно не могу понять... Вот как я делаю.. Просто создаю разные функции: одна подключает бызу, другая получает данные, третья запихивает в базу. На сколько я понимаю, класс это тоже самое, только подключается чуть по другому и помоему код больше получается |
Автор: Mal Hack 29.12.2006, 15:25 | ||
ООП - объектно ориентированное программирование. ПОП - процедурно-ориентированное, если я правильно понял. Мы его просто структурным называли.
Да тоже самое. Только при ООП у тебя все эти функции как бы в одной переменной лежат. Ну плюс добавляются разные вкусности типа уровней доступа, свойств, что делает процесс кодинга удобнее. |
Автор: Gold Dragon 29.12.2006, 21:39 | ||
давайте на примере если не трудно.. вот пример моих функций
как это заменить на класс? ps кто-то обещал доку про классы. ![]() |
Автор: Mal Hack 29.12.2006, 21:54 | ||
|
Автор: Vaulter 29.12.2006, 22:52 |
Gold Dragon, а что это? ![]() |
Автор: Gold Dragon 30.12.2006, 09:41 | ||||
я там малость ошибся... первая функция називается fConnect ![]() Mal Hack, т.е. я тупо все свои функции загоняю в класс и получаю к ним доступ через $obj -> что-то?? Тогда нет никакой разницы между
Наверное это самое примитивное использование классов и там есть что-то такое, чего я ещё не понимаю.. ![]() одна функция получает список названий статей и материалов, другая получает сам материал конкретной статьи. А что есть замечания или предложения? ![]() |
Автор: Mal Hack 30.12.2006, 10:16 | ||||
Угу |
Автор: BuShaRt 2.1.2007, 00:50 | ||
![]() Потести смарти и сразу поймешь, что такое целостый класс... Недавно с другом готовились сдавать Удаленные базы данных, ну он вообшем ламер полный, спросил че такое класс, я подумал подумал и ответил, что это коллекция методов (функций)... Хотя ответ не раскрывает все сути, но в целом становиться яснее... Кроме того все методы связанны между собой=) Вот примерчик юзанья класса.. может не самый удачный... но я именно с этого момента понял, что классы лучше функций (когда писал код)
|
Автор: Opik 2.1.2007, 06:15 | ||
http://www.firststeps.ru/theory/oop/r.php?2 |
Автор: Eugene_Bond 2.1.2007, 11:13 |
Mal Hack, очень вредный пример. только отпугивать от применения ООП годится ![]() В продолжение начатого Opikом: http://www.kuro5hin.org/story/2006/3/14/175929/544 -- простое и ясное объяснение полиморфизма |
Автор: Mal Hack 2.1.2007, 14:55 | ||
Opik, без обид, но статья ни о чем ![]() Точнее она о основах ООП, как о его возможностях при реализации тех или иных вещей, но нет ни слова, относительно того, что такое ООП для проектирования... К сожалению, инет кишит такими статьями, а сути, которая не в реализации и возможностях, а в теории проектирования нигде нет... ИМХО, конечно.
Интересно чем? Что я показал базовый синтаксис описания класса и создания объекта? Да и вашего "не вредного" примера я тут что-то не видел. |
Автор: Blaga 2.1.2007, 15:02 |
А может кто нибудь даст почитать по теме? А то никак не могу найти. Нужно что бы было применимо именно к PHP. И что бы на русском. ![]() |
Автор: Mal Hack 2.1.2007, 15:14 |
Из того, что видел я (и писал сам), могу предложить: http://phpclub.ru/detail/article/oop-vs-proc http://phpclub.ru/detail/article/intro_php5 http://vingrad.ru/PHP-ART-002848 |
Автор: BuShaRt 2.1.2007, 15:51 | ||
Я плакал, новички теперь будут счастливы писать на ООП ))) |
Автор: Mal Hack 2.1.2007, 15:56 | ||
BuShaRt, плакать ты можешь столько, сколько тебе вздумается, только вот попробуй объяснить начинающему, что такое ООП и как вообще оно работает вот на таком коде:
|
Автор: BuShaRt 2.1.2007, 16:09 |
Mal Hack, Ну как не как новичок врядли решит программироваться на том примере, где 7 строк, когда есть пример в 1 строку=)) |
Автор: Mal Hack 2.1.2007, 16:12 | ||
Еще раз объясняю для тех кто на подлодке. Ты будешь новичку показывать основы синтаксиса и применения ООП в PHP на модуле из 1000 строк? Нет. Я говорю о том, как показать основы. Чтобы человек решил использовать ООП, он должен до этого дорасти, тобишь осознать ТЕОРЕТИЧЕСКИЕ аспекты ООП, а не код на 1000 строк. |
Автор: BuShaRt 2.1.2007, 16:14 | ||
Mal Hack,
![]() тока получается новичку вообше нет смысла показывать плюсы ООП+)) |
Автор: Eugene_Bond 2.1.2007, 22:09 | ||
Скорее тем, что после такого примера кроме усложнения синтаксиса преимуществ не ощущается.. Мне тоже лень что-то обильное писать, но ща поднатужусь.. |
Автор: Opik 2.1.2007, 22:26 |
Я не так не считаю, там на явном примере поясняется смысл. Читайте тогда здесь: http://www.intuit.ru/department/se/tppobj/ |
Автор: Eugene_Bond 2.1.2007, 22:32 | ||
Что-то вроде этого.. Опять таки упрощенно и "на коленке" в блокноте написанное. Может и не запуститься
|
Автор: Mal Hack 2.1.2007, 22:57 | ||||
Вот честно, перечитал еще раз... Уже зная что такое ООП не могу ну никак соединить этот пример с ООП. Да, отдалено суть показывает, но отдаленно. Но, ИМХО, конечно же. ООП в PHP и в полностью событийном программировании, где объекты представлены не как информационные модели, а как реальные сущности (кнопки, менюшки) разные вещи. Объяснять ООП на визуалке это легко и понятно... ООП в PHP, к сожалению, объяснить тяжело... Новичок не может увязать понятие объекта с какой-ть сущностью... Сам понимаешь, "на яблоках" всегда проще...
Тогда какого черта надо сюда это постить !!
Почитай внимательнее о чем я с BuShaRt'ом дискутировал... Тоже самое и в твоем случае. |
Автор: Eugene_Bond 2.1.2007, 23:14 |
Многоуважаемый Мал Хак. Грубите, пожалуйста, своей бабушке! Вы же модератор.. Любые основы должны демонстрировать преимущества. Например уменьшение количества строк кода, функциональность и удобство в применении. |
Автор: Mal Hack 2.1.2007, 23:18 | ||||||
Я считаю неуважение к участникам форума выкладывать код, который: "Может и не запуститься".
|
Автор: Eugene_Bond 3.1.2007, 07:35 | ||
http://forum.vingrad.ru/index.php?showtopic=129302&view=findpost&p=979753 Вопросов больше не имею |
Автор: -=Ustas=- 3.1.2007, 23:54 |
Gold Dragon, я тебе говорил за эту литературу, на мой взгляз неплохие труды в плане теории. http://vmk.ugatu.ac.ru/book/buch/index.htm. Потом можно заодно и Страуструпа почитать. |
Автор: awers 4.1.2007, 03:02 |
Вообще каждой цели свои методы. Там где надо написать hello world я буду писать hello world А там где пахнет модулем - class hello { functuion message(){print(__CLASS__.' world'); } } Думаю так ) |
Автор: Gold Dragon 4.1.2007, 10:40 |
Так, народ, я хоть и новичок, но создать class hello в состоянии. Меня больше интересует не элементарное использование, а именно то, что другими способами сделать труднее. PS кстати, тему лучше переименовать с Философия class ![]() Добавлено @ 10:44 кстати, очень понравилась статья http://vmk.ugatu.ac.ru/book/buch/index.htm правда пока только начал читать |
Автор: -=Ustas=- 4.1.2007, 11:26 |
Gold Dragon, потом как ты ознакомишься с теорией ООП, советую прочитать http://www.citforum.ru/SE/project/pattern/, чтобы ты имел представление где и как строить архитектуру классов и самого приложения ;) |
Автор: Mal Hack 4.1.2007, 14:51 | ||
Большая задача. Большое кол-во переменных. При структурном подходе ты был вынужден каждую через global подключать или через параметры передавать, а при объектом тебе достаточно ее один раз в конструкторе в свойство записать и затем с ним работать. |
Автор: Gold Dragon 4.1.2007, 15:58 |
вот! это уже интересно. Если честно, то для меня это уже стоновится проблемой. |
Автор: nerezus 15.4.2007, 19:40 | ||
|
Автор: CyClon 17.4.2007, 21:34 |
Если хочется понять ООП в PHP - имхо нужно читать литературу по ООП, в которой все примеры демонстрируются на PHP, а не на других языках... Вообще, я смотрю ООП мало кому дается так легко ![]() |
Автор: -=Ustas=- 18.4.2007, 22:38 | ||
Ну тут ты в корне не прав, и я могу тебе это доказать и даже убедить тебя. ООП - это Объектно-Ориентированный Подход, а на каких языках - это уже по-барабану. Да, я согласен, в некоторых языках такая объектная модель, в других такая-то, но теоретическая основа везде аналогична, и ОБЪЕКТ он и в африке объект. Поэтому прежде - МАТ-чать! |
Автор: CyClon 21.4.2007, 16:39 | ||
Если будет выбор книг: ООП, ООП в (Visual Basic || Delphi || C++), ООП в PHP. Объем книг одинаковый, автор у всех вменяемый. Я бы выбрал ООП в PHP. Теория подкрепляется примерами на самом PHP. Если мне нужно понять ООП вообще и использовать его в PHP, этот выбор будет разумнее чем книга про просто ООП, и тем более про ООП в других языках. |
Автор: nerezus 21.4.2007, 20:42 |
А что, много книг про ООП в ПХП? ![]() Насколько я знаю, это не так ;) |
Автор: Sergey912 21.4.2007, 20:43 |
Из всего топика и вообще в ООП понял, что оно лучше в проектировке так как задумывается как единое целое т.е. объекты могут взаимодействовать и пишутся с учетом связей в друг друге + к тому однотипные группируются в один класс, скажем класс баз данных и потом их удобно юзать. Кстати если класс грамотно написан им удобно пользоваться даже если его писал не ты, скажем в отличии от 50 процедур, которые писались под конкретную задачу и использовать их по делу для других часто довольно сложно.... Гм, вобщем-то понятнее стало. Не в синтаксисе дело, а именно в проектировке. Вот только как с процедурного перейти на ООП - я совсем подругому мыслю и для не шаюлонных задач море вопросов ![]() - 3 группы текстов - по 50 в каждом - нестандартная верстка нужно свести к одному т.е. оформить одинаково. Вот где тут его использовать, как вобщем-то для самых разнородных задач начать проектировать такие вещи... вот тут процедуры имхо проще и практичнее. Не понимаю я как ООП тут мне поможет ![]() |
Автор: Vaulter 3.5.2007, 22:05 |
ООП там где много повторного кода. |
Автор: Letov 7.5.2007, 22:08 |
ООП - как стиль программирования. Кто-то его придерживается, а кто-то - нет. Каждый выбирает сам для себя. ООП - структурированная модель. Удобно в больших приложениях. Функция - для маленьких приложений или старых версий языка. Переносить, например, приложение с PHP5 на PHP4 удобнее, если использовать функции. |
Автор: -=Ustas=- 8.5.2007, 09:22 |
Слушайте, подобная тема "объектное vs процедурное" уже далеко не актуальна, по интернету подобных обсуждей как грязи. Чтоб понять ху из ху, нужно взять любую книгу какого-нить ООриентированного языка, пусть тот же C++ или Java (есть и просто теория) , там в первых главах обзательно эта тема затрагивается, после прочтения которых вопросы у вас сами отпадут. Добавлено через 4 минуты и 20 секунд Ну... не все вопросы конечно, сразу отпадут, но часть эт точно, а после практической реализации точно все. |
Автор: WolfON 13.5.2007, 13:24 |
Каждый подход применим к своей задаче. Хороший программист должен писать хороший не только ОО код, но и функциональный и структурный. |
Автор: koreshX 22.5.2007, 17:24 | ||
CMS Drupal - пример, где модули пишутся исключительно с использованием функционального подхода. И я почему-то совершенно не видел каши, рутины или грязи. В тоже время встречал исключительно объектные проекты, в которых было разобьраться почти не реально. ПРограммируя на php использовать ооп нужно там где это нужно, а не везде, как мне кажется. Ибо это не Java и не C# (и не руби..), где ооп есть основа всего и вся. Моё ИМХО - пытаться писать на пхп исключительно объектно - это будет лишь пародия на системы написанные на исключительно объектных языках. |
Автор: vasac 23.5.2007, 10:33 | ||
А я видел ![]()
Мотивируйте, пожалуйста. А так же поясните, что такое "исключительно объектно". |
Автор: koreshX 24.5.2007, 00:00 | ||||
"Исключительно объектно" - это значит что нельзя сложить 2 числа не создав класса. А "ИМХО", на сколько я знаю в мотивациях не нуждается...
Посмею предположить, что вы видели модули написанные не самым лучшим образом. |
Автор: WolfON 24.5.2007, 00:32 |
koreshX, абсолютно объектно-ориентированным языком можно назвать разве-что руби, да и то с натяжкой, по этому не надо гиперболизировать. очевидно, что автор подразумевал разумное использование возможностей ооп, которыми наделен php |
Автор: WIPS 4.6.2007, 00:35 |
На мой взгляд ООП более приемлем, чем ПОП хотябы потому, что окружающий мир состоит из объектов (экземплятов классов, если угодно), а не из функций (читай действий) и имеет след. преимущества: 1. Повышается понимаемость кода. Возьмем, напр., ф-ю __стрелять(). Снайпер стреляет по мишени, бомж стреляет сигареты, девушка стреляет глазками. Используя ПОП необходимо либо передавать доп. параметр "кто_стреляет", либо использовать префиксное именование ф-ций, а отсюда вторая выгода: 2. Отчасти решается проблема именования. 3. Пусть у девушки есть ещё методы кроме __стрелять(), напр. __могу_ли_охмурить(), __могу_ли_съесть_пирожное(), __надо_ли_худеть() и пр.. Все они зависят от огромного числа параметров (рост, вес, объем груди, талии и бедер, харизма, наличие косметики и т.п.). В ООП достаточно задать эти параметры единожды для объекта, а в ПОП вам каждый раз придется описывать девушку передавая кучу её параметров в каждую ф-ю пусть даже и массивом. 4. Мы можем заставить всю нашу компанию (снайпер, бомж и девушка) стрелять по одной команде (__стрелять()), т.к. все они имеют таковой интерфейс. 5. Так же легче добавлять новых членов в нашу компанию (спина напр. тоже может __стрелять()). 6. Наша компания может состоять и из нескольких девушек (объектов одного класса), кот. тоже можно заставить стрелять по одной команде. Все будут делать это примерно одинаково, но каждая немножко по своему в зависимости от параметров (см. п. 3). Короче говоря реальная жизнь состоит из объектов которые имеют свойства и могут совершать действия (т.е. имеют методы), а следовательно спроектирвать и написать программу (т.е. создать информационную модель чего-то рельно существующего) проще имея аналоги рельных объектов (так устроен мозг человека). Процедурный подход хорош для чисто вычислительных задач, т.к. так же далек от реальности как и "чисто вычислительные задачи". Р.S. А понимать ООП проще все же вообще в отрыве от языка. Главное - понять концепцию. А ее реализация в каждом конкретном случае (читай - ЯП), это лишь вопрос синтаксиса и наличия/отсутсвия некоторых возможностей. P.Р.S. Все вышесказанное - мое ИМХО. |
Автор: Alan 4.6.2007, 16:58 |
Перехожу на ООП... постепенно. Преписывать старые проекты не буду. Но новые начну с ООП. |
Автор: Sergey912 26.7.2007, 02:21 | ||
WIPS, Он не изучен даже до конца, не то чтобы сделаны однозначные выводы и построена четкая модель ![]()
Но никуда не денешься от реализации всех функций "стреляния" т.е. именно кода который за них отвечает и реализации огромного кол-ва классов. Но их избыточность это совсем не хорошо. |
Автор: Diesel Draft 26.7.2007, 10:42 |
ООП может дать особое понимание программирование. Когда то программа представляла собой только линейную структуру. ООП даёт не просто красивый и читабельный код, а представление мира в его аналогах. Для некоторых людей это просто способ обеднать свои функции в отдельную библиотеку и оно отличается от ПОП только тем что можно впихнуть больше кода, но другие могут написать аналог предмета или живого существа и тогда складывается впечатление что ты работаешь з реальным предметом, а не з программным кодом. Когда ты это поймешь то мир программирования покажется другим. Думаю многие согласятся. |
Автор: Mal Hack 26.7.2007, 13:53 |
ООП ничего не может дать, это понимание программирования может дать возможность использовать "фишки" ООП, которые на больших проектах сильно улучшают структуриацию и модульную схему приложения. |
Автор: Diesel Draft 26.7.2007, 17:26 |
Вот ты не понимаешь, ты не видел абстрактную сторону |
Автор: WIPS 30.7.2007, 16:40 | ||||||
Кто это "он"? Который не изучен до конца? Естественно вся функциональность должна быть где-то реализована, будь то ОПП/ПОП или что-то еще. Код сам не напишется, это и ежу понятно.
Классов должно быть не огромное к-во, а оптимальное к-во. Оно определяется на стадии проектирования приложения. А избыточность - это плохо (тут я с вами согласен). Она по определению подразумевает что-то лишнее.
Полностью согласен. Это то, что я пытался сказать в своем посте. В чем же заключается это самое "понимание программирования"? |
Автор: NNaarreekk 30.7.2007, 16:41 |
Насколько я знаю класы нужны только для того чтобы секономить время! То есть можешь написать ту же програму без класов, но получится в 3 раза длинее и медленее! |
Автор: Diesel Draft 30.7.2007, 17:03 | ||
Не совсем. Класс позволяет поделить программу на конкретные модули, которые ты можешь переиспользувать. Самый большой плюс сановит удобство |
Автор: Mal Hack 30.7.2007, 18:27 |
Не говори глупостей, пожалуйста. Модули это модули. Классы это классы. Никакой связи между собой они не имеют... На функциях теже самые модули так же совершенно спокойно делаются. |
Автор: Diesel Draft 31.7.2007, 09:49 |
Разве? Кто еще со мной несогласен на счет модулей в форме классов? |
Автор: Daevaorn 31.7.2007, 14:27 | ||
модули не обязательно классы и наоборот. |
Автор: Diesel Draft 31.7.2007, 16:01 |
Daevaorn, а я не говорил что обязательно, и это все образно. Каждый понимает модуль по своему. |
Автор: WIPS 1.8.2007, 09:40 | ||
Еще плюс - возможность задания способов обработки данных, скрытых в классе. Функциями этого никак не добьешься.
Что в вашем понимании модуль? |
Автор: Mal Hack 1.8.2007, 11:41 |
Diesel Draft, модуль это не образно.... Модуль - это программная единица, куда вынесены куски программного кода, разделенные по смысловой и модульной нагрузке. |
Автор: Diesel Draft 1.8.2007, 11:51 | ||||
Да, правильно, как я мог забыть про интерфейсы, это вообще выручает не редко
Вот ты подумал насколько неточно это. Правильно, но это не обязательно класс. Если б только для этого то можно было просто использовать шаблоны кода |
Автор: Mal Hack 1.8.2007, 11:57 |
Diesel Draft, и чего-же тут не точного??? Шаблон, это заготовка и к модулям отношения не имеет. Да, модули ты делаешь по смысловому шаблону, но это не то... Учи матчасть !!! |
Автор: Diesel Draft 1.8.2007, 12:07 |
Mal Hack, Ты вот влепил мне минус в репу, а вот за что? Цитирую "Прежде чем что-то делать, надо сначала хотя бы основные понятия понять....". Вот если ты не знаешь, то не путай других. Шаблон это заготовка, но не только дизайна. Это может быть и шаблон кода. У тебя есть компьютерное образование, или ты учился как большая часть здесь на примерах? Просто то что ты говоришь доказывает что ты не ориентируешься в этом. Ты видишь только одну сторону монеты. Почитай этот раздел, тебе это говорю не только я. П.С. И хватит мне портить репу, посте тебя меня народ за дилетанта какого принимает. Ты уже мне 3 минуса втиснул. |
Автор: Mal Hack 1.8.2007, 15:18 | ||||
Diesel Draft, у меня как раз образование по специальности "программное обеспечение вычислительной техники и автоматизированных систем", поэтому, поверь, уж, понятия я - знаю.
Вот я не понимаю. Ты тупой или прикидываешься, прости конечно (и пусть мне модеры вешают кирпич, может хоть так, удасться достучаться до твоих, талантливых, стоящих мозгов, которые вместо того, чтобы учиться, пытаются учить других). Уже в который раз ты не хочешь понять тех вещей, которые тебе говорят люди, понимающие больше тебя. Не надо мне приписывать тех слов, которых я не говорил? Я говорил о дизайне? Хоть слово, хоть намек? Нет. Если ты не в состоянии осознать то, что понятие модуля и понятие шаблона не имеют ничего общего, а связь того, что модули, состоящие из классов или функций написаны по одним правилам, читаю для тебя специально, по шаблону, имеет лишь практический смысл реализации, а не теоретической основы, нечего тебе делать в программировании.
МОжет быть ты просто не можешь понять того, что я говорю, точнее подумать над этим? ;) Я привожу факты, определения, от тебя я только слышу: "ты не прав" и т.п. Где обоснование? Не надо думать слишком поверхностно.. Минусы в репу "ты мне я тебе" можешь лепить сколько влезет, мне на репу - плевать, она тут уже давно профессиональные навыки не отображает... |
Автор: Diesel Draft 1.8.2007, 15:36 | ||
Хорошо, давай начнем с начала или этот разговор начинает переходить в тупой спор.
Я человеку хотел абстрактно объяснить что такое класс. Давай так. З чем ты со мной не согласен? Скажи, а я постараюсь аргументировать свой ответ. П.С. Я закончил "Компьютерная инженерия". Веб не учили. Но я з самого маслу сам занимался. |
Автор: Mal Hack 1.8.2007, 15:39 |
В данной процитированной фразе не согласен с тем, что именно класс позволяет разделить программу на модули. На модули программу разделяет программист при проектировке, классы - вид реализации модулей.... Это лишь способ реализации модуля или его части. Удобство это зависит от задачи. |
Автор: Diesel Draft 1.8.2007, 15:46 |
Вот, мы уже сошлись во мнении. теперь смотри. Почему я сказал что позволяет поделить на модули? Потому что большая часть людей понимает модуль как отдельную часть, которую можно подключить, отключить и делать другую бесполезную роботу. Но это я сказал на таком простом уровне. Просто когда человеку скажешь термином он не поймет (нет хорошо сформулированного термина). |
Автор: Mal Hack 1.8.2007, 15:55 | ||
Если ты понял, наконец, что я тебе объяснял...
И где в фразе слово класс??? Нету.. Термины объяснять надо... |
Автор: Diesel Draft 1.8.2007, 15:59 |
Основа ООП это объект ![]() |
Автор: sTa1kEr 1.8.2007, 22:37 |
Diesel Draft, извините, но я не совсем понимаю. Что вы пытаетесь доказать? По-моему уже из определения предельно ясно, что такое модуль. Модуль это составная часть общей системы, но весь смысл модуля заключается в легкой отделимости от общей системы и такого же простого присоединения без вреда для всей системы. И для программирования это не исключение, не важно на чем написан модуль и какие технологии при этом использованы, если это условие выполняется. За примерам далеко ходить не надо, те же расширения PHP могут быть собраны как модули, т.е. если есть файл - есть требуемая функциональность, и пусть он хоть на ассемблере написан. Объекты не имеют *никакого* отношения с модулями. Я согласен с тем, что ООП имеет похожую модульную структуру, но при этом не стоит путать понятия ООП и модульная система. |
Автор: Mal Hack 1.8.2007, 22:43 |
Diesel Draft, основы ооп, это принципы наследования, инкапсуляции и полиморфизма.. Объект - лишь способ реализации ;) |
Автор: WIPS 1.8.2007, 23:38 |
Однако согласитесь, что модуль может быть реализован как объект. При этом будет отвечать всем выдвигаемым к модулю требованиям. P.S. По моему, все говорят одно и тоже, но друг друга считают при этом неправыми =) |
Автор: sTa1kEr 2.8.2007, 00:42 | ||||
Я так и сказал - объектная модель похожа на модульную. Но любые объекты тесно связаны с другими объектами - в этом и заключается смысл ООП.
А по моему, либо кто-то не понимает простого смысла слова *модуль*, либо просто боится показаться не компетентными в данной области. |
Автор: WIPS 2.8.2007, 08:31 | ||
после этого тяжело не понять, что такое модуль: |
Автор: Diesel Draft 2.8.2007, 10:33 | ||||
А вам не кажется мы говорим о том самом но разными словами?
Наследование, инкапсуляция и полиморфизм это его свойства
|
Автор: Fally 2.8.2007, 11:21 | ||
Поправка, модуль может быть реализован как класс, но не как объект...
Если одни объекты тесно связаны с другими, то это нарушает гибкость и расширяемость приложений, что противоречит принципу http://wiki.agiledev.ru/doku.php?id=ooad:dependency_injection . Тесно могут быть связаны обычные классы с реализациями абстрактных или реализациями интерфейсов. |
Автор: Mal Hack 2.8.2007, 13:51 | ||
Совершенно нет. Это - основа ООП, потому что и наследование и полиморфизм и инкапсуляция не характеризуют объект или класс, т.е. не являются его свойством (синим белым, тяжелым, мягким), они дают функциональность объекту, возможность наследовать свойства не одного класса и т.д.. Свойства бывают у объекта, это по сути его переменные. Когда я писал своей предыдущий пост, я отвечал вот на это сообщение:
Я еще раз повторю (для всех) то, что написал выше. Объект - лишь практическя реализация, которая использует все возможности парадигмы ООП !!!! |
Автор: Fally 2.8.2007, 13:54 | ||
+1 |
Автор: Diesel Draft 2.8.2007, 14:19 |
Что является основой ООП? |
Автор: Mal Hack 2.8.2007, 14:58 |
Основа - концепция программирования, включающая в себя такие концепции, как полиморфизм, наследование и инкапсляция. |
Автор: Diesel Draft 2.8.2007, 15:01 |
Основа это представление все в объектном виде. Поэтому и называется объектно ориентированное программирование |
Автор: Mal Hack 2.8.2007, 15:05 |
Основа - это теория, а объект лишь ее практическая реализация. ООП подразумевае под собой не только описание классов и создание объектов, но и подход к решению задачи, отличный от структурного программирования. |
Автор: SamDark 2.8.2007, 15:08 |
Diesel Draft, Принципы. Вообще модуль сам по себе не обязательно должен быть реализован на принципах ООП. Например, можно реализовать модули классами, можно объектами, можно вообще применить процедурный подход и реализовать систему модулей функциями. |
Автор: Diesel Draft 2.8.2007, 15:09 |
Mal Hack, тебе не кажется что мы будем спорить еще страниц 20? Думаю это бессмысленно, все ровно говорим то самое всегда |
Автор: SamDark 2.8.2007, 15:11 |
Mal Hack, Вообще новичкам отлично объяснятся ООП на примере модулей. Только я предпочитаю открывать системный блок и показывать им железо(объекты классов), разъёмы(интерфейсы) и т.д. |
Автор: Diesel Draft 2.8.2007, 15:16 |
SamDark, Вот хоть ты согласен со мной что мы говорим почти о том самом просто на разных языках? |
Автор: Mal Hack 2.8.2007, 15:18 |
Модули это модули... Мне их объясняли на сях, структурных... Дизель, ты не прав!!! (с) ЕБН |
Автор: Diesel Draft 2.8.2007, 15:26 |
Mal Hack, Объекты это не модули!!! Но на Них можно построить!!!! И не только на них!!! Ты уже сам наченаеш изменять своим словам. И вовсе все что я скажу тебе не нравится!!! |
Автор: Mal Hack 2.8.2007, 15:30 |
Я тебе это и пытаюсь объяснитьб и доказаваю, что модули это модули и к ооп никакого отношения не имеют !!! |
Автор: SamDark 2.8.2007, 15:33 |
Diesel Draft, Mal Hack, Давайте я срезюмирую? Модуль - автономная, взаимозаменяемая на сходные часть целого. В программировании - функционально законченный фрагмент программы. ООП может использоваться для описания модуля, но также модуль можно описать и другими, ничуть не уступающими, способами. |
Автор: Fally 2.8.2007, 15:38 |
Эмм.. конечно прошу прощения, что вмешиваюсь в столь ожесточённую дискуссию ![]() Разницу между классами и объектами чувствуете? Объект - всего лишь инстанцированный экземпляр класса. Т.е. модули описываются классами, а при программировании этих модулей, вы используете эти модули в виде объектов класса. А это важно знать. |
Автор: Diesel Draft 2.8.2007, 15:41 |
SamDark, +1 Mal Hack, ООП можно объяснить разными способами. Я пояснил на модулях, я не привязал. раньше я объяснял на яблоках, но тут долго писать, а мне на русском это сложно делать. А то что ты вцепился в это это уже твоя проблема |
Автор: SamDark 2.8.2007, 15:48 |
Fally, Конечно чувствую. Не зря же написал. Реализация объектами подразумевает описание модулей одноимёнными классами следуя некоторым правилам (такое практиковалось на PHP4) и инстанциирование только одного из них. Diesel Draft, Mal Hack, Не ругайтесь. Всё хорошо ![]() |
Автор: Diesel Draft 2.8.2007, 15:51 |
Mal Hack, У меня ощущение что в реальной жизни я тебе сделал что то плохого, но ни разу тебе не видел |
Автор: Mal Hack 2.8.2007, 16:08 |
Diesel Draft, да нельзая объяснить ООП разными способами. НЕЛЬЗЯ... То, как ты определял через модули - неверно, потому модуль это - объективное понятие, ооп - субъективное... ООП - теория, концепция создания ПО с использованием таких понятий как класс и объект, где последние два - лишь способ реализации концепции, пускай и другого пока не придумали. Модуль - программная единица, файл или группа файлов, объединяющий программный код по функциональному и смысловому назначению. Класс - описание объекта. Объект - некая программная единица, работа с которой ведется исходя из практический части теории ООП, а точнее, которая имеет такие свойства, как наследование, инкапсуляция и полиморфизм. В данном случае не надо придираться к словам, что наследование относится к классам.. Объект все равно производная класса, так что я говорил о следствии... Ну вот честно, я не понимаю, что тут сложного для понимая. |
Автор: Diesel Draft 2.8.2007, 16:17 |
Mal Hack, та вот не понимаешь что это пример. Тебе что никогда ничего не объясняли на других предметах. Это не означает что это оно, просто отдалено похожие. Почему ты вцепился в точность, и отбрасывает остальное |
Автор: Mal Hack 2.8.2007, 16:28 |
Потому, что точности в твоем определении нет... Абстрагироваться-то можно, но у тебя это НЕ ПОЛУЧИЛОСЬ !!! |
Автор: Diesel Draft 2.8.2007, 16:43 |
Mal Hack, Может только ты этого не понял ![]() |
Автор: Mal Hack 2.8.2007, 16:50 |
Исходя из того, что я привел все 4 определения, и не услышал на них ничего против, то судя по всему я прекрасно все понимаю ;) |
Автор: Diesel Draft 2.8.2007, 16:52 |
на мои кроме тебя тоже никто вроде не жаловался |
Автор: Oflashp 2.8.2007, 22:13 | ||
Осилил 3 странице, если уже кто-то это написал, прошу прощения за повтор: При ПОП программировании на PHP: 1)Имеется библиотека с функциями, которая подружается допустим index.php. PHP откладывает функции и параметры в память и ждёт их вызова. 2)Таже самая библиотека, использует какие-то переменные, если обьявлены до функции они становятся доступными без обьявления в теле кода или конструкцией global 3)Если включен перехват переменных из запроса, они становятся глобальными для кода. И если вначале вы определили, что login="Вася", то можно переопределить запросом ...?login="Alex". Это я так к примеру. Для более понятного вот код:
4)Попробуйте в стандартном коде обьяснить, что вот эта переменная относится сюда, эта сюда...Заипетесь При ООП: 1)Пока не вызовите класс, откладываться в памяти ничего не будет 2)Да хоть десять, пока в класс не пропишите, ему будет побоку 3)Читай 2. 4)Решение усложнения структуры класса решает и этот вопрос. Это так на пальцах. Если у вас приложение простое - а под простым приложением понимается не количество кода в строках(комментарии тоже бывают как целый FAQ), а: 1)У вас нет библиотек не написанных вами или библиотек динамических которые подружаются в зависимости от ситуации. 2)Количество библиотек не более 10 3)Количество переменных глобальных не большое 4)Если есть шаблоны, то вкладки и выкладки шаблонов при результате не превышает трех уровней Используйте смело ПОП. Он там не нужен. Для остального юзайте классы. PS: Рекомендую использовать классы так же для построенние модельных и пост-модульных систем. Другим программистам будет проще писать дополнения. |
Автор: WIPS 2.8.2007, 23:52 | ||
Как это не придумали? А JavaScript? A Ada95+? Не всегда. Понятие "класс" для ООП в принципе не является обязательным. |
Автор: Daevaorn 3.8.2007, 00:42 | ||
угу. а в некоторых ОО языках класс сам является объектом. |
Автор: WIPS 3.8.2007, 01:34 |
![]() |
Автор: Daevaorn 3.8.2007, 02:10 | ||
python например с потрясающим рефлекшином. благодаря тому, что все классы сами объекты, к атрибутам которых можно получить доступ и всячески менять. в php увы пока такого нет |
Автор: Fally 3.8.2007, 10:54 |
Это - Я-З-Ы-К-И П-Р-О-Г-Р-А-М-М-И-Р-О-В-А-Н-И-Я. Но никак не концепции программирования. Что за бред? Названия и определения терминов ООП учите. Вот специально для Вас (и не только): 1) Под классом подразумевается некая сущность, которая задает некоторое общее поведение для объектов. /http://ru.wikipedia.org/wiki/%D0%9A%D0%BB%D0%B0%D1%81%D1%81_%28%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%29/ 2) Под объектом подразумевается некоторая сущность, обладающая состоянием и поведением. Как правило при рассмотрении объектов выделяется, что объект принадлежат одному или нескольким классам, которые в свою очередь определяют поведение объекта. /http://ru.wikipedia.org/wiki/%D0%9E%D0%B1%D1%8A%D0%B5%D0%BA%D1%82_%28%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%29/ З.Ы. Механизм отражений (reflection) в РНР есть тоже. |
Автор: SamDark 3.8.2007, 11:29 |
WIPS, Fally, В JavaScript нет ОО в привычном понимании. т.е. классов и объектов. Там совершенно другой принцип, основаный на прототипах. Вот там как раз с натяжкой можно сказать, что "класс сам является объектом", хотя сравнивать прототипное программирование с классическим ОО, а тем более приводить к нему, как многие делают, некорректно. |
Автор: Mal Hack 3.8.2007, 11:43 | ||
Oflashp, мы тут с позиции теории разговариваем, а вы нам снова про практику..
Бред. Яйца без курицы не бывает. Объект нельзя создать без его определения. Другое дело, когда система в программе заранее создает объект по своим прототипам. |
Автор: Daevaorn 3.8.2007, 11:52 | ||||
А Вам бы я посоветовал не писать о том о чем не знаете. А то в лужу сели.
Всё это справедливо для классов в языке python. О чем я и написал выше. Умейте слушать. Да, но не настолько гибкийи функциональный. На что я тоже уже посетовал. Если бы токой появился в php жить стало бы веселения. И в частности ORM было бы делать проще. |
Автор: Oflashp 3.8.2007, 12:27 | ||||
Я же написал, что я прочитал первые 3-4 страницы топика, больше не выдержил. Да и у меня сложен так ум, что проще понять примерами, чем теорией. А вообще сложно назвать ваше обсуждение теорией. Уже обсуждение в стиле: "Начали про то, как установить унитаз, заканчиваете о том, как сделать ремонт во всём туалете." P.S: Ничего личного. P.S2: Остаюсь скромным наблюдателем ![]() |
Автор: Mal Hack 3.8.2007, 12:52 | ||
Я точно также, но есть некоторые теоретические аспекты, которые надо понять, как теорию.. В догонку. Не знаю как и что в Питоне реализовано, но надо отдавать себе отчет, что сегодня, фактически используются 2 модели ООП. Первая - чисто ООПшная модель - используемая в визуальном программировании, где присутствует принцип событийности, немаловажный для ООП, как вид взаимодействия объектов. Вторая - информационная, как в ПХП, например, где объект в коде программы не отождествляется с каким-то вещественным субъектом, кнопкой и т.п., т.е. носит, фактически, информационный, сугубо механико-рабочий характер. Питон, если я не путаю, из того, что я о нем слышал, относится к первой категории. |
Автор: Daevaorn 3.8.2007, 13:02 | ||
ну я бы не стал так разделять. В конце концов, что мешает мне реализовать событийную ситему в php. Ничего. Поэтому это не модели, а лишь способ применения. И зависит от решаемой задачи. |
Автор: Mal Hack 3.8.2007, 13:08 |
Да, разделение - условное. Нов от в PHP вы не можете использовать событийность, связанную с графисечким интерфейсом - раз. Два, любоую событийность, как взаимодействие между объектами, вы должны, в случае PHP, полностью отпрограммировать сами, а в том, первом случае, о чем я писал выше, механизм событий, реализовывается через системное API. |
Автор: SamDark 3.8.2007, 13:17 |
Mal Hack, Можем мы использовать событийность, связанную с графическим интерфейсом. AJAX нам на что? Если не хочется программировать событийную модель самостоятельно - можно всегда использовать фреймворк... благо они есть. |
Автор: Daevaorn 3.8.2007, 13:18 |
Допустим событийная система реализована в биндингах GUI библиотек для в php, в частности в PHP-GTK. А именно системное API конечно есть, но не так уж и частно встречается, сразу на ум приходит Delphi. Так что я не совем соглашусь, что имеено это делит ООП на модели. |
Автор: Oflashp 3.8.2007, 13:31 | ||
AJAX - JavaScript, который мы моем лишь связать с PHP. Точнее PHP использует не своё средство представления событийности |
Автор: vasac 3.8.2007, 14:04 | ||||
Присоединюсь к чату ![]()
В JavaScript есть ОО. Если под привычным пониманием понимается "классориентированная версия ООП, к которой привыкло большинство", то, да, такого нет. Но объектно-ориентированное программирование, это программирование с ориентированием на объекты ![]()
Питон как раз ближе к прототипному ООП, а классы там, видимо, в основном для того, чтобы не слишком пугать людей, как в JS. |
Автор: Mal Hack 3.8.2007, 15:08 | ||||
Событийность имеется ввиду во время работы скрипта, а тот же Ajax просто вызывает скрипт PHP по какому-то действию, а вот внутри PHP событийности нет.
Не совсем понял мысль. Как я уже говорил, разделение, о котором говорил я - условное в том плане, что концепция - одна, но вот практический смысл, технические возможности - разные (в одном более широкие, в другом ваианте более маленькие). Без класса нет объекта!!! JS либо должна в себе содержать внутри определения классов, либо она просто дает синтаксис, близкий к ООП... |
Автор: vasac 3.8.2007, 15:12 | ||
А вот и есть ![]() Синтаксис она как раз дает далекий от "классического" ООП. Но в том чтобы следовать принципам ООП это ей не мешает. |
Автор: WIPS 4.8.2007, 01:14 | ||||||||||||
JavaScript я привел как пример концепции прототипного наследования, к тому же в этой концепции нет классов. Ada95 - пример реализации концепции статической типизации (по умолчанию запрещено наследование).
Потрудитесь почитать собственную ссылку 10 строками ниже и увидите: "...объекты являются экземплярами некоторого заранее описанного класса (однако например в таком языке как JavaScript понятие класс не используется вовсе)..." Fally, не нервничайте, просто попытайтесь понять о чем говорит собеседник. И не надо такого к-ва заглавных букв, это плохой тон.
Во-первых, не надо приписывать мне слова "класс сам является объектом". Я такого не говорил и пока даже не видел (хотя не скрою, мне эта тема показалась интересной). Во-вторых, я прекрасно осведомлен о тех принципах на которых базируется объектная модель в JavaScript (JS). В-третьих, никто здесь не говорил, что надо приводить прототипную модель наследования к классической (как я понимаю вы имеете в виду сиобразную). Вобщем, внимательнее читаем посты и не выдумываем того, чего нет.
Пожалуйста, не давите меня такими сильными аргументами как "бред" и "яйца без курицы не бывает". В JS объект может определяться во время создания. Причем его как вы выражаетесь "опеределение" может изменяться по ходу выполнения программы. Где здесь бред? Где "система в программе заранее создает объект по своим прототипам"? Давайте не будем опускать довольно мощный язык (и представляемую им концепцию) до уровна onclick="" и getElementById, только потому, что в основном он исп-ся в браузерах.
Событийность таки есть, взять хотя бы сокеты, можно их слушать, можно реагировать на изменение их состояния.
ООП - это три принципа (наслед-е, инкапсуляция, полиморфизм), надеюсь с этим никто спорить не станет. Все эти 3 принципа реализованы в JS, есть и объекты, но при этом нет классов. Что вы имеете в виду под словами "должна в себе содержать внутри определения классов"? Нет в JS классов ни внутри, ни снаружи, и не нужны они там. Либо у нас с вами разные определения слова "класс"... |
Автор: Mal Hack 4.8.2007, 13:32 | ||||||||
Определение этого класса, так или иначе, должно быть, оно зашито в движок JS. В противном случае это структура с синтаксисом объектного доступа + изменяемость.
Эта событийность реализуется ручками, от и до...
Я уже писал выше... Удосужтесь еще раз почитать... С точки зрения практической реализации ООП вы правы, но по большому счету - нет.
Если вы работали в Делфи, то я имею ввиду TObject, определенный в самом языке, а не тот, который определяете вы. |
Автор: Daevaorn 4.8.2007, 13:38 |
Приведи пример, где не ручками. |
Автор: vasac 4.8.2007, 14:30 |
Все-таки, чисто имхо, в ОО-программировании важно взаимодействие объектов, а не их родословная. Объекты взаимодейтвуют друг с другом через представляемый интерфейс. А откуда взялся этот интерфейс, от статической иерархии классов или от цепочки прототипов, тому кто его использует должно быть безразлично. Поэтому, опять таки имхо, понятие "объект", важнее, понятия "класс". "Класс", это наследие жесткой типизации, что есть ограничение компилирующих языков (хотя многие скажут, что это благо, а не ограничение). В C++ нужна эта иерархия, чтобы на этапе компиляции преобразовать вызовы функций в переходы на нужный участок памяти. А в PHP уже и не нужно, там наследование классов, просто позволяет более легко строить эти классы. А если нужно вызвать какой-то метод объекта, то важно только само наличие этого метода у объекта, а не принадлежность его какому-то классу. С абстрактной точки зрения, классовое наследование похоже на прототипное. Класс содержит набор свойств и методов и ссылку на родительский класс. При вызове метода объекта, он ищется в его классе, если там нет - в предке. Пускай в компилирующих языках это делается не совсем так и не на этапе исполнения, но сама суть та же. Класс определяет набор однотипных объектов. Однако, уже в PHP это не совсем так. Т.к. как там в начала цепочки поиска ставится сам объект. С учетом того, что в него можно добавлять свойства, а так же устроить перехват несуществующих методов, то все становится не так четко. Объект, в который добавлены новые свойства, уже не совсем объект того класса, от которого наследован, он не до конца подобен другим объектам того же класса. А в прототипном наследовании нет цепочки классов, там цепочка объектов. Главное отличие - это не абстрактные структуры, а именно объекты с которыми можно работать, как обычно. И в движок не зашито никаких определений классов, там есть предопределенные объекты для конкретных типов, которые можно спокойно изменять. Преимущества такого подхода (во всяком случае для области применения подобных языков, это преимущества): - Можно создавать набор похожих, но несколько различных по поведению объектов, не создавая при этом громоздкую иерархию классов и не таская её вместе с программой (очень важно для JS) - Можно динамически изменять (дополнять) поведение объектов определенного "типа" путем изменения прототипа (для JS с обилием предопределенных объектов и различными реализациями в браузерах, очень полезно) - Можно динамически изменять иерархию наследования (конкретно в JS нельзя) - Утиная типизация значительно повышает гибкость. Это не совсем к прототипам, но тоже то, чего нет в "классическом" ООП. Т.о. "классы", отнюдь не такая необходимая вещь. |
Автор: Mal Hack 4.8.2007, 14:56 |
В PHP такого нет. В Делфи, к примеру при нажатии на кнопку ты описываешь процедуру, но вот за механизм вызова этой процедуры отвечает система. |
Автор: Daevaorn 4.8.2007, 15:01 |
а система это что? Библиотека VCL, которая тоже написана ручками, которая обработчик нажатия на кнопку и запускает. Другое дело что на самом низком уровне можно забиндить методы на события Windows, но напряму к интерфейсу это не относится. Так что пример половинчатый. |
Автор: WIPS 5.8.2007, 12:09 | ||||||||||||
Это аксиома? Почему вы так твердо убеждены, что без классов не может быть объектов? С тем, что написал vasac, http://forum.vingrad.ru/index.php?showtopic=131045&view=findpost&p=1216654 вы тоже не согласны? Если бы эта событийность реализовывалась библиотекой от MS это бы считалось для вас "настоящей" событийностью?
Если рассматривать класс чисто как тип данных, то можно сказать, что они есть в JS (это будут классы "number", "string", "boolean", "object", "function", "undefined"). Но следуя этой логике можно сказать, что классы есть в любом языке, в котором хотя бы различаються типы данных число и строка.
Пожалуйста в след. раз дайте ссылку на то, что я дожен почитать (перечитывать все страницы в поисках одного поста довольно утомительно), но тем не менее я почитал еще раз и вот что нашел:
Вы говорите тоже, что и я... Почему я не прав по "большому счету"? Серьезно, без обид, объясните в чем моя ошибка. А если вы имели в виду это:
, то это ваше личное определение ОПП, которое вы почемуто считаете за аксиому. А о надобности классов в концепции ООП я с вами согласиться не могу, т.к. пока не увидел доказательтсва этого. |
Автор: WolfON 5.8.2007, 13:14 |
имхо, ооп - система описания взаимодействия объектов на основе их реальных сущностей. а классы, инкапсуляция и все остальное - это средства для их описания. WIPS, +1 |
Автор: Zeroglif 5.8.2007, 13:47 | ||
OOP - общая парадигма, под крышей которой должны сосуществовать разные языки. Приверженцы CBLs (class-based languages) обожают обвешивать общую парадигму своими собственными фишками (только классы, без классов нет ООП вообще и т.п.), что автоматически отрицает существование других объектно-ориентированных языков, в которых просто нет классов, как таковых, тех же PBL (prototype-based languages). Это несеръёзно. PBLs, замечательным представителем которых является тот же javascript или SELF, строят свою концепцию именно на отстутствии какого-либо разграничения "класс-экземпляр", старательно выравнивая объекты.
|
Автор: Mal Hack 5.8.2007, 14:21 | ||||||||||||||
Потому что ни одна переменная не может существовать без своего описания, быть не типизированной.
Дело не в MS. Я имею ввиду то, что механизм возникновения событий и передача управления обработчкику Вами как программистом уже не программируется, и что этот механизм уже отпрограммирован и находится в системе.
Потому, что вы видете сразу к практике, забывая о теоретичекой сущности самого ОО подхода. Эти три принципа - те вещи, которые делают ООП именно ООП, но с практической точки зрения. Но они являются лишь следствие объектно-ориентированной концепции, подхода, которая подразумевает под собой определенный вид взаимодействия объектов, определенные этапы разработки и их стадии. И эти три принципа позволяют эту теорию осуществить на практике.
А разве класс не тип данных? Да, и в Паскале и в Бэйсике, наверное, есть классы, и в ПХП. Но, позволяются ли классы в паскале, как и в ПХП, полностью использовать мощь ООП? Отюсда и то, небольшое разделение о котором я говорил. Делфи и Паскаль, к примеру. Классы есть и там и там, а вот в каком из них реализуется ООП концепия - как раз тот самый вопрос. ПыСы, мог перепутать наличие классов в Паскале с Сями(С++) в консоли... Очень давно с класическим паскалем не работал.
Не то, чтобы за аксиому, просто на сегодняшний денья не вижу таких моментов, которые "убивали" бы какие-то мои высказывания. Так уж получилось, что я расматриваю программирование не только с позиции практики, но и с позиции теории, проектирования, построения моделей, а посему, считаю не правильным отделение теоретических, пусть и небольших, основ от практического применения. Хоть программирование и сугубо практическая вещь, но малая доля теории все же есть. По крайней мере, я хорошо помню, как для меня отличался процесс проектирования программы в консоли (структурне программирование) от визуального (можно сказать объектного)..
В концепции ООП классы и не присутствуют. Классы, как я уже говорил выше - это описание системы, если хотите, объекта, уже в практической части, которые позволяют реализовать эту концепцию. |
Автор: sTa1kEr 5.8.2007, 16:08 | ||||
События - это, по сути, всего-лишь коллекция делегатов, вызываемых поочередно. По этому это совершенно не принципиально.
|
Автор: Mal Hack 5.8.2007, 18:01 | ||
Не согласен. События - вид взаимодействия объектов друг с другом или реакции на какие-то внешние воздействия, механизм которых не реализуется самим программистом. Ты же просто вызвал метод и все. |
Автор: sTa1kEr 5.8.2007, 19:12 | ||||||
Подписка/отписка на событие заключается в добавлении/удалении делегата в/из коллекцию. Вызов события, соответственно, инициализирует вызов всех подписанных событий. Это и есть механизм событий. И не важно реакция это на внешнее воздействие или часть внутренней логики. Иначе хотелось бы услышать аргументированный ответ.
Это все отличие на примере C#. Да, в PHP это делается явно, а в C# об этом заботится компилятор, но суть от этого не меняется. |
Автор: Mal Hack 5.8.2007, 19:28 |
Вот я про это и говорю !!! Событийность и там событийность, но в |
Автор: WIPS 5.8.2007, 23:25 | ||||||||||||
Если рассматривать класс чисто как тип данных, то я с вами соглашусь.
То, что вы называете ООП подходом в проектировании, все таки отличается от ООП подхода в чисто программировании (читай кодинге, или то что вы называте "чисто практической точкой зрения"). Да, при проектировании приложения выделяются сущности (насколько я понял, именно их вы называете классами в этом случае), способы, варианты их взаимодействия и пр.. На основе их в коде появляются классы (если это CBL) или сразу объекты (если это PBL). От бизнес логики приложения никуда не деться, такие "классы" будут в любом приложении.
В паскале есть классы. Только по иронии судьбы для их описания используется ключевое слово "оbject" =)
Не вижу приципиальных отличий в проектировании визуального и консольного приложения... Взять, например виндовый notepad и тот-же vim, логика приложений в принципе одинаковая, в чем разница при проектировании?
В таком понимании класс больше походит на интерфейс, т.е. описания возможностей объекта и способов взаим-я с ним.
sTa1kEr, +1. |
Автор: SamDark 6.8.2007, 12:01 | ||||
Mal Hack, Кстати, в PHP5 есть уже реализованная событийная модель: http://www.php.net/~helly/php/ext/spl/interfaceSplObserver.html http://www.php.net/~helly/php/ext/spl/interfaceSplSubject.html
Даст нам:
|
Автор: Diesel Draft 6.8.2007, 12:26 | ||
SamDark, +1
|
Автор: Mal Hack 6.8.2007, 12:57 | ||||||||||
Не могу согласиться с тобой. Практика реализует теорию, и иначе быть не может. Да, при проектировании ты смотришь на предметную область, при реализаци уже на программные единицы - объекты, которыми оперируешь, но без первого второго не будет. В это и смылс, имхо, ООП как концепции, которая очень удачно совмещает теорию с практикой в результате чего получаем на практике те возможности, которые имеем.
Да, да, вроде так.
В консоли, фактически, ты используешь четко структурное программирование, в визуальном, где есть полная событийность, ты уже мыслишь по другому, в том плане, что при структурном ты НЕ можешь куда-либо перескочить, т.е. последовательность действий, отчасти - ограничена, а в визуальном, используя событийность ты в принципе не ограничен в выполнени действий. Т.е. ты видишь работу программы, как общую схему взаимодействия, а не как четкую последовательность действий.
А разве это не так? Разве классы не дают именно этого?
Я не говорю, что в ПХП событийности нет. Я говорю, что ее полностью надо самому реализовывать. PS: а хорошая дискуссия получается ;) |
Автор: vasac 6.8.2007, 13:47 |
Оттого, что класс что либо дает, не значит, что это не может быть получено без использования класса. |
Автор: SamDark 6.8.2007, 14:54 |
Mal Hack, Не нравится самому - используем фреймворки. p.s. на object pascal тоже можно без vcl писать... |
Автор: Mal Hack 6.8.2007, 15:30 | ||
При чем тут фрэймворки... Можно, но опять при чем тут это? Ты же использует TObject тот же, если надо что-то визуальное сделать.
Переменная может быть без своего определения? нет. Другое дело, что она определяется самим языком, а не программистом. |
Автор: Daevaorn 6.8.2007, 15:48 | ||
Складывает впечатление, что для тебя программирование делится на визуальное и не визуальное. Однобоко однако. |
Автор: Mal Hack 6.8.2007, 16:00 | ||
Далеко не только, тем не менее, такое структурирование - уместно ;) |
Автор: egao 6.8.2007, 17:19 |
TObject - это не более чем корневой объект фреймворка VCL, который существует не только для дельфей, но и для сей и для пхп. искать по словам delphy for php - там и события и визуальный редактор и тп плюшки. на уровне языка никаких событий нет. насколько мне известно на уровне языка события есть только в аспектно-ориентированных языках. и не надо отделять Объектно Ориентированное Программирование от собственно программирования и оттаскивать его в сторону проектирования. для проектирования существует uml и иже с ним. для программирования важны объекты и их взаимосвязи. классы не в тему совершенно. классы позволяют дополнительно типизировать объекты. а нафига? концепция объектов - это концепция умных данных. то есть в идеале внешнему коду должно бы глубоко пох какой там у объекта тип - главное, чтобы он поддерживал необходимый интерфейс. отсюда вывод: классы - откровенно вредная сущность с которой нужно бороться. и ещё, в пыхе класс фактически является объектом-синглетоном. банально потому, что он умеет хранить в себе данные, то есть ведёт себя как объект. |
Автор: WIPS 6.8.2007, 23:12 | ||||||||||
Да, одно зависит от другого, но не всегда теория прямо проецируется в код. Просто в CBL отличия между моделью, описывающей логику и программной моделью невелики, а PBL они больше, вот и все.
Нет никаких отличий в событийности консольного приложения и визуального. Какая разница, вызывается обрабочик событий по клику мышкой или при нажатии комбинации клавиш?! Да и вобще события не обязательно порождаются пользователем, опять же сокеты, программные и аппаратные прерывания и пр. Извини, но твои аргументы в пользу разделения программ на визуальные и консольные меня совершенно не убедили. Дают. Но, что если интерфейс объекта может меняться во время исполнения программы? Тут классы совершенно не годятся.
Согласен.
Не согласен. Всякая вещь полезна если ею правильно пользоваться. И классы не исключение. Но и не панацея от всего.
Если ты про статические члены класса, то ты прав. Однако в данном случае это идет только на пользу. Кстати, как-то пытался использовать такую возможность в ObjectPascal и не нашел... мож ее там и нет? |
Автор: SamDark 7.8.2007, 11:03 |
Mal Hack, TObject, как уже было сказано, не более чем корневой объект фреймворка VCL. Это не базовый объект языка. |
Автор: WolfON 7.8.2007, 12:36 | ||
SamDark, Не VCL единым.
http://ru.wikipedia.org/wiki/TObject http://www.delphisources.ru/pages/faq/faq_delphi_basics/TObject.php.html В большинстве языков с элементами ООП применен принцип базового класса - все остальне которые являются его наследником. А в похапэ такого нет - да это особо и не нужно. |
Автор: Mal Hack 7.8.2007, 13:56 | ||||||||
Согласен, но согласись, в любом случае, практическая реализация в той или иной степени все равно основывается на теоретических понятиях. На них можно и забить, но вот работоспособность, точнее безопасность и оптимальность кода будут большим вопросом стоять.
Ты не совсем меня понимаешь. Я имею ввиду не вызов события, так сказать, как сам факт его появления - клик мышкой по кнопке, а механизм передачи управления, в зависимости от события, определенному программному коду (методу, функции и т.д.).
Да, так, но если честно, не совсем могу себе представить задачу, где бы это было бы необходимо.
Это базовый класс для описания визуальных объектов в среде OP... |
Автор: Daevaorn 7.8.2007, 14:09 | ||
ORM? это базовый класс по умолчанию для любого user-defined класса. |
Автор: Mal Hack 7.8.2007, 14:16 |
я имел ввиду изменение интерфейса объекта во время работы. Все поняли что это ![]() |
Автор: Daevaorn 7.8.2007, 14:20 |
ну так, интерфйес подстраивается под конкретную модель данных. причем имено во время выполнения, поскольку процесс "подстройки" автоматизирован, а не лежит на плечах программиста |
Автор: SamDark 7.8.2007, 14:30 |
Daevaorn, Кстати, гадость ещё та т.к. тормознутая из-за дополнительных запросов... |
Автор: Daevaorn 7.8.2007, 14:32 | ||
да есть такое. но вопрос решаемый, т.е. найти оптимальный вариант можно. а положительные стороны перевешивают эти недостатки. |
Автор: Mal Hack 7.8.2007, 15:17 | ||
А на практике где применимо? Мне чисто из любопытсва интересно. |
Автор: SamDark 7.8.2007, 15:25 |
Mal Hack, На практике применяется обычно несколько другой вид ORM. См. http://propel.phpdb.org/trac/. |
Автор: Daevaorn 7.8.2007, 15:27 |
Ну как же, во всех RAD MVC фреймворках: клонах и не клонах RoR. |
Автор: Mal Hack 7.8.2007, 15:35 |
С фреймворками не работал, к сожалению, либо очень мало и не на PHP... |
Автор: Fally 7.8.2007, 15:38 |
Daevaorn, кстати, меня всё интересует... все хвалят ORM... как я понял, то с его помощью можно и загружать данные из базы в объект. Если я правильно понял, то вопрос: Откуда гарантия что запрос к БД будет оптимальным с точки зрения производительности? |
Автор: Daevaorn 7.8.2007, 15:49 | ||
такой гарантии нет. все зависит от авторов ORM библиотеки. благо их щас развелось достаточно много и есть из чего выбрать. но всё равно в нетривиальной ситуации оптимальный запрос напишет только сам человек. поэтому иногда приходится ручками до SQL снисходить. обычно для этого тоже предусмотрены специальные инструменты, которые позволяют даже на основе "ручных" запросов создавать в итоге объекты. Зато ORM очень выручает, когда сложных запросов не много и нужно просто получить список неких объектов без сложных условий. ну и бесплатно получается некая структурность кода |
Автор: WIPS 8.8.2007, 00:38 | ||||
Согласен, забивать ни на что нельзя. Все потом боками вылезает.
В одном случае этот механизм реализуется ручками, в другом автоматически, однако у нас по прежнему остается набор входных воздействий и реакций на эти воздействия. |
Автор: SamDark 8.8.2007, 10:57 |
Mal Hack, Я выше дал ссылку на propel. Наверное зря... штука пугающая. Лучше ORM посмотреть на http://www.ezpdo.net/. Там всё проще и без заморочек... |
Автор: Mal Hack 8.8.2007, 12:50 | ||
Вот я про это отличие и говорю. SamDark, посмотрю на досуге. |
Автор: SamDark 8.8.2007, 13:32 | ||
Автомат тоже кто-то делал ручками. Что нам мешает один раз сделать и наслаждаться? |
Автор: WIPS 8.8.2007, 18:33 | ||
Ничего не мешает. Я с этим и не спорю, а наоборот придерживаюсь этого мнения. |
Автор: chief39 31.8.2007, 17:56 | ||
"Чтобы понять рекурсию, надо понять рекурсию" ![]() |
Автор: Diesel Draft 1.9.2007, 00:34 |
chief39, +1 |
Автор: CyClon 28.11.2007, 09:30 |
Если писать CMS или что-то, что в дальнейшем будет очень часто модифицироваться, то естественно ООП. Если же нам нужно получить небольшой скрипт, который будет работать на большинстве платформ, причем быстро - тогда процедурное. |
Автор: cccr85 13.7.2010, 09:56 | ||
Прочитал данную тему пока только до середины, и внесу свои 5 копеек. Я программирую на php. Нигде не учился, все сам. И так, что мы имеем. Что такое класс? Нет это не class myClass {} а это КЛАСС каких либо повторяющихся вещей, предметов и т.д. Теперь что такое объект этого класса? Нет это не $Object = new myClass; А это один экземпляр класса. К чему я все это? А к тому что например у нас есть программа, которая работает например на компьютере пользователя, в этой программе есть например кнопочки, и практически все кнопочки похожи по своим характеристикам. Разнятся только действиями при клике на нее, надпись на кнопке. В итоге имеем один базовый класс кнопок, и классы которые расширяют базовый и говорят что делать при клике. Теперь для того чтобы создать сколько угодно кнопок, достаточно создать объект кнопки примерно так: $button = new myButton; // class myButton extends basicButton { $button->name = 'Моя кнопка'; // Текст на кнопке $window = new myWindow; $window->setButton($button); Все, кнопка отобразилась на окне, красота? Я думаю да. Понятно все? Да. ООП мне нравиться? Да. Ок. Разберем еще один пример, играем мы в стратегию, и там есть юниты, все они похожи, но кое в чем разнятся, ёмаё, да это еще один класс и его расширение. И таких примеров много!!! Но теперь вернемся к нашему php, я пока для себя нашел только один похожий на примеры выше код. Чуть предисловия: Класс базы данных. Раньше я делал так, создавал объект базы данных, в котором были методы конекта, отправки запроса, проверки данных, получения результата и т.д. На одном из форумов, или у кого то в библиотеки я подсмотрел идею что класс mysql должен только конектится, и делать запросы, а вот результат отдается в виде объекта, с которым я могу работать. Более того, при работе с результатом есть много общих действий для всего класса ответов на запросы, например освобождение памяти, получение размера, и т.д. Здесь ооп мне понравилось. Я понял его суть. В самом начале темы, говорили, что классы = набор функций заключенных в конструкцию class. Как я уже писал выше, класс это чуть другое. К сожалению других применений ООП в php я пока не вижу. В общем вот что я думаю. Добавлено через 4 минуты и 20 секунд
Позволю себе не согласиться, например все та же злосчастная кнопка является объектом!!! С ней удобно работать как с объектом. |
Автор: youri 13.7.2010, 15:09 |
отличить ООП-код от не-ООП на самом деле очень просто: 1. Берем исходники 2. Ищем полиморфизм ... PROFIT т.е. фактически сама задача определяет, будет ли использовано ООП. Нету юнитов - нету меда ;) по поводу событийности/визуальности... разделение, естественно, имеет место быть. Хорошо, а что важнее событийность или визуальность? Возьмем, например, java/c# в контексте веба. В php событийность - это запросы от сервера, только все объекты умирают от запроса к запросу. В java/c# это не так (насколько я знаю). Т.е. вроде как событийность есть, но нету визуальности... но в любом случае я не понимаю, почему это приводит к разделению на тру-ООП и нетру-ООП. Да, написание web- и десктопных приложений отличается. Но я бы сказал, что ООП - это в первую очередь подход к решению поставленной задачи. Да, это умирание объектов от запроса к запросу не вызывает к ним уважения. Но тем не менее, если ООП было удобно применить к некоторой задаче, значит она была решена с использование ООП по поводу ПОП... я думаю, что ООП - это продолжение ПОП, т.е. решение достаточно сложной задачи с помощью процедурного языка программирования в результате приведет к ООП-решению, несмотря на отсутствие в языке соответствующего синтаксиса |
Автор: SneG0K 20.7.2010, 11:59 |
ООП - это гламурно ![]() |
Автор: cccr85 20.7.2010, 15:09 |
А вообще тем кто хочет понять ооп, и тем кто хочет прокачать свой скил в программировании, советую посмотреть в сторону фреймворка. Начать лучше всего с http://code-igniter.ru/ изучить его, по ссылке очень хорошая документация, когда читал про него, мне все нравилось, но в последствии многие вещи, я посчитал лишними, и не нужными. После того как изучен кодеигнитер, самое время посмотреть что нибудь повеселее, http://kohanaframework.org/guide/api полностью ООП, HMVC паттерн, и еще много вкусностей. Сейчас сделаю один проект на ней, и пойду изучать yii |
Автор: NLspieler 22.7.2010, 22:03 |
Совсем не обязательно все объекты должны умирать. Объекты-«долгожители» можно спокойно хранить в массиве $_SESSION и тогда им уже ничего больше грозить не будет Отсутствие событийности очень легко обходится при помощи javascript + ajax + php скрипт(ы), которые при разных запросах, будут производить разные действия, например, применять методы к объектам, которые хранятся в $_SESSION Впрочем, некая событийность есть даже при отсутствии javascript. Отправка формы или нажатие на get-ссылку: чем не событие? |
Автор: youri 22.7.2010, 22:49 |
такое впечатление, что ты, чтобы доказать что в php объекты не умирают, будешь всех их сериализовать/десериализовать в БД. Перечитай тему еще раз. java - это постоянно работающее приложение, которое отвечает на запросы, php - это набор скриптов, которые запускаются в результате запроса. Отсутствие событийности не надо обходить |
Автор: Muerto 10.9.2010, 17:53 |
На самом деле нету Объектное вс процедурное... это скорее объектное + процедурное вс только объектное... И здесь выигрывает однозначно объектное + процедурное... Без самых базовых типов, куда мы денимся... все равно отдельные части всегда будут в процедурном стиле, как бы нам не хотелось... |
Автор: bars80080 10.9.2010, 19:21 |
да ладно. я первый год классами вообще не пользовался |
Автор: NFL 20.7.2011, 00:07 |
Пока мне не довелось столкнуться с MVC (в ZF), я тоже ООП пнименял по минимуму. Теперь уже не представляю, как можно писать без применения ОО-подхода что-то сложнее визитки) ![]() |
Автор: Genn 8.8.2012, 20:26 |
> объектное vs процедурное хм... исключительно в зависимости от проекта, от сложности и наследуемости объектов в нем |
Автор: Gold Dragon 15.1.2013, 07:44 | ||||
Тема древняя и бестолковая ![]() Лично я уже всегда использую объектное, процедурное только как "короткие формы" исключительно чтобы сократить код и для наглядности, например чтобы не писать это
достаточно сделать пару функций
|
Автор: xoptov 25.1.2013, 11:02 |
+1 Я не за "объектное vs процедурное", я за "объектное & процедурное". |
Автор: Deja_Vu 1.4.2013, 10:26 |
Бред какой то. Тут большая часть вообще не понимает что такое ООП и с чем его едят. Вот список вопросов для того, что бы оценить свои силы, в понимании ООП:
|
Автор: Gold Dragon 1.4.2013, 10:43 | ||
![]() ![]() |
Автор: baldina 1.4.2013, 12:01 | ||
большая часть вообще склонна к непониманию. я только один ценный пост вижу: кстати, с чем положено есть гламур? |
Автор: Deja_Vu 1.4.2013, 14:25 | ||
Это вопросы с которыми я столкнулся в процессе работы с людьми над большими проектами. Если человек не знает ответов на эти вопросы, значит и код его будет доставлять неприятности всей остальной команде. Вся процедурщина анархия вообще вытекает лишь тогда, когда человек не понимает для чего нужно ООП. В чём его предназначение. Если же человек понимает, тогда "объектное vs процедурное" вообще не стоит, ибо первое создано что бы снизить сложность понимания исходного кода продукта. Второй же подход не имеет инструментов что бы добиться снижения этой сложности, а потому в принципе не может больше подходить к разработке программных продуктов. |
Автор: Gold Dragon 1.4.2013, 14:29 | ||
![]() |
Автор: Deja_Vu 1.4.2013, 14:34 | ||||
Не совсем понял иронии. В принципе у программиста с большим опытом есть уже "чувство" когда и как лучше писать. Только вот понимать что ты делаешь надо. Иначе мне такие программисты напоминают алхимиков, которые пробовали ингредиенты на вкус для определения, чем они являются. |
Автор: baldina 1.4.2013, 14:35 | ||
а можно узнать и как это проявляется ? и еще. если Вам удалось раз и навсегда решить
с удовольствием послушаю решение |
Автор: Gold Dragon 1.4.2013, 14:46 | ||
да вообще иронии нет.. Вот только как знание ответа на вопросы поможет в написании кода... Возьми с десяток проектов с абстрактными классами, всё реализовано но у всех по разному.. а мне больше всего хочется послушать вот по этому, особенно по второй части
|
Автор: Fortop 1.4.2013, 16:15 | ||
Ну и как они связаны? ![]() Добавлено через 49 секунд
Почему по-умолчанию считается, что их использовать нельзя? ![]() |
Автор: krundetz 2.4.2013, 15:50 | ||||||
а как вообще можно сравнивать эти этапы эволюции программирования? Процедурный подход, предшествовал структурному, а он в свою очередь предшествовал ООП. И все эволюционные этапы направлены именно на облегчение понимание большого объема исходного кода, а следовательно на облегчение его поддержки.
может использовать вместо должен слово может? если вопрос верен, и именно в этом слове подвох то, не должен.
все гораздо хуже, так как у алхимиков были не совершенные методы исследования. Но они были, а у этих и методов исследования нет никаких. Сегодня один такой деятель, пытался решить проблему ограничения времени выполнения скрипта на хостинге в 30 секунд при помощи введения вызова функции sleep(30). Я бы назвал таких людей не желающими смотреть куда тыкают своим пальцем, пусть это будет фекалии или высоковольтные провода. а почему можно? |
Автор: baldina 2.4.2013, 16:34 | ||
опрос затеять штоли)))) |
Автор: Fortop 2.4.2013, 22:03 |
Можно - потому что есть возможность ![]() |
Автор: krundetz 3.4.2013, 11:40 |
можно много чего, например из ружья выстрелить себе в ногу, но ведь никто в здравом уме так не делает вообще на мой взгляд вопросы не совсем корректны в формулировках? зачем? |
Автор: baldina 3.4.2013, 11:47 |
что бы устроить холивар остроконечников и тупоконечников |
Автор: Fortop 3.4.2013, 13:06 | ||
Перечитай свой вопрос. Ты спрашивал "а почему можно" А нужно ли - это совсем другой вопрос ![]() |
Автор: krundetz 4.4.2013, 09:54 |
спалил Ну вот я и говорю, что вопросы не совсем корректны который ни к чему не приведет, так как у всех разный опыт, кто то программирует простые проекты но считает их мега сложными, кто наоборот и т.д. и т.п. В общем выборка будет не презентована. |
Автор: Deja_Vu 9.4.2013, 16:42 | ||||||||||
Такс, извиняюсь, что пропал. Времени не было.
Protected методы уровня абстракции класса подразумеваются, что используются в absctract методах. Например, если у вас в уровне абстракции есть public метод и в нём используется protected метода, а так же есть abstract метод - то это ошибка проектирования. Это следует из принципа единой ответственности. Класс, который показывает, каким способом расширяется приложение, должен быть ответственен за один из способов расширения.
Нет, не должен. Опять же следует из принципа единой ответственности. Чаще всего этот вопрос возникает, когда нужно использовать в методах класса getter/setter. Если ваш класс ответственнен за предоставление данных, то он не должен их же использовать. Если нужно выполнять какую то не тривиальную операцию в классе, нужно либо выделить дочернюю абстракцию с решением данной задачи, либо создать отдельный класс, для её решения.
Да, вы правы, я не верно задал вопрос.
Вы более элегантно изложили то что у меня вертелось в голове, спасибо. Добавлено @ 16:52
Это самый замечательный функционал, который ввели не до конца продумав. На мой взгляд static методы нужны и оправданы лишь для порождения экземпляра текущего класса (или дочерних) и получение информации о не расширяемых свойствах класса. |
Автор: baldina 9.4.2013, 16:58 | ||||||||
имхо чушь например, что тут не так?
с чего бы это?
или я должен отдельный класс создать для вычисления массы? ![]() ![]() Добавлено @ 16:58 гы. на С++ написал. ну, думаю меня поймут |
Автор: Fortop 9.4.2013, 20:11 | ||||
Чего? Кем подразумеваются?
Не понял. Т.е. если у меня в сеттере происходит фильтрация каких-то raw значений. То, если я буду устанавливать свойства скопом (например, инициализации массивом при создании объекта класса), я должен буду этот же функционал фильтрации реализовывать еще раз? Или создавать специально для этого случая приватные/протектед методы для каждого из свойств и вызывать их в сеттерах и конструкторе соответственно? А нафига? |
Автор: baldina 9.4.2013, 23:23 | ||||
для чего по вашему нужны getter/setter? особенно, если операция тривиальная. что бы при изменении операции (не наследовании, а именно изменении в процессе разработки) не нужно было переписывать доступ к элементам класса. других резонов нет. если другие функции этого класса (неважно с каким модификатором доступа) должны получать доступ к этому элементу, логично этот доступ реализовать через getter/setter именно для упрощения обеспечения целостности класса в при его изменениях. а плодить абстракции вообще надо http://ru.wikipedia.org/wiki/%D0%91%D1%80%D0%B8%D1%82%D0%B2%D0%B0_%D0%9E%D0%BA%D0%BA%D0%B0%D0%BC%D0%B0 |
Автор: Deja_Vu 10.4.2013, 08:16 | ||||||||
не поймут. То что это вообще не подходит под тот случай, который я описыва. Где здесь абстрактный метод?
Если я правильно понял это C++ творчество, то тут вычисление массы является getter-ом некого виртуального свойства.
Расхождения со своими словами я тут не вижу Добавлено через 11 минут и 36 секунд Я же написал, что это следствие из SOLID. Если вы считаете его не верным, то и следствие для вас будет не верно.
Изходя из SOLID конструктор не попадает под это правило. Извиняюсь, что этого не указал ранее, из головы вылетело. А вообще, на всякое "А нафига?" можно сказать - да пожалуйста. Только потом сами для себя объясните, по каким правилам вы классы создаёте. Я устал уже от "выковыривания" их из головы. Как только нарушается одно из правил, создается новый уровень абстракции или выделяется класс для реализации функционала. Такой код на много(на порядок) проще поддерживать. А если суть ООП в снижении сложности поддержки и понимания кода - значит это верный путь, выделять абстракции. |
Автор: Deja_Vu 10.4.2013, 08:31 | ||
Уже давно известно, что Бритва Оккама не работает для больших систем. Кстати, как раз об этом говорили на конференции «Свободное программное обеспечение в высшей школе», проходившей в январе этого года.
Честно говоря, я сам долго противился этому. Но задайте себе вопрос, зачем вам делать getter и/или setter public, если у вас все вычисления с ними происходят в самом классе? Если это так, значит вы не верно указали их область видимости. Если же не так, то каким образом вы разделяете, какая логика должна оставаться в классе, а какая выноситься? |
Автор: baldina 10.4.2013, 09:41 | ||||||||||
если все, то конечно нет необходимости. но если не все? именно такой пример я и привел кстати, вот те же примеры на пхп
Добавлено через 2 минуты и 22 секунды вопрос-то был не в квалификаторе, а применении изнутри класса
Добавлено через 14 минут и 51 секунду
1. получение массы детали - пример большой системы? ![]() 2. он же методология, так что он не работает, а может применяться и быть или не быть полезным. впрочем, осветите нам свою точку зрения поподробнее. имхо появление любого уровня абстракции должно быть обосновано. если обосновано - Бритва Оккама не нарушается. если не обосновано, то это глупость, и размер системы тут непричем. инженерия это не философия и даже не физика. |
Автор: baldina 10.4.2013, 10:07 | ||
очень просто: в классе остается логика класса, все остальное выносится. логика класса - логика той единственной задачи, которую решает класс. возможно, вы хотели говорить не о логике класса, а о его интерфейсе. тут тоже все просто: определяем интерфейс класса, все остальное не должно торчать наружу. кстати, бывает что различные подходы не лучше и не хуже, а просто разные стилистически. что кому нравится. например, некая функция может быть функцией класса либо статической, либо свободной. каждое решение имеет плюсы и минусы. но: в любом случае такая функция является частью интерфейса класса (семантически) |
Автор: Deja_Vu 10.4.2013, 10:37 | ||||||||||||
Нет возможности рассматривать данную проблему именно в таком контексте. Нужно смотреть целиком на использование. Скорее всего будет понятно, что абстракции выбраны не верно.
Хм, так и что тут не так? Если один и тот же метод abstract и protected - он по прежнему является abstract методом. Может я не полностью выражаю свою мысль, поэтому у нас с вами проблема во взаимопонимании
Вот тут явно нарушение в принципе единой ответственности. Такой код, кстати встречается очень часто во многих проектах.
Смотрите, если ваш класс предоставляет public getter к свойству и ещё его же использует где то в своих методах - то тут явная проблема с принципом единой ответственности. Т.е. как только у вас появляется метод, который находится внутри класса, который начинает использовать этот public getter возникает вопрос, а почему он там находится, если он с полями работает через внешний интерфейс?
Уровень абстракции появляется тогда, когда текущий уровень абстракции нарушает SOLID Добавлено @ 10:44
Все что не истина - ложь. Все что не ложь - истина. Как то вообще не ясно, что вы понимаете под логикой класса. Выделение классов - вообще задача не тривиальная. Сначала я прикидываю, с какими сущностями я работаю в жизни - создаю их. Затем я создаю интерфейс классов для описание процессов между сущностями. Затем начинаю реализовывать интерфейс и плодить абстракции, которые необходимы, для того что бы SOLID не был нарушен. Пока что более формализованного принципа по написанию системы я не нашел. |
Автор: baldina 10.4.2013, 11:20 | ||||||||||
чем плох этот контекст? задача простая и типовая. как еще её решить. не нарушая ваших принципов? я вроде бы понимаю о чем вы. но, повторю, как решить такую задачу: есть общая схема обработки препроцессор-решатель-постпроцессор. конечному пользователю нужен лишь сам процесс - public function process() каждая из трех частей нужна только в процессе обработки (т.е. не public) работа каждой из частей может изменяться (в переопределенных классах) некоторые части могут иметь действие по умолчанию, которое может, при необходимости, переопределяться итого
вам такой подход не нравится. ок, тогда 1. чем он плох? (с примерами, пожалуйста) 2. как его изменить, что бы он стал хорош?
да потому что то, что сегодня является полем, завтра может оказаться нетривиально вычисляемой функцией. я хочу, если такое случится, переделывать как можно меньше и иметь меньше потенциальных проблем (если я что-то упущу). причем тут единая ответственность? здесь нет ничего концептуального, лишь удобный прием. кстати, насчет ответственности. внутри моего класса единую ответственность несет геттер, чем плохо? почему я не могу структурировать свой класс удобным мне способом, а должен родить отдельный класс для каждой мелкой фигни? ну ок, перепишите мой пример правильно, поглядим и обсудим.
слишком общее и потому совершенно пустое утверждение (имхо и неверное - OCP не относится к выделению абстракций). что именно и как именно в SOLID нарушает мой пример с получением массы? как нарушение SOLID может удовлетворять Бритве Оккама и наоборот, удовлетворение SOLID нарушать его? (приведите пример) думаю мы это одинаково понимаем. витиеватой фразой я лишь хотел намекнуть на SRP
именно. есть методология, методики нет. два разных решения могут быть одинаково хороши, выбор в таком случае - дело вкуса. Добавлено через 8 минут и 29 секунд кстати, не приходило вам в голову, что внутреннее использование геттеров - это как раз поддержание OCP? |
Автор: Fortop 10.4.2013, 13:30 | ||
бэктрейсы java видели? ![]() Скрин выше, его точно на порядок проще поддерживать? ![]() |
Автор: Deja_Vu 10.4.2013, 13:54 | ||||||||||||||||
Браузер упал, все что писал - пропало. Пипец желания нет повторяться. Но осилю спустя время.
И? Могу вам привести класс на 4000 строк, могу заявить, что backtrace там будет не меньше.
При верном выделении абстракций - проще. И даже длинный backtrace вам покажет по какому пути пошлоа логика, что бы сломаться. Добавлено через 4 минуты и 7 секунд
Перечитаю Мэйера. Но я более чем уверен, что в public нельзя использовать public методы - верен. К тому же, я поддерживаю использование getter/setter т.к. они очень полезны при рефакторинге. А вот уже нужда в рефакторинге возникает, когда вам нужно сложную функцию вставить в getter/setter. А если оставлять как есть, то это приводит к ужаснейшому ###коду - проверено. Добавлено через 8 минут и 7 секунд
Плохо, потому что мне нужно полностью просмотреть код класса, что бы понять, как связаны pre, post и run. И как же заставить Processor работать правильно.
Классы меньше. Понять логику работы проще. Легче покрыть тестами. Backtrace покажет в каком уровне абстракции возникает ошибка и исправлять нужно будет только там. Добавлено через 9 минут и 3 секунды
Тем что класс вырван из контекста. И я могу с полной уверенностью в данном случае заявить, что при данных мне начальных условиях, что банально не верно код разбит на классы. Добавлено через 10 минут и 51 секунду
Всё нужно решать в общем виде. Частности лгут и не приводят к хорошему результату. А вообще в SOLID я жирным выделил те компоненты, о которых я говорю, а не обо всем принципе ![]()
Меня ввел в ступор данный вывод. Наверное мы друг друга не поняли. |
Автор: Deja_Vu 10.4.2013, 14:11 | ||
Я бы сказал так, есть множество методов N не удовлетворяет методологии SOLID -)) Я нашел для себя один метод который не входит в множество N и ещё ни разу ни кем не видел предложенного другого метода. Кстати, поэтому я и люблю все решать в общем виде, что бы мой/чужой практический опыт не подсказывал решения, которое в частном случае оказалось удачным. Но лишь в частном случае и, более чем вероятно, окажется не верным в другом. |
Автор: baldina 10.4.2013, 14:28 | ||||||
но почему? если это просто вера - дело ваше, до религии мне дела нет. или приведите обоснования (что врядли, т.к. есть опровергающие примеры - см. выше)
вы удивитесь, но если есть getter и вы его используете повсюду, то весь рефакторинг будет заключаться в написании нового тела getter'a кстати, я не настаиваю, но есть мнение, что рефакторинг - это устранение бардака. так может его не создавать?
почти поддерживаю. дело не в длине backtrace. но и не только (и не столько) в верном выделении абстракций, а в правильной декомпозиции (в которой абстракция типа - лишь один кирпичик). поскольку backtrace слепок выполнения, наибольшее значение имхо имеет функциональная декомпозиция но и Fortop поддерживаю: мельчить не надо. и вообще не надо фанатизма ![]() ![]() ну вы там поаккуратней, так и важное потерять можно. возьмите хороший браузер, не падающий: ie, mozilla, chrome. |
Автор: krundetz 10.4.2013, 17:03 |
не получиться, если система разрабатывается долгое время и в количестве людей больше чем 1. Можно попытаться свести его к минимуму, при условие что архитектор всей системы не менялся с самого начала разработки и у него достаточно опыта. Для себя я выделяю несколько этапов рефакторинга: 1. на этапе проектирования 2. после первой реализации 3. после длительного практического использования Причем только 2 пункт обязательный при любом уровне задачи. |
Автор: baldina 10.4.2013, 18:12 | ||||||
в вашем случае код класса смотреть не надо? что-то я не вижу в этом смысле отличий. кстати, что бы понять логику работы класса, изучают документацию и интерфейс. в документации, естественно, будет описана схема pre->run->post. то, что вы говорите, конечно, имеет место - и понятность, и тесты, и отладка. но выбор правильной степени детализации зависит от задачи, требует вкуса и меры. для данного класса из 5 строк деление это чересчур, не находите? допустим. я не против, что тут можно выделить еще один уровень абстракции. можно - но зачем? в ином примере - возможно, но в данном маленьком случае имхо это ни к чему. и результат-то ваш от моего ничем не отличается... ну кроме
получается, вы мне навязываете некие формальные правила нормализации. в результате мой код становится более пухлым, реальной декомпозиции не происходит, реальных дивидендов от этого я не получу. (сравните с нормализацией БД: НФБК, 5НФ, 6НФ, умышленная денормализация). итого: то что вы проповедуете - форма, прием, но не закон.
допустим. и все же, переделывание тела одной функции, это не рефакторинг. а вот если изменение её тела влечет за собой рефакторинг - это означает бардак. а если система заранее проектируется с расчетом на рефакторинг в практически неизбежном случае её изменения, то я не знаю... это уже ООП головного мозга. когда женятся о разводе не думают. да, такое случается. но если заранее собираешься разводиться - не женись. Deja_Vu, я не против всех этих принципов, я против ортодоксального их использования, я за понимание причин и следствий вместо слепого следования авторитетам. |
Автор: krundetz 11.4.2013, 16:48 | ||
![]()
Дело в том что на проектирование тоже выделяется конечный срок и кроме этого его качество будет зависеть еще от: 1. Полноты полученных данных по решаемой проблематике. 2. Качества проработки ТЗ. 3. Опытности проектировщика. Отсюда вытекает, что проект не может быть идеальным, а следовательно необходимо получить как можно раньше полноценный прототип, чтобы иметь обратную связь. И уже его можно рефакторить, в соответствие с этой обратной связью. |
Автор: baldina 11.4.2013, 20:21 | ||
видимо мы по-разному понимаем рефакторинг. если ТЗ уточняется, то учет новых требований я считаю процессом внесения изменений с целью изменения поведения и внешнего вида
чувствуете разницу? к тому же я сильно сомневаюсь, что неопытный проектировщик сможет после первой итерации значительно улучшить свой проект |
Автор: Fortop 12.4.2013, 03:38 | ||
Обычно как раз уточнения ТЗ и попытки реализовать их в коде вызывают рефакторинг. Т.е. вобщем-то это разные вещи, но рефакторить без необходимости исключительно ради любви к искусству.... я бы не стал. |
Автор: krundetz 12.4.2013, 11:01 | ||||
для этого существует куратор с большим опытом.
да нет, с приведенным вами определением я полностью согласен, просто не бывает крайних ситуаций, все переплетено намного сильнее чем кажется. |
Автор: baldina 12.4.2013, 11:46 |
![]() |