[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Поясните. Абстрактные классы и метода
m4a1fox
Всем доброго утра. Наверно тема ни раз поднималась но все же спрошу.
Цитата
Абстрактными следует считать классы, кот. не существуют в реальности и объекты кот. не понадобяться.

Вопрос! Так зачем вообще нужны абстрактыне классы и методы, если они не появяться и не понадобяться?



Спустя 19 минут, 52 секунды (14.09.2011 - 10:02) crash написал(а):
Абстрактный класс определяется только для того, чтобы его наследовали. Но не для создания объектов.

Спустя 9 минут, 9 секунд (14.09.2011 - 10:11) m4a1fox написал(а):
Хорошо! Допустим! Тогда, что можно прописать в абстрактном класе, что бы его унаследовал другой не абстрактный класс? Можно пример?

Спустя 14 минут, 21 секунда (14.09.2011 - 10:25) vital написал(а):
Ну.. когда пишешь какой-то прототип для чего-то.
И в нем есть части, функионал которых ты пишешь в прототипе - один для всех.
А есть части - функционал который уже будет описан конкретно в наследнике. И что бы быть уверенным, что наследник сделает этот функционал - объявление функции делают абстрактным.

Более живой пример. Паттерн МВЦ.

Контроллер. Как правило, каждый контроллер отвечает за отдельную часть сайта. А каждый экшн котроллера - за отдельную страницу сайта.

Но у всех контроллеров есть общие функции, в духе - отобразить страницу, проверить залогинен ли пользователь.
И у каждого контроллера - должна быть хотя бы 1 страница, которую он показывает(иначе зачем он?).

Ну и вот общие ф-и выносятся в базовый абстрактный класс, и делается нечто в духе abstract public function index(){}

Ну вот так.. к примеру.

Спустя 31 секунда (14.09.2011 - 10:26) vital написал(а):
Цитата
что бы его унаследовал другой не абстрактный класс?

что угодно. как в любом другом классе.

Спустя 22 секунды (14.09.2011 - 10:26) EvilDev написал(а):
А зачем вообещ нужно наследование?)
Например у нас есть две машины - классы
Они наследуются от абстрактного в котором определен газ, тормоз, влево, вправо и т.д. В а дочерних внешний вид и пр

Спустя 3 минуты (14.09.2011 - 10:29) m4a1fox написал(а):
Да, получается так. Но! Класс кот. наследует абстрактные методы, должен унаследовать их все!

Спустя 2 минуты, 25 секунд (14.09.2011 - 10:32) twin написал(а):

Спустя 1 минута, 24 секунды (14.09.2011 - 10:33) m4a1fox написал(а):
EvilDev
Ну, это здорово конечно... Я не могу понять практического применения...

Спустя 14 секунд (14.09.2011 - 10:33) vital написал(а):
Цитата (m4a1fox @ 14.09.2011 - 07:29)
Да, получается так. Но! Класс кот. наследует абстрактные методы, должен унаследовать их все!

да. и?

Спустя 1 минута, 37 секунд (14.09.2011 - 10:35) vital написал(а):
Цитата (m4a1fox @ 14.09.2011 - 07:33)
EvilDev
Ну, это здорово конечно... Я не могу понять практического применения...

Придет с опытом. Так же, как и понимание паттернов.

Спустя 3 минуты, 28 секунд (14.09.2011 - 10:38) m4a1fox написал(а):
vital
Эка.. как не интересно sad.gif

Спустя 2 минуты, 30 секунд (14.09.2011 - 10:41) vital написал(а):
Цитата (m4a1fox @ 14.09.2011 - 07:38)
vital
Эка.. как не интересно sad.gif

Это ты еще не читал про всякие декораторы с обсерверами.

Программирование вообще скучаня штука.

Спустя 9 минут, 8 секунд (14.09.2011 - 10:50) m4a1fox написал(а):
vital
Цитата
Программирование вообще скучаня штука.

Да я не про то! Не интересно, потому что хочется знать все и сразу! Но так не бывает! Ладно! Спасибо что попытались разъяснить!?

Спустя 34 минуты, 2 секунды (14.09.2011 - 11:24) ApuktaChehov написал(а):
Прелесть абстрактных и методов в том, что их можно переопределять из наследника.

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

Предположим есть некий сайт. У сайта есть главная страница, и для ее отображения не нужно никаких параметров передавать скриптам. Т.е. эта страница запускается как бы по умолчанию. И вот тут как раз и весь смак.

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

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

модуль1 модуль2 модуль3
| | |
| | |
| | |
__|_______________|_____________|____
index()
_____________________________________
|
|
|
__________________|__________________
Браузер

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

Фуф, это очень сложно объяснить вот так, это надо показывать на примере.

Спустя 34 минуты, 39 секунд (14.09.2011 - 11:59) m4a1fox написал(а):
ApuktaChehov
Ну в принципе, грубо если представить то я понял! Попробую написать что я понял!
Представим что у нас есть 5 автомобилей.
  • - BMW::платформа #2
  • - Audi::платформа #6
  • - Mazda::платформа #4
  • - Bently::платформа #8
  • - Nissan::платформа #7
Есть один гараж. Гараж устроен таким образом. Один въезд, только для одного авто. А после, некая платформа автоматически передвигает авто на кот. мы заехали в гараж. То есть получается следующее, если мы заехали на NIssan'e то, автоплатформа передвинет сама, авто на 7 платформу....

Получается, что гараж и платформа в этой аналогии - abstruct?

Спустя 18 минут, 40 секунд (14.09.2011 - 12:17) ApuktaChehov написал(а):
Платформа не абстрактна, это конкретный метод, со своим функционалом. А вот гараж, да.

Спустя 6 минут, 49 секунд (14.09.2011 - 12:24) m4a1fox написал(а):
ApuktaChehov
Вот! Это хорошее уточнение... Значит - гараж (некая абстракция). Пользы нет, но в нем есть платформа, без. кот. авто на место не переместить... правильно понимаю (просто мне легче на аналогиях smile.gif )

Спустя 12 минут, 11 секунд (14.09.2011 - 12:36) Игорь_Vasinsky написал(а):
ну видимо правильно.


m4a1fox
эх завидую я тебе, на моих глазах же начал рыться в ООП, где-то месяца 4, ечли не ошибаюсь.

И уже так шаришь... а я тока взгляну.... и муражки от ужаса, стока раз начинал изучать - бросал... sad.gif

молодец.

Спустя 17 минут, 19 секунд (14.09.2011 - 12:54) alex12060 написал(а):
m4a1fox

Мне понравилось объяснение linker'a, почитай тут:

http://phpforum.ru/index.php?showtopic=49714&hl=

Спустя 11 минут, 31 секунда (14.09.2011 - 13:05) ApuktaChehov написал(а):
Платформа, это контроллер. Она решает что будет в гараже. А гараж принимает любую форму, т.е. любое авто, которое ему задаст платформа, т.е. контроллер.

Спустя 14 минут, 36 секунд (14.09.2011 - 13:20) Guest написал(а):

Спустя 44 минуты, 14 секунд (14.09.2011 - 14:04) m4a1fox написал(а):
Спасибо Игорь_Vasinsky! Ну дык чего на месте то топтаться... smile.gif Кстати, начал лазить в oop с 1 июня текущего года. Так что прав оказался.

ApuktaChehov
Цитата
А гараж принимает любую форму, т.е. любое авто, которое ему задаст платформа, т.е. контроллер.

да, тут я видимо ошибся в значениях. Абстрация это не гараж, в аналогии, абстракция - это въезд в гараж! Так?

Спустя 50 минут, 41 секунда (14.09.2011 - 14:55) ApuktaChehov написал(а):
Вы с вашими аналогиями меня совсем запутали. Гараж есть, он один и принимает любое авто.

Спустя 3 минуты, 14 секунд (14.09.2011 - 14:58) ApuktaChehov написал(а):
Вообщем говоря, абстракция это когда объект, принимает любую форму и содержание, которую ему задаст другой объект. Ваш гараж примет любое авто.

Но если быть точнее, я бы описал так. У вас есть объект, которое имеет свойство превращаться в любой автомобиль по вашему желанию. И этот объект абстрактен, потому как может принять форму и наполнение чего-угодно по вашему заданию.

Спустя 19 минут, 25 секунд (14.09.2011 - 15:17) m4a1fox написал(а):
ApuktaChehov
Цитата
Вы с вашими аналогиями меня совсем запутали. Гараж есть, он один и принимает любое авто.

да чего то сам запутался немножко! Но вроже суть уловил! Спасибо за аналогии smile.gif

Спустя 4 минуты, 49 секунд (14.09.2011 - 15:22) m4a1fox написал(а):
Но тогда получается что этот объект (кот. умеет превращаться в любой авто), должен обладать множеством свойт авот. Например если это камаз то в абстракции должен быть прицеп, а если это легковушка - то прицеп не нужен тогда.... как тут быть? Принамать параметр прицепа, но ничего в нем не прописывать, т. е. оставлять пустым?

Спустя 56 минут, 2 секунды (14.09.2011 - 16:18) Winston написал(а):
Сейчас, я что-то напишу... smile.gif
Есть абстрактный класс автомобили. У него вынесем абстрактные методы, то есть методы которые должны будут быть переопределены в наследнииках.
В этот класс автомобили можно вынести абстр. методы, это:
- колеса
- руль
- двери
- сидения
- бензобак
и т.д.
Это будут обязательные свойства для каждого автомобиля...
И классы (автомобиль) которые будут наследоваться, от базового класса, должны будут обязательно переопределить (перегрузить) эти методы (свойства автомобиля), то есть создать свое подобие руля, колес и т.д.
Еще в базовом классе можно создать один общий статический метод для определения скорости, то есть он будет в классе автомобиль вызываться и в его будут передаваться какие-то данные, после чего в этом методе будут по формулах или еще что, вычисляться скорость автомобиля....
Ну вот как-то так... smile.gif

Спустя 4 минуты, 5 секунд (14.09.2011 - 16:22) caballero написал(а):
Цитата
Прелесть абстрактных и методов в том, что их можно переопределять из наследника.

Абстрактные методы НЕОБХОДИМО переопределить иначе компилятор не пропустит

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

Пример:
классы геометрических фигур могут иметь например метод установки цвета и онг может быть вынесен в базовый классю, но метод отрисовывающий фигуру будет у каждой свой
следловательно можно создать базовый абстрактный клас с методом setcolor и абстрактным метоlом draw()




Спустя 14 минут, 3 секунды (14.09.2011 - 16:36) m4a1fox написал(а):
Ага! Так собственно тогда. Как сказал Winston
Цитата
И классы (автомобиль) которые будут наследоваться, от базового класса, должны будут обязательно переопределить (перегрузить) эти методы (свойства автомобиля), то есть создать свое подобие руля, колес и т.д.

Тогда зачем нам создавать абстрактный метод общий, если мы все равно его переопределяем (по сути пишем заново) в наследниках. Я вот чего не могу понять. Зачем создавать, если придется перезаписать его?[quote]

Спустя 5 минут, 9 секунд (14.09.2011 - 16:41) ApuktaChehov написал(а):
m4a1fox - это полезно, когда вы не влияете на вызов этого метода.

Т.е. в недрах системы он вызывается автоматом, независимо от вас.

Спустя 44 секунды (14.09.2011 - 16:42) Winston написал(а):
В абстрактном классе мы пишем просто:
abstract protected function wheels();    // Колеса
abstract protected function st_wheel(); // Руль

И т.д.
А вот в наследниках мы уже пишем реализацию этих методов
protected function wheels()
{
// куча кода
}

Абстрактный класс служит, как бы надзиратель над детьми, чтобы все они (наследники) выполнили то что он сказал (то есть реализовали все методы)....

Спустя 1 минута, 23 секунды (14.09.2011 - 16:44) m4a1fox написал(а):
ApuktaChehov
Ага! Значит, его не нужно каждый раз объявлять. Один раз - и он работает для всех. Хоть одинг раз, хоть 20 раз. Т.е. не нужно его каждый раз вызывать если я хочу совершить какое либо действие над объектом?

$root = new Class();
Ну вызывать имеется ввиду $root->метод

Спустя 1 минута, 31 секунда (14.09.2011 - 16:45) caballero написал(а):
Цитата
Тогда зачем нам создавать абстрактный метод общий, если мы все равно его переопределяем (по сути пишем заново) в наследниках.


Ты как чукча - писатель но не читатель
Переопределяются ЧАСТЬ методов а часть остаются с базового класса что бы плодить одиноковый код

Спустя 1 минута, 16 секунд (14.09.2011 - 16:46) m4a1fox написал(а):
caballero
Вот чего оскорблять. Не хотите отвечать.... не нужно.

