LINUX.ORG.RU

[philosophy] В чем заключается революционность перехода от функциональщины к ООП?


1

0

Так уж повелось, что первый язык, который я изучал, был делфи. Потом всякие сишарпики, С++, лисп, и т.п. В итоге, как мне кажется, у меня ООП головного мозга. Когда возникала задача писать на С, я начал реализовавывать обьектную модель в этом языке.

«Стоп», сказал я себе и подумал. Почему сейчас все кругом вопят про ООП и про его архиполезность и архиправильность? Далее, по ходу раздумий, пришел к мысли, что все, что пишется с использованием ООПшной парадигмы, может быть написано и без нее.

Почему появились языки, которые взяли ООП за главенствующую идею (java, c#, етц)?

Неужели те преимущества, которые предлагает ООП (полиморфизм, инкапсуляция, наследование), дают прирост в эффективности, скорости написания программ, понимания их работы и поддержке? Здесь было бы интересно сравнить одну и ту же программу, написанную на С и на С++, чтобы узреть принципиальные архитектурные различия (может такие уже есть?).

Сухой остаток. ООП представляет из себя еще один уровень абстракции, который позволяет оперировать про проектировании не функциями, а обьектами. А неужели это так меняет дело и делает разработку более удобной?

Было бы интересно без срачей услышать компетентное мнение.

★★

Ответ на: комментарий от SV0L0CH

>По такому определению можно и C назвать функциональным, ведь ссылки и указатели на функции можно передавать и возвращать...

Это не совсем то.

Ты не сможешь возвращать функции как конструкции из других функций

yoghurt ★★★★★ ()
Ответ на: комментарий от anonymous

>Т.е. при использовании ООП мозг работает в нормальном привычном режиме

Это самая распостранённая форма ФГМ и не надо её позиционировать как здоровое состояние.

всякая функциональщина как раз развивает ФГМ.

Иногда развивается несовместимость с носителями других форм ФГМ, потому это сразу замечается.

SV0L0CH ()
Ответ на: комментарий от iZEN

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

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

mv ★★★★★ ()
Ответ на: комментарий от SV0L0CH

По такому определению можно и C назвать функциональным, ведь ссылки и указатели на функции можно передавать и возвращать...

Только функции в нём не first class objects :)

mv ★★★★★ ()
Ответ на: комментарий от oami

>> Де-факто мы генетически и значительной частью своего прижизненного опыта приспособлены воспринимать и мыслить в терминах объектов.

... а введение классов и других высокоуровневых абстракций, возможно, отличает нас от животных.

Но мне вот интересно --- является ли процесс (процесс в смысле эволюции объекта) объектом? Всегда ли можно использовать объектный подход при формализации различных понятий и категорий?

Наблюдая за хомосапиенсами я пришел к заключению, что абстрактность мышления является совсем не нормой, а дивиацией. Так что мы на самом деле ненормальные %)

SV0L0CH ()
Ответ на: комментарий от oami

>Но мне вот интересно - является ли процесс (процесс в смысле эволюции объекта) объектом?
Зависит от контекста. Например, процесс как выполнение инструкций программы с точки зрения ОС является объектом.

Всегда ли можно использовать объектный подход при формализации различных понятий и категорий?

Всегда, нужно только иметь мощное концептуальное мышление.

anonymous ()
Ответ на: комментарий от SV0L0CH

По такому определению можно и C назвать функциональным, ведь ссылки и указатели на функции можно передавать и возвращать...

Си никак нельзя. Императивный до предела - все расписано по шагам. Вот, хорошая трактовка «функционального программирования» из одного учебника [sic!] по хаскелю:

What is functional programming? Opinions differ, and it is difficult to give a precise definition. Generally speaking, however, functional programming can be viewed as a style of programming in which the basic method of computation is the application of functions to arguments. In turn, a functional programming language is one that supports and encourages the functional style.

Как минимум, пункт encourages в случае Си не работает.

dave ★★★★★ ()
Ответ на: комментарий от oami

> Но мне вот интересно --- является ли процесс (процесс в смысле эволюции объекта) объектом?

Скорее нет, чем да :) За то трасса (в смысле журнал, лог) является. И может иногда использоваться для undo или для написания учебников истории :)

Всегда ли можно использовать объектный подход при формализации различных понятий и категорий?


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

Однако из всего зоопарка подходов к анализу и проектированию AFAIK именно ООП чаще всего оказывается наиболее близок к естественому.

Manhunt ★★★★★ ()
Ответ на: комментарий от SV0L0CH

>>Т.е. при использовании ООП мозг работает в нормальном привычном режиме

