классы для новичков

Статус
В этой теме нельзя размещать новые ответы.

klax

Новичок
классы для новичков

Люди добрые. Помогите.
Подскажите, где найти литературу, доступно объясняющую что такое классы и с чем их едят.
А то я ООП не обучался, поэтому не представляю что это.
Та литература, которую я находил, ничего толком не объясняла... :((

Заранее спасибо.
 

Фанат

oncle terrible
Команда форума
Ну, скорее, наоборот - это ты толком не понимал, что литература объясняла. Это очень важная поправка для дальнейшего усвоения.
 

klax

Новичок
А все-таки ты можешь посоветовать что-нить, чтоб на пальцах было объяснено и с примерами?
 

Фанат

oncle terrible
Команда форума
объект - это упаковка действий и параметров, относящихся к одной какой-то сущности, в некий контейнер.

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

Такая штука называется инкапсуляцией. Это самая простая и понятная из составляющих ООП, легко применимая в веб. но тоже не без косяков - если на каждой странице используется только малая часть объекта, к примеру, объект user - то нафиг-нафиг такой объект, разве что из особой любви к ООП.

еще важным свойством объекта является наследование. в гуевом программировании есть отличные примеры наследования, а для веба я таких не могу придумать. в гуях стандартный пример - это окно. Базовый класс - пустое окно. оно имеет заголовок, может менять размеры и перемещаться. Окно с текстом, которое мы произведем от первого базового окна, будет иметь все его функции - нам не надо будет заново их программировать!

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

еще есть полиморфизм, но про него я не помню, пусть кто-нибудь еще хорошо напишет.
 

dimagolov

Новичок
Если я помню правильно, то у Гради Буча было все с примерами и основными понятиями. Можно сказать, что на пальцах.

-~{}~ 20.01.09 09:35:

Про полиморфизм.

Есть класс абстрактный (то есть такой, что описывает какую-то общую сущность, но не детали ее реализации), например доступ к БД. Там есть методы "подключиться к БД" и скажем "сформировать запрос", а так же "получить последний вставленный ID". И соответственно есть разные СУБД, MySQL, MSSQL, Postgres. И для каждой из них пишем наследника от абстрактного класса, в котором реализуем конкретные методы из перечисленных выше в соответствии с особенностями конкретной СУБД.

Теперь при написании приложения мы, когда надо что-то сохранить в БД обращаемся к тем методам, которые декларировались в абстрактном классе. А в настройках, когда при инсталяции будем указывать тип СУБД мы пропишем (в ОДНОМ МЕСТЕ!!) создание объекта доступа к БД того типа, который соответствует нашей СУБД. И весь остальной код не нужно переделывать - он использует "абстрактные" методы, а за счет полиморфизма вызываются "конкретные" методы нужного класса, для работы с СУБД нужного типа.
 

dimagolov

Новичок
ссылочки в гугле, к примеру на упомянутого Гради Буча.

Тебе все понятно в том, что мы написали? Теперь прочитай по второму разу то, что ты не мог понять до этого и сформулируй что еще осталось неясного.
 

boombick

boombick.org
google.com Все нужные запросы уже перечислили
в вебе очень трудно придумать даже цепочку из двух классов, нормально наследующих друг другу, не говоря уже о большем.
скорее трудно придумать нормальный абстрактный пример. В рамках работающих систем наследование нормально реализуется, но для понимания надо понимать, как работает система :)
 

IIIEPJIOK

Новичок
Вот тут, на мой взгляд достаточно неплохо написано о ООП в контексте ПХП

ЗЫ. Отдам эту книгу в печатном виде, самовывоз ....А то выкинуть рука не поднимается.
 

x-yuri

Новичок
погугли, я не знаю хороших ссылок для начинающих на русском. Или спрашивай, что непонятно

на англ - http://rapidshare.com/files/111521128/Design_Patterns_Explained_-_A_New_Perspective_on_Object_Oriented_Design.chm - для начинающих тоже должно подойти, об ООП и паттернах проектирования, мне очень понравилось
 

FB3

Новичок
Автор оригинала: IIIEPJIOK
Вот тут, на мой взгляд достаточно неплохо написано о ООП в контексте ПХП

ЗЫ. Отдам эту книгу в печатном виде, самовывоз ....А то выкинуть рука не поднимается.
Про ООП может там и неплохо написано, но то, что это все по PHP4 - делает книгу довольно не актуальной.
Мне в свое время вот эта книга понравилась:
http://torrents.ru/forum/viewtopic.php?t=507803
 

Духовность™

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

Krishna

Продался Java
klax
Первым делом не читай то, что тебе тут пытались разъяснять по поводу принципов ООП - в них явно плохо разобрались отвечающие, по крайней мере Фана.т похоже вообще имеет смутные представления, а dimagolov плавает в вопросе полиморфизма и понятия абстрактных классов.

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

Если уж начинать учить ООП на примере PHP5, то можно читать соответсвующие главы Котерова http://www.ozon.ru/context/detail/id/4030251/ , где есть небольшая вводная в абстрактную теорию, а после неё стоит поглядеть http://www.ozon.ru/context/detail/id/2847621/ , где тема ООП развёрнута чуть больше, имеется введение в паттерны проектирования (суть классические приёмы в ООП). Ну а дальше уже сам поймешь, что читать.

-~{}~ 20.01.09 22:51:

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

Активист

Активист
Команда форума
В моей модульной системе управления или точнее движке все построено исключительно на классах. В любой точке кода, в любом месте я могу запустить любой модуль, заставить модуль сделать нужно мне действия, получить какие-либо параметры, результат и т.п. без опасения, что где-то что-то может "наехать" или "изменить текущую работу модуля".

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

Основной класс - ядро, класс одиночка, запускает всю систему, классы и библиотеки.
Для работы с Отладкой - один класс (на всю систему).
Для работы с СУБД - один класс
Для работы с Шаблонизатором - один класс
Для работы с ЧПУ - свой класс, один.
Для управления модулями и запуска действий из других модулей - один управляющий класс.
Да еще и модули построены на классах. Если будет задача дать другому программисту написать что-то , то он будет делать как привык, ему нужно будет опеспечить лишь точку входа и выхода (а заставить можно абстрактными классами или интерфейсами. Это их одна цель - заставить и рассказать) .

Есть задача - существует один модуль и из него нужно запустить другой модуль (например, сделав какое-либо действие с товаром, нужно запустить модуль билинга и заставить его сделать действие по списанию средств, отослать письмо, уведомить админа и т.п.) достаточно в любой части кода модуля товаров запустить модуль билинга, и сказать ему "иди и спиши с пользователя ID 233 - 100 рублей", модуль билинга обработает данные, пошлет письмо, уведомит админа и так далее, сообщит лишь модулю товаров ответ - успешно или нет, или , код ошибки, например.

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

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

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

Как это реализовать без классов - ой не знаю.
 

x-yuri

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

Абстрактные классы и интерфейсы служат лишь для типизации программирования, что бы горе программист не забыл описать метод, например, не "засунул" в метод какой-нибудь параметр, который может нарушить целостность.
1) забыть может и не горе-программист, 2) я думал, что назначение интерфейсов следует из их названия - описать интерфейс, который будет реализоваться конретными классами
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху