Пропустить навигацию.
Главная

Что такое ООП?

Аватар пользователя helios

Оригинал статьи "Что такое ООП?"

Объектно ориентированное программирование(ООП)...

Что это?
Из названия понятно, что это программирование, ориентированное на объекты.

Что есть объект?
Да хоть что! Все можно воспринимать как объект: стакан — объект, ложка в стакане — опять же объект, и даже ложка со стаканом так же может восприниматься как объект.
И чем же тогда нам может помочь понятие, включающее в себя всё? Ведь, говоря, что «всё — объект», мы лишаем уникальности любое подмножество этого «всего». Впринципе, так и есть: мы обезличиваем вещи, делаем их проще. Зачем? Да чтобы проще было с ними работать!

Чем же этот поход к программированию хорош?

Тем, что такой подход наибоее близок к человеческому пониманию. Представьте, что я бы сказал, что стакан — это множество значений, таких как «высота», «ширина», «длина» и «объём». Такого представления стакана нам хватит, чтобы написать программу, подбирающую упаковку для стакана (размеры упаковки) + мы могли бы сделать возможность выбора (для пользователя) «какого объёма ему нужна тара». Впринципе, для интернет-магазина этого уже может и хватает... Итого, нам потребовалось 4 сущности для описания такой вещи как стакан. Мы их удерживали в голове как отдельные вещи... Думаю, не стоит Вам объяснять, что держать в голове 4 вещи сложнее, чем одну (стакан), пусть даже и подразумевая, что у него есть какие-то параметры...
Что мы сделали, собрав воедино высоту, длину, ширину и объём? Мы абстрагировались от них на новый уровень абстракции(извините за тавтологию) - «стакан», мы инкапсулировали 4 сущности в одну! «Абстракция данных» и «инкапсуляция» являются одними из принципов ООП.

Хм... стакан — это, конечно, хорошо, но вот наш интернет-магазин набрал обороты, и наши покупатели не довольны, что у нас стаканы не различаются по цвету... Мы можем сказать «O'key, ща напишу новую абстракцию 'цветной стакан'», но делать это «с нуля» глупо, лучше использовать наработки из «предыдущей серии». И вот мы берём наш старый тип абстракции «стакан» и, основываясь на нём, создаём новый, но с дополнительным пунктиком - «цвет». Но делаем это не банальным переписованием, а говорим «нам, пожалуйста, тип абстракции, основанный воооон на том, но с новым пунктом 'цвет'». И у нас готов новый класс, как бы наследующий от предыдущего все качества. Этот принцип называется «наследование». Мы получили «ребёнка»(потомка) от родительского типа «стакан»(предок), который унаследовал все плохие и хорошие качества отца :)

Отлично! Теперь у нас есть механизм создания сложных иерархий(родов). Причём каждый следуйщий в роду наследует все качества предыдущего и добавляет некоторые свои... А вдруг унаследовалось что-то «плохое»(ненужное), или нам просто показалось, что в этом поколении какое-то свойство должно выполняться по-другому... Например, всё тот же тип «стакан», был у него метод(действие над ним) «запаковаться», где он брал свои габариты, выбирал коробку из какой-то базы и командовал «запаковать» вот в эту коробочку...

Но пришли новогодние праздники и вы создали «стакан новогодний подарочный», наследуясь от «цветного стакана» (ну, вы помните, абзацем ранее мы его создали), а «цветной стакан» унаследовал метод упаковки от обычного стакана. Но нам то нужен не обычный способ! Всё-таки праздники :) ! Мы, конечно, можем создать новый метод «упаковать празднично», а тот (предположим его звали «упаковать») оставить «на память» об эволюционном процессе (подобно копчику)... Но такой подход до добра не доведёт: ну ладно, 1 копчик... а представьте 10 ;-) Так что надо что-то делать! И тут нам ООП предлагает «полиморфизм» - это когда одному названию соответствует несколько вещей. В нашем случае — одному методу «упаковать» мы сопоставим 2 команды. То есть переопределим в нашем новогоднем типе этот метод по-своему (сбантиками и блёстками)... И никаких копчиков!

И что же мы в итоге получили: абстракцию данных, инкапсуляцию, наследование и полиморфизм. Вот четыре принципа ООП, которые облегчают нам задачу проектирования сложных конструкций. А программирование с учётом этих четырёх принципов — и есть ООП.