Это самая распостранённая форма ФГМ и не надо её позиционировать как здоровое состояние.


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

anonymous ()
Ответ на: комментарий от SV0L0CH

> Это самая распостранённая форма ФГМ и не надо её позиционировать как здоровое состояние.

Эта форма «ФГМ» усваивается еще до того, как человек научится читать. Поэтому не надо позиционировать ее как ФГМ :)

Manhunt ★★★★★ ()
Ответ на: комментарий от Love5an

> (write pen paper text)

Глупо спорить. Все зависит от того, что мы хотим моделировать :) Почерки, протяженность процесса написания во времени, и тд и тп.

Manhunt ★★★★★ ()
Ответ на: комментарий от Manhunt

Ну приведи пример, где ООП будет явно лучше.

oh ()
Ответ на: комментарий от iZEN

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

иными словами, неиспользуемый код накапливается слоями палеонтологического говна

jtootf ★★★★★ ()
Ответ на: комментарий от Manhunt

>> Это самая распостранённая форма ФГМ и не надо её позиционировать как здоровое состояние.

Эта форма «ФГМ» усваивается еще до того, как человек научится читать. Поэтому не надо позиционировать ее как ФГМ :)

Если болезнь врожденная, то её нет или это не болезнь? Так что-ли?

SV0L0CH ()
Ответ на: комментарий от jtootf

Ну, а не кто и не говорит, что ООП «провалилось» в плане маркетинга.

oh ()
Ответ на: комментарий от SV0L0CH

А если рассматривать C++ и перегрузку operator()() ?

Некое подобие можно получить с boost::bind и boost::function.

mv ★★★★★ ()
Ответ на: комментарий от SV0L0CH

> Если болезнь врожденная, то её нет или это не болезнь? Так что-ли?

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

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

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

PS эко я расфилософствовался?! :D

Manhunt ★★★★★ ()
Ответ на: комментарий от mv

>> А если рассматривать C++ и перегрузку operator()() ?

Некое подобие можно получить с boost::bind и boost::function.

Вот и я о том же, C++ можно рассматривать так язык с поддержкой ФП.

А на C я видел много библиотек где вместе с функцией передаётся ссылка на буфер с данными. Если рассматривать функцию и буфер как одно целое, то функциональный стиль вполне возможен.

SV0L0CH ()
Ответ на: комментарий от Manhunt

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

Главное различать понятия «болезнь» и «девиация», это не одно и то же. А «нормальное» состояние вполне может оказаться паталогичным(но это постепенно исправляется естественным отбором).

SV0L0CH ()
Ответ на: комментарий от SV0L0CH

> но это постепенно исправляется естественным отбором

Естественный отбор _уже_ сказал своё слово. Не вырастут у твоих потомков ни колёса, ни лопасти, ни двигатель внутреннего сгорания. Скорее, ноги атрофируются и станут рудиментарными ;) Примерно так же, как произошло с шерстью на нашей коже после того, как мы от холода стали прятаться в чужие шкуры и согревать свои дома огнём.

Manhunt ★★★★★ ()
Ответ на: комментарий от Manhunt

>Каждое нечто, ... имеет состояние ... такое видение окружающего мира является очень естественным, непроизвольным ...

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

DonkeyHot ★★★★★ ()
Ответ на: комментарий от SV0L0CH

>А «нормальное» состояние вполне может оказаться паталогичным(но это постепенно исправляется естественным отбором).

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

anonymous ()
Ответ на: комментарий от Manhunt

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

процитирую:

«Ну, вот есть хороший демотивирующий пример из соседней области — идея „объектов“. Я вот учу людей программированию, да? И вижу, что вопреки раздающимся со времён Smalltalk'а воплям про естественность этой идеи на самом деле она абсолютно контринтуитивна для большинства людей. Программа как последовательность инструкций, циклы, ветвления, вызовы функций — всё это можно объяснить практически любому (на идее „возвращаемого значения“ часто начинаются проблемы, но это отдельный разговор). А вот как только речь заходит об объектах, начинается путаница. Чаще всего человек просто не понимает, ни зачем это, ни что такое „методы“, ни откуда в теле методов доступ к полям, и т.д., и т.п. И даже многократное успешное объяснение концепций ООП не гарантирует их удержания в голове („А экземпляр класса и его потомок — это одна и та же вещь или разные?“ — спросил меня недавно студент, меньше чем полгода назад довольно бодро рассказывавший на экзамене про наследование, инкапсуляцию и полиморфизм).»

F457 ★★★ ()
Ответ на: комментарий от anonymous

На редкость стоящая статья от лиспера.