Спустя 32 секунды (14.09.2011 - 16:47) caballero написал(а):
Цитата
то что он сказал (то есть реализовали все методы

Не все а только абстрактные
пойди в педивикию и посмотри чем клас отличается от интерфейса

Спустя 1 минута, 8 секунд (14.09.2011 - 16:48) caballero написал(а):
Цитата
Не хотите отвечать.... не нужно.

я ответил и вполне понятно - оскорбление не читать что тебе пишут
хочешь чтобы помогли потрудись почитать ответ

Хотя есть подозрение что тебе надо начать ч того что авообще такое наследование классов

Спустя 57 секунд (14.09.2011 - 16:49) Winston написал(а):
Цитата (m4a1fox @ 14.09.2011 - 16:44)
Значит, его не нужно каждый раз объявлять

Его не надо объявлять... Его просто наследуют

include 'Cars.php';
class Car extends Cars
{
protected function wheels() // переопределяем/реализуем обязательный метод, который в родительском классе является абстрактным
{
// куча кода
}

private functions properies() // Собственный метод класса Car в котором характеристики хранятся
{
return parent :: Speed($x, $y); // Обращаемся к родительскому классу не создавая объект
// return Cars :: Speeds($x, $y); // Еще один способ как добраться до абстрактного класса

}
}


Если вне класса ты хочешь обратиться к какому-то методу абстр. класса, то пишешь
Имя_класса :: метод
И не надо создавать никаких объектов...

Спустя 1 минута, 36 секунд (14.09.2011 - 16:51) caballero написал(а):
Цитата
Если вне класса ты хочешь обратиться к какому-то методу абстр. класса, то пишешь
Имя_класса :: метод


это статическое обращение при чем тут абстрактный или нет

Спустя 1 минута, 35 секунд (14.09.2011 - 16:52) ApuktaChehov написал(а):
m4a1fox - я уже не знаю как объяснить.

Есть программа, выполняя какие-то действия, она требует что бы вы внесли в нее свои данные. Как обычная функция в php. Метод, который используется в классе, требует, что ВЫ его переопределил, т.к. он используется в работе. Это ваше переопределение, как бы внесения вашей информации в программу, класс.

После этого, класс начинает обрабатывать ваш код.

Вы должны понять. ВЫ НЕ ЗНАЕТЕ где используется ваш код, и как он используется, вы не влияете на вызов этого метода, вы можете только переопределить его, задав ему новое наполнение.

Спустя 24 секунды (14.09.2011 - 16:52) Winston написал(а):
Цитата (caballero @ 14.09.2011 - 16:51)
это статическое обращение при чем тут абстрактный или нет

Абстрактный кл. не позволяет создавать объект, потому используется статическое обращение..

Спустя 1 минута, 44 секунды (14.09.2011 - 16:54) m4a1fox написал(а):
Таксь..... ну походу начинаю догонять немножко. И да caballero я вижу вы шарите в этом деле. ПРофессионально или любитель ?

И еще... как вам книжка М. Кузнецов и И. Семдяно "ООП на РНР"?

Спустя 1 минута, 15 секунд (14.09.2011 - 16:55) Winston написал(а):
m4a1fox
Сначала Мэтт Зандстра

Спустя 30 секунд (14.09.2011 - 16:56) caballero написал(а):
Цитата
Ну до этого он сам дойдет...

никуда он не дойдет если к каше в голове добавить еще каши
человеку нужно взять учебник и разобратся что такое клас - не слово class в PHP а что это вообще такое
затем что такое наследование и зачем оно
а потом уже специфика - статитка, абстракция, интерфейсы

Спустя 1 минута, 22 секунды (14.09.2011 - 16:57) ApuktaChehov написал(а):
caballero - золотые слова wink.gif

Спустя 5 секунд (14.09.2011 - 16:57) m4a1fox написал(а):
caballero
Вот не поверите. Именно в такой последовательности сейчас и делаю. smile.gif

Спустя 12 секунд (14.09.2011 - 16:58) caballero написал(а):
Цитата
И да caballero я вижу вы шарите в этом деле. ПРофессионально или любитель ?

многолетний опыт программирования и работы в IT конторах

Спустя 44 секунды (14.09.2011 - 16:58) ApuktaChehov написал(а):
Еще бы вам, не только читать, но и делать. Практика незаменима!

Спустя 1 минута, 36 секунд (14.09.2011 - 17:00) caballero написал(а):
Цитата
Именно в такой последовательности сейчас и делаю.

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

Спустя 4 минуты, 57 секунд (14.09.2011 - 17:05) m4a1fox написал(а):
ApuktaChehov
Согласен! Дело в том, что сейчас заканчиваю один маленький сайт. Но сделал его на классах. Только на статических. Вот... попробовал перевести весь процесс на mvc но столкнулся с некот. трудностями. А именно с тем, как отделить логику от представления. Сделал как показано на ирбисе, но! Получился сайт, состоящий из классов а mvc структура похожа на процедурное. То есть смешал коней с людьми! Собственно вопрос о абстракции он так сказать - назревал и вот назрел. Но мне важно понять логику. Именно логику процессов. Так как я когда то понимал процедуры. Понял. Смог в голове логику разложить. Так же как за пару месяцев разобрался с статикой на ооп. Опять же. Разложил в голове логику и уже проще.. Теперь пришло время абстракции. Дальше интерфейс и много еще чего интересного! Тем более что есть еще как минимум __get и __set - еще для меня так же темная лошадка. И заметьте - я сейчас говорю про нулевой уроверь понимия ооп.

Спустя 5 минут, 28 секунд (14.09.2011 - 17:10) caballero написал(а):
Цитата
на статических.

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

Цитата
Вот... попробовал перевести весь процесс на mvc но столкнулся с некот. трудностями. А именно с тем, как отделить логику от представления.

MVC (предполагаю речь идет о паттерне а-ля Zend) это отдельная песня и не единственных способ отделить логику от представления

Почему бы вам просто не вынести логику в классы (пусть даже статические если нет явной необходимости инкапсуляции)
И вызывать методы классов для получания выходных данных
получите то же самое отделение логики


Спустя 2 минуты, 50 секунд (14.09.2011 - 17:13) m4a1fox написал(а):
caballero
Цитата
Почему бы вам просто не вынести логику в клдассы (пусть даже статические если нет явной необходимости инкапсуляции)
И вызывать методы классов для получания выходных данных
получите то же самое отделение логики

Дык я так и сделал! Отдельно классы - отдельно вид. И файл кот включает в себя первый и второй файлы по необходимости.

controller.php - вызываются в нем методы.
view.tpl - вид и представление

и show.php

объединяет все в себя

P.S. на название файлов внимание не обращать smile.gif

Спустя 6 минут, 52 секунды (14.09.2011 - 17:20) caballero написал(а):
Цитата
Дык я так и сделал! Отдельно классы - отдельно вид. И файл кот включает в себя первый и второй файлы по необходимости.


Я имел ввиду без всяких умняков - вид контроллер и все такое


просто файл с неким классом к примеру users.php где функции работы с юзерами с БД и пр

и просто в старом добром стиле userlist.php с разметкой
куда либо инклудом users.php либо подключить через autoload (так грамотнее)
это такое же разделение логики

MVC если смысл изучать если придется писать в каком то фреймворке
зачем самому придумывать эту конструкцию? само по себбе это работать не будет нуже как минимум диспетчер или роутер который будет решать какой контроллер дергать и все такое
в готовых фреймворках это есть - только пшете контроллеры
по образу и подобию

Спустя 4 минуты, 54 секунды (14.09.2011 - 17:25) m4a1fox написал(а):
caballero
Цитата
просто файл с неким классом к примеру users.php где функции работы с юзерами с БД и пр

Точно так! работа с тектом из БД - класс для него. в классе методы.... и так далее.

Спустя 11 минут, 2 секунды (14.09.2011 - 17:36) caballero написал(а):
тогда в чем проблемма

Спустя 24 минуты, 19 секунд (14.09.2011 - 18:00) m4a1fox написал(а):
Не в чем! Просто про сайт к слову пришлось! Вообще я абстракцией интересовался!

Спустя 15 минут, 57 секунд (14.09.2011 - 18:16) caballero написал(а):
Цитата
Вообще я абстракцией интересовался!

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

Спустя 44 минуты, 58 секунд (14.09.2011 - 19:01) Greg1978 написал(а):
Цитата (caballero @ 14.09.2011 - 15:16)

Цитата
И да caballero я вижу вы шарите в этом деле. ПРофессионально или любитель ?
многолетний опыт программирования и работы в IT конторах

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

Мда уважаемый, этим постом всё сказано, какое звено Вы представляете в IT организациях.
До выделения абстракций для классов, требуется, от нас архитекторов, довольно большой объём "философской" работы по выделению и классификации абстракций и их интерфейсов из предметной области, чем занимается аналитика.

Спустя 26 минут, 43 секунды (14.09.2011 - 19:28) caballero написал(а):
Цитата
Мда уважаемый, этим постом всё сказано, какое звено Вы представляете в IT организациях.



ничего не сказано - просто программер с опытом работы больше чем ты на свете живешь

Цитата
До выделения абстракций для классов, требуется, от нас архитекторов, довольно большой объём "философской" работы по выделению и классификации абстракций и их интерфейсов.

Наукоподобный набор слов из учебника PHP для домохозяек.

Спустя 16 минут, 59 секунд (14.09.2011 - 19:45) Greg1978 написал(а):
Цитата (caballero @ 14.09.2011 - 16:28)
Цитата
Мда уважаемый, этим постом всё сказано, какое звено Вы представляете в IT организациях.



ничего не сказано - просто программер с опытом работы больше чем ты на свете живешь

Цитата
До выделения абстракций для классов, требуется, от нас архитекторов, довольно большой объём "философской" работы по выделению и классификации абстракций и их интерфейсов.

Наукоподобный набор слов из учебника PHP для домохозяек.

C Вами всё понятно biggrin.gif
Дальнейшая дискуссия, переходящая на личности, для меня теряет всякий интерес.
Желаю Вам потешаться над своим опытом и далее. Удачи! smile.gif

Спустя 21 минута, 40 секунд (14.09.2011 - 20:07) ApuktaChehov написал(а):
blink.gif

Спустя 1 час, 12 минут, 11 секунд (14.09.2011 - 21:19) m4a1fox написал(а):
Ну вы блин даете.

Спустя 59 минут, 17 секунд (14.09.2011 - 22:18) Greg1978 написал(а):
Цитата
До выделения абстракций для классов, требуется, от нас архитекторов, довольно большой объём "философской" работы по выделению и классификации абстракций и их интерфейсов из предметной области, чем занимается аналитика.

Наукоподобный набор слов из учебника PHP для домохозяек.


В чём мы даём? Человек, не сомневаюсь много работал программистом, и знает своё дело со своей стороны. Только если не знает как лучше выявить абстракции и естественно выделять интерфейсы (может он из своего опыта и применяет это подсознательно) не следует переносить лже клеймо на другие подходы, которые куда "древнее" и зарекомендовавшие себя, чем его опыт, которым он так хвалится. :)