Re: Что такое ООП?

Очень хорошо и подробно написано. :)

Re: Что такое ООП?

А вот ещё мнение...
Ежели можно парочку слов, на эту тему. Надеюсь не затруднит...
В теории программирования сейчас никто не сомневается, что магистральным направлением является объектно-ориентированное программирование. А в области объектно-ориентированного программирования - компонентное программирование. Важнейшим преимуществом Windows 95 была COM-модель. COM-объекты и компоненты ActiveX сделали возможной высокую степень интеграции приложений друг с другом.
Попытка сделать то же под LINUX не вызывает ничего, кроме нервного смеха. Не предусмотрено под LINUX ничего подобного! Каждая программа там - сама по себе. Пробовали, знаем
http://citkit.ru/articles/24/#comments

Re: Что такое ООП?

Фьюх... Прочитал "О доблести Билла Гейтса, или почему Windows лучше, чем LINUX или Mac OS", а для полноты картины, ещё и "О злокозненности Билла Гейтса, или почему я не люблю Windows". Не зря, видимо, я Вам ссылку на Citkit дал - нашли для себя интересное(надеюсь) чтиво. И, если я там искал какие-то технические решения, обходя стороной эмоциональные материалы, то Вы выбрали один из самых "скандальных" материалов. Ну что же, воля Ваша :)

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

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

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

Сам я ООП уважаю и по лености своей практикую.

Что же касается COM, то это, на мой взгляд вполне логичное решение проблемы взаимодействия систем при закрытости технологий. Иначе - очень туго. Нет наработок "со стороны", как в Линукс, приходится людям изобретать велосипеды. При использование COM есть возможность использовать в своём ПО чужие бинарники... Хотя с точки зрения безопасности - сомнительно(считайте программируете систему на блобах).

Re: Что такое ООП?

Я всегда был неплохим учеником. Спасибо за ссылку... Я использовал цитату, поскольку мои мысли, возможно, были бы не столь чётко сформулированы. Да и собственно говоря, меня меньше интересует идеология программирования сама по себе, чем инструментарий позволяющий реализовать преимущества этой идеологии...
Ради бога, я прекрасно знаю весь противоречивый спектр мнений о Basic... Но, так уж судьбе было угодно... Первым из моих «бейсиков» - был Basic для самодельного РК-86, который я вводил дамп за дампом ползая линейкой по страницам журнала «Радио». Затем вся последовательность идущих вместе с DOS их разновидностей. И вот Visual Basic...
Буквально — шок! Сколько же мне пришлось бы написать строк кода, чтобы изобразить графически любой из предлагаемых мне программой компонентов, элементов...
Мышкой творим чудеса! Не нравится цвет будущей панели, какие проблемы, а может быть расположить кнопочки на фоне пейзажа... Нет проблем! Надписи (можно анимированные), кнопочки (объемные, с эффектом нажима, овальные разноцветные и.т.д.)... Нарезаем окошечки, размещаем менюшки, выпадающие, ниспадающие с эффектом анимации... Любуемся, а затем как обычно... Описываем массивы, переменные, логическую часть и... Тестируем, запускаем отладчик кода, максимально подробно описываем каждый этап, красиво — псевдографикой... Внешний вид листинга — особый шик! Хотя, вроде бы зачем? После компиляции — всё это будет недоступно...
Простите, но ... «Глубоко» ковыряться пришлось лишь Linpus Linux, где на все эти принципы, простите — положен «маузер»... «Закоментированные» или «заремленые» строчки можно найти где угодно, в любом месте программы и количество их таково, что спокойно можно вместо них вписать роман «Война и мир»...
Судя по невзрачности, серенькому цвету и виду подавляющего количества ПО под Linux, вся эта роскошь предоставляемая языками высокого уровня, недоступна программистам - принципиально... Ничем более, этого я не могу объяснить...
Прошу прощения, «буков» - уж больно много и не судите строго, ежели где явные «ляпсусы» в логической цепочке. Программирование не мой хлеб, а всего лишь хобби...
Вот собственно, что мне бы хотелось услышать от Вас. Коротенько, без детализации, просто резюме...