я не лиспер, если что; Стил, вобщем-то, тоже - кроме Scheme он работал над Java и Fortress (и High Performance Fortran, например)

jtootf ★★★★★ ()
Ответ на: комментарий от DonkeyHot

>все спинномозговые «видения»

Ваши познания биологии меня огорчают.

anonymous ()
Ответ на: комментарий от anonymous

имеем преобладание ОО-языков

скорей имели. чистых ОО-языков нет и сегодня, и количество еретических декларативно-функциональных возможностей в них всё растёт

jtootf ★★★★★ ()
Ответ на: комментарий от F457

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

Я говорил про анализ и проектирование. А в твоей цитате речь идет о быдлокодинге. Видишь разницу между первым и вторым?

Manhunt ★★★★★ ()
Ответ на: комментарий от Manhunt

писатель.подготовить(бумажка)

А вот это - и правда ROTFL. Любой из трёх предложенных вариантов явно лучше.

Miguel ★★★★★ ()
Ответ на: комментарий от Manhunt

>мозг не годится для того, чтобы полностью раскрыть их потенциал

Т.е. ООП для умственно ограниченых... Конец обсуждения?

DonkeyHot ★★★★★ ()
Ответ на: комментарий от jtootf

>я не лиспер, если что; Стил, вобщем-то, тоже - кроме Scheme он работал над Java и Fortress

Да, но при этом судя по заметке вики он с лиспом имел более чем серьёзные отношения, почти интим.

anonymous ()

RTFM

Не «функциональщина», а «императивщина». Дальнейшая дискуссия бессмысленна ввиду отсутствия у топикстартера владения терминами предметной области.

linuxfan ()
Ответ на: комментарий от DonkeyHot

> Т.е. ООП для умственно ограниченых... Конец обсуждения?

А хождение на двух ногах - для физически неполноценных. Бгг :D

Manhunt ★★★★★ ()
Ответ на: комментарий от nanoo_linux

проще повторное использование кода

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

jtootf ★★★★★ ()
Ответ на: комментарий от anonymous

он с лиспом имел более чем серьёзные отношения, почти интим

у них и общее потомство есть - lambda papers ;)

jtootf ★★★★★ ()
Ответ на: комментарий от F457

>Чаще всего человек просто не понимает, ни зачем это, ни что такое «методы», ни откуда в теле методов доступ к полям, и т.д., и т.п

Тут диагноз на лицо: либо препод из него некудышный, либо учти даунов.

anonymous ()
Ответ на: комментарий от oami

Всегда ли можно использовать объектный подход при формализации различных понятий и категорий?

Можно - всегда. Нужно ли - другой вопрос.

Miguel ★★★★★ ()
Ответ на: комментарий от Manhunt

>А хождение на двух ногах - для физически неполноценных

Ну, в общем, да - будь у нас 6 конечностей мы бы вряд ли встали на 2, а так - манипуляторов не хватало, вот и ходим. А цитируемое - как раз твои слова, просто ты поленился выводы сделать.

DonkeyHot ★★★★★ ()
Ответ на: комментарий от Love5an

(write pen paper text)

Угу, угу. C++-style ООП хоть какие-то гарантии способно давать, а мультиметоды...

Miguel ★★★★★ ()
Ответ на: комментарий от Manhunt

Эта форма «ФГМ» усваивается еще до того, как человек научится читать.

Угу, угу.

ребёнок.подготовить(памперс)
ребёнок.подготовить(член) //FIXME: для детей не того пола пока не работает
ребёнок.уписаться(сильно)
Miguel ★★★★★ ()
Ответ на: комментарий от anonymous

>>Чаще всего человек просто не понимает, ни зачем это, ни что такое «методы», ни откуда в теле методов доступ к полям, и т.д., и т.п

Тут диагноз на лицо: либо препод из него некудышный, либо учти даунов.


на выборке 1 человек(ты сам) ты начинаешь глобальные выводы делать. смишно.

F457 ★★★ ()
Ответ на: комментарий от anonymous

> Всегда, нужно только иметь мощное концептуальное мышление.

Мне явно требуется усилитель мощности мышления. Пока этой мощности не хватает на объектную формализацию этических понятий. Добро и зло, честь и т.п.

Да и с математикой тоже не все ясно. Например, любое ли множество является объектом?

oami ★★ ()
Ответ на: комментарий от Miguel

>aPaper writeOn: aText with: aPen

Объясняю на пальцах: интерфейсы почти всех объектов зависят от предметной области (исключения - стандартные типы данных как массив, хеш и т.п.). Абстрактно они почти не разрабатываются. Так что прекратите своими примерчиками смешить меня.

anonymous ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.