Абстрактные классы - это классы выявленные в результате анализа требований и предметной области, в которой требуется создать "систему" с определённой архитектурой. Эти классы сродни интерфейсам interface и отличаются только тем что в них можно не только свойства и методы декларировать но и задавать реализацию, которая общая для всех дочерних классов (соответственно дочерние классы их могут перегружать). Чем отличается декларированный метод от уже реализованного, только тем что он "говорит" всем "дочерям" что они обязаны его реализовать в себе, то есть определить какой то алгоритм и описывает сигнатуру (имя метода, количество параметров, типы параметров и т.д.) в формате abstract function name(...). Кстати, да, это называется объявление интерфейсов (если конечно методы открыты).
Что ещё даёт абстрактный класс. В проектировании архитектуры и особенно в паттернах проектирования нацеленных на интерфейсы используют типы. Так вот абстрактный класс задаёт тип иерархии допустим продуктов но сам запрещает "инстанцировать себя" а только создаёт заготовку будущих классов (объектов) с определённой группой интерфейсов (открытые методы для пользования "себя" "клиентом" ).
Пример:
Имеем абстрактный продукт (класс) AbstractProduct допустим после рассмотра требований и предметной области магазина (ведь там много разнообразных продуктов)
, который реализует в себе интерфейс addProduct и декларирует интерфейс deleteProduct и этим обязывает последующие классы - объекты реализовать этот интерфейс - метод.
Конкретный продукт ConcreteProduct соответственно его реализовывает.
Фактически любой из этих классов будет не конкретным продуктом!!! (вот здесь философия, как сказал коллега, для домохозяек а контейнером - композицией, которая содержит другие продукты (агрегация), и эта композиция является ни чем иным как абстракцией и являет собой часть паттерна Composition). В паттерне Bridge допустим все "клиенты" работают с конкретными продуктами только через такую абстракцию.
<?php
abstract class AbstractProduct

{
protected $id = null;

protected $stack = array();

public function addProduct(Product $product)
{
array_push($stack, $name);
}

abstract public function deleteProduct(Product $product);
}

class ConcreteProduct extends AbstractProduct
{
public function deleteProduct($name)
{
// Алгоритм удаления продукта из стека
}
}

?>


Я наверное увлёкся философией :) ближе к телу. Нам нужно теперь при построении архитектуры что бы клиент работал только с абстракцией, то есть типом.
<?php
$composition = new ConcreteProduct();
// Если объект не является типом AbstractProduct значит возможен в дальнейшем сбой
// потому что только этот тип может обеспечить то, что есть интерфейс addProduct

if(!($composition instanceof AbstractProduct))
{
throw new SystemException('Системная ошибка не правильное определение класса');
}
$composition->addProduct(new Product());
?>


Вот как то так :) и философия, и техническая часть, и реализация :)
Можно ещё посмотреть паттерн абстрактная фабрика там хорошо видно использование клиентом типа.

Спустя 14 минут, 48 секунд (14.09.2011 - 22:33) Winston написал(а):
Эх... жаль карма не пашет sad.gif

Спустя 23 минуты, 12 секунд (14.09.2011 - 22:56) bodja написал(а):
m4a1fox
Цитата
Получился сайт, состоящий из классов а mvc структура похожа на процедурное. То есть смешал коней с людьми!


процедурный -> функциональный -> модульный -> ооп

мне кажется вы перепрыгнули как миниум через один пункт smile.gif
ну а тем более смешивание разных принципов программирования естественно никуда не годиться. biggrin.gif

Цитата
А именно с тем, как отделить логику от представления.

Перечитайте еще раз пост от EvilDev на первой странице (жаль что здесь нет нумерации постов.) ,я думаю чувак с гитарой тему говорит. biggrin.gif

ЗЫ Тут конечно много чего могут умного наговорить,но пока вы на своей шкуре не испытаете
необходимоть в этих фичах - толку будет мало.
А писать только потому что так модно- ну незнаю... это на любителя гемора. wink.gif

Спустя 11 минут, 58 секунд (14.09.2011 - 23:08) caballero написал(а):
Цитата
Абстрактные классы - это классы выявленные в результате анализа требований и предметной области,


Да ну! А обычные классы не результат анализа? Зачем тупо цитировать лекции преподавателей не написавших в жизни строки кода а тупо зазубрившие паттерны проектирования.

Любой класс понятие абстрактное и не только в программировании.

abstract в программировании - просто ключевое слово не имеющее никакого прикладного смысла. С таким же успехом вместо abstract class разработчик языка мог употребить fucking class - компилятору было бы пофиг.

То есть - абстрактый клас это конструкция языка программирования, Ни больше и не меньше. И нечего тут мозги пудрить.

Цитата
В проектировании архитектуры и особенно в паттернах проектирования нацеленных на интерфейсы используют типы.


Их везде используют. А если язык не скриптовый а типизированный то по другому никак. Зачем писать бессмысленный набор слов.

Цитата
Я наверное увлёкся философией :) ближе к телу


Лучше бы программированием - было бы ближе к тематике форума.


Цитата
только с абстракцией, то есть типом

А что, неабстрактный класс - не есть тип?

Цитата
Можно ещё посмотреть паттерн абстрактная фабрика там хорошо видно использование клиентом типа.


Каким клиентом?

Паттерны проектирования - просто мода. Это уже неоднократно проходили, была мода на UML - все пытались проектировать на UML с нулевым результатом разумеется, потом была мода на XML - "за XML будущее - все будет на XML" Ага - теперь глядишь там вместо XML JSON сям вместо SOAP сервисов RESTful. Потом мода на AJAX и т.д.

Перестаньте копипастить учебники и попробуйте сами хоть один проект написать. Увидите разницу между теорией и реальностью. Новичкам надо помогать чтобы перестали писать "китайский" (или по другому -"спагетти") код. А не учить их "индийскому" коду где на каждый чих создаются куча интерфейсов и абстрактных фабрик которые потом невозможно отладить даже самому горе-архитектору.










Спустя 1 минута, 40 секунд (14.09.2011 - 23:10) caballero написал(а):
Цитата
процедурный -> функциональный -> модульный -> ооп


Это разные парадигмы программирования никак друг к другу не относящиеся.

Спустя 7 минут, 39 секунд (14.09.2011 - 23:17) Greg1978 написал(а):
Цитата
caballeroПерестаньте копипастить учебники и попробуйте сами хоть один проект написать. Увидите разницу между теорией и реальностью. Новичкам надо помогать чтобы перестали писать "китайский" (или по другому -"спагетти") код. А не учить их "индийскому" коду где на каждый чих создаются куча интерфейсов и абстрактных фабрик которые потом невозможно отладить даже самому горе-архитектору.

Сожалею о Вашей неграмотности (сразу задаюсь вопросом, точно ли конторы IT).
Статья моя и потрудился над ней я без применения учебников "на прямую". Ну в принципе это всё. Ах да, если Вы UML не применяете это не означает что его нет. Он очень активно у нас в проекте применяется, теперь всё smile.gif Оривидерчи caballero

bodja
Цитата
А писать только потому что так модно- ну незнаю... это на любителя гемора.

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

Спустя 5 минут, 17 секунд (14.09.2011 - 23:23) caballero написал(а):
Цитата
Ах да, если Вы UML не применяете это не означает что его нет

Я не писал что его нет. Я писал что мода на него слава Б-гу прошла.
Удивительно неудобная для описания архитектуры нотация.


Цитата
Сожалею о Вашей неграмотности (сразу задаюсь вопросом, точно ли конторы IT).

Что конкретно неграмотно? Кроме бла-бла-бла что нибудь можешь сказать?

Цитата
Статья моя и потрудился над ней я без применения учебников "на прямую".

Не знал что общаюсь с автором паттернов проектирования

Спустя 21 минута, 2 секунды (14.09.2011 - 23:44) bodja написал(а):

Цитата
Это разные  парадигмы  программирования никак   друг  к  другу  не  относящиеся.

Ну так яж не спорю,просто обозначил некую эволюцию в смене понятий. wink.gif

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

Не,ну архитектура конечно нужна,по большому счету она есть базовой,и все от нее отталкивается,весь вопрос как ее грамотно продумать,в противном случае нивелируется практически вся работа.
Короче,что тут сказать? Все это философско-религиозный вопрос... над бытием кода biggrin.gif

Спустя 7 минут, 34 секунды (14.09.2011 - 23:51) caballero написал(а):
Цитата
просто обозначил некую эволюцию в смене понятий


Это не эволюция - парадигмы существуют и развиваются параллельно.
Например в связи с появлением многоядерных систем возник опять интерес к функциональным языкам.

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


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


Спустя 16 минут, 32 секунды (15.09.2011 - 00:08) Guest написал(а):
Цитата (caballero @ 14.09.2011 - 20:51)
Дело в том что человек задал конкретный вопрос о конкретной структуре синтаксиса в языке программирования. Философия и очевидные вещи о необходимости сначала думать потом кодировать несколько не к месту.

Может я не понял, а где здесь вопрос про синтаксис blink.gif у автора темы

Цитата
Всем доброго утра. Наверно тема ни раз поднималась но все же спрошу.
Цитата
Абстрактными следует считать классы, кот. не существуют в реальности и объекты кот. не понадобяться.

Вопрос! Так зачем вообще нужны абстрактыне классы и методы, если они не появяться и не понадобяться?

Спустя 17 минут, 40 секунд (15.09.2011 - 00:25) caballero написал(а):
Цитата
Может я не понял, а где здесь вопрос про синтаксис


Форум о некоем языке программирования PHP или о девочках?

Не имеет смыла обсуждение что такое абстрактный клас вне синтаксиса языка программирования предусматривающем ключевое слово abstract

Спустя 20 минут, 57 секунд (15.09.2011 - 00:46) Guest написал(а):
Цитата (caballero @ 14.09.2011 - 21:25)
Цитата
Может я не понял, а где здесь вопрос про синтаксис


Форум о некоем языке программирования PHP или о девочках?

Не имеет смыла обсуждение что такое абстрактный клас вне синтаксиса языка программирования предусматривающем ключевое слово abstract

caballero
Цитата

abstract в программировании - просто ключевое слово не имеющее никакого прикладного смысла. С таким же успехом вместо abstract class разработчик языка мог употребить fucking class - компилятору было бы пофиг.


Хоть определись.

Спустя 3 минуты, 25 секунд (15.09.2011 - 00:50) caballero написал(а):
Цитата
Хоть определись.


в чем?

в обоих случаях речь идет о классе ( элементе синтаксиса языка) описаном ключевым словом abstract

Спустя 8 минут, 58 секунд (15.09.2011 - 00:59) bodja написал(а):

Цитата
Это не  эволюция - парадигмы  существуют  и развиваются  параллельно.
Например  в  связи  с  появлением  многоядерных  систем  возник  опять  интерес  к  функциональным  языкам.


Ну начнем с того,что на ПХП можно применять разные парадигмы,сответственно и сваливать все в кучу тоже можно.
То,что нельзя или тяжело реализовать разные парадигмы на других языках,это уже отдельный вопрос и проблемы этого языка.
Еще могу предположить,что под словом парадигма ,вы имеете понимание отличное напрмер от этого
соответственно мы разговариваем про разные вещи. dry.gif

Цитата
несколько не  к  месту.

Что к месту,решать модераторам,
ответ был не вам и не ТС-у.

Спустя 9 минут, 47 секунд (15.09.2011 - 01:09) caballero написал(а):
Цитата
Еще могу предположить,что под словом парадигма ,вы имеете понимание отличное напрмер от этого

Можете но ваше предположение, по обыкновению, будет неверным.

Цитата
Ну начнем с того,что на ПХП можно применять разные парадигмы,сответственно и сваливать все в кучу тоже можно.

А кто утверждал что нельзя?
Капитан Очевидность согласен - если язык позволяет то можно не тпозволяет - нельзя


Из возможности смешать в коде разные парадигмы не следует что эти парадигмы как то друг с другом связаны


Спустя 48 минут, 7 секунд (15.09.2011 - 01:57) inpost написал(а):
caballero
А какое твоё отношение к ООП?
Ты вот сказал, что в связи с тем, что 4-х ядерные процессоры сейчас, то возвращается моде к функциональным языкам, почему это?

Спустя 18 минут, 25 секунд (15.09.2011 - 02:15) caballero написал(а):
Цитата
А какое твоё отношение к ООП?

Никакого - просто употребляю классы потому что это удобно (там где есть смысл конечно) если конечно нет каких либо требований или ограничений.
Но ООП - это не панацея. такие извстные продукты как Mysql, Apache и PHP написаны на простом С без всяких классов.

Цитата
Ты вот сказал, что в связи с тем, что 4-х ядерные процессоры сейчас, то возвращается моде к функциональным языкам, почему это?

Функциональные языки лучшем всего подходят для распараллеливания процессов. Функциональный язык (в идеале) не содержит переменных - так как все объекты - функции.
Соответственно, не нужен головняк с синхронизацией потоков а значит легко писать код. Да и компилятор разрабатывать намного проще - распараллеливание программы задача нетривиальная. А функции все равно в каком потоке выполнятся и не надо общей памяти семафоров мютексов и другого гемора
Раньше многопроцесорные системмы были дорогими теперь додумались пихать в проц несколько ядер (с точки зрения программы - это разные процесоры)

Спустя 5 часов, 43 минуты, 47 секунд (15.09.2011 - 07:59) Guest написал(а):
Цитата
Да и компилятор разрабатывать намного проще -

На функциональном то языке, угу ню ню ...

Спустя 2 часа, 25 минут, 50 секунд (15.09.2011 - 10:25) caballero написал(а):
Цитата
На функциональном то языке, угу ню ню ...

ДЛЯ функционального языка. В первую очередь для реализации распараллеливания в чем и смысл. Особенно в свете новомодных облачных вычисленний.
Вы вообще читаете что вам пишут? Или смысл выхватить фразу с контекста чтобы придраться не вникая в суть дела.

Быстрый ответ:

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