Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2013.06.30;
Скачать: [xml.tar.bz2];

Вниз

ООП vs ФП   Найти похожие ветки 

 
KilkennyCat ©   (2013-02-04 23:50) [40]

а копи-пасте некоторых кусков ассемблерного кода с последующими небольшими изменениями, это ООП?


 
Плохиш ©   (2013-02-05 00:01) [41]

Прикольная ветка.


 
Inovet ©   (2013-02-05 00:03) [42]

> [40] KilkennyCat ©   (04.02.13 23:50)

Это кусочно-адаптивное Пэ.


 
Kerk ©   (2013-02-05 00:18) [43]


> Игорь Шевченко ©   (04.02.13 22:30) [36]
>
> Kerk ©   (04.02.13 21:59) [27]
>
> Я ничего не знаю про ФП ;) Расскажи ?

Ну это слишком общО как-то :)

Вот под рукой хороший пример на ML.
Объявляем полиморфный тип данных - дерево.

datatype ("a,"b) tree = Node of "a * ("a,"b) tree * ("a,"b) tree
       | Leaf of "b


Это дерево содержит в узлах значение типа "a, в "листьях" значение типа "b

Допустим, мы хотим объявить конкретное дерево с значением int в узлах и string в "листьях". Этот тип выглядит так:

(int, string) tree

Просто, да? Сколько строк займет подобное на ОО-языке? :)

А теперь, я допустим захочу вместо int хранить там record вот такой

datatype student_info = {name : string, surname : string, age : int}

Много ли для этого понадобится? Нет, тот же самый полиморфный тип:

(student_info, string) tree

А теперь у нас вдруг оказывается, что иногда вместо student_info нам удобнее хранить некий ID, но этот ID есть не у всех, так что у кого-то останутся строковые данные.

Что делаем? Пишем:

datatype student = StudentID of int | StudentStr of student_info

Символ "|" здесь можно условно воспринимать как "или", т.к. этот тип может содержать один из вариантов.

Ну и дерево соответственно начинает выглядеть так: (student, string) tree

Сколько строк понадобится на любом ОО-языке для подобного полиморфизма?

Как с такими типами работать? Очень просто. Тут нам на помощь приходит вся мощь паттерн-матчинга. Например:

fun someop (stud : student) =
   case stud of
      StudentID x => (* здесь x - это соответствующий ID *)
   | StudentStr x => (* а здесь - x = student_info *)

Ну вот как-то так, в двух словах.


 
картман ©   (2013-02-05 00:52) [44]


> Просто, да? Сколько строк займет подобное на ОО-языке? :
> )

другой синтаксис, дженерики... а суть отличий в чем?


 
Kerk ©   (2013-02-05 00:56) [45]


> картман ©   (05.02.13 00:52) [44]
> другой синтаксис, дженерики...

Ну во-первых, во многих ОО-языках дженериков тупо нету. До сих пор :)
А в большинстве они появились только недавно, в последние годы.

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

> а суть отличий в чем?

В том же, о чем в топике речь. Все суперизобретения ООП в ФП есть уже лет 50 :)


 
картман ©   (2013-02-05 01:02) [46]


> Все суперизобретения ООП в ФП есть уже лет 50 :)

полностью согласен.
Да и большинство "новых"-технологий/методов и т.д. тоже оттуда.

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


 
Kerk ©   (2013-02-05 01:13) [47]


> кроме, разве что, в ОО данные и действия в одном месте.

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


 
KSergey ©   (2013-02-05 09:09) [48]

> Kerk ©   (05.02.13 00:18) [43]

Т.е. приведенный кусок - это ФП?
Ну тогда отличий и в самом деле нет.


 
Игорь Шевченко ©   (2013-02-05 10:32) [49]

Kerk ©   (05.02.13 00:18) [43]

Насколько я читаю определение:

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

Совершенно другой подход, и говорить о том, что принципы ООП были в ФП кучу лет назад не совсем, по-моему, корректно


 
Anatoly Podgoretsky ©   (2013-02-05 10:38) [50]


> Есть подозрение, что увеличенное поголовье индусов и китайцев
> то же есть реакция на повышенный спрос.

Индусы и китайцы основа ООП


 
jack128 ©   (2013-02-05 10:49) [51]


> "Объектно-ориентированное программирование - это методология
> программирования, основанная на представлении программы
> в виде совокупности объектов, каждый из которых является
> экземпляром определенного класса, а классы образуют иерархию
> наследования.

то есть языки со структурной и динамической типизацией не могут быть ОО-языками?


 
Игорь Шевченко ©   (2013-02-05 10:53) [52]

jack128 ©   (05.02.13 10:49) [51]

че ?


 
Kerk ©   (2013-02-05 11:18) [53]


> Игорь Шевченко ©   (05.02.13 10:32) [49]

> Совершенно другой подход, и говорить о том, что принципы
> ООП были в ФП кучу лет назад не совсем, по-моему, корректно

Ну да. Иммутабельность данных, отсутствие побочных эффектов. Правда, точнее - стремление к этому.

Но я напомню о чем ветка. Автор утверждает, что на заре было ФП и была императивщина. И ООП придумали, чтоб приблизить императивщину к ФП по выразительным средствам. И действительно - убери из ООП то, что позаимствовано из ФП, непонятно что в итоге останется :)


 
Kerk ©   (2013-02-05 11:24) [54]

Я тут на досуге соорудил некое подобие объекта на ФП. Тип данных, который содержит в себе и данные и методы их обработки. Инкапсуляция во весь рост, к внутренним данным ни у кого доступа нет.

datatype set = Set of {
  add : int -> set,
  exists : int -> bool,
  count : unit -> int
     }

fun empty_set () : set =
   let
fun prepare init =
    let
 val xs = init

 fun f_add x =
     prepare (x::xs)

 fun f_exists x =
     List.exists (fn (a) => a=x) xs

 fun f_count () =
     List.length xs
    in
 Set {add = f_add, exists = f_exists, count = f_count}
    end
   in
prepare []
   end

fun e (s : set) =
   case s of
Set x => x


Тип set содержащий в себе числа и имеющий три метода: add, count и exists.

Применять примерно так:

- val a1 = empty_set();
val a1 = Set {add=fn,count=fn,exists=fn} : set
- (#count (e a1))();
val it = 0 : int
- val a1 = (#add (e a1))(13);
val a1 = Set {add=fn,count=fn,exists=fn} : set
- (#count (e a1))();
val it = 1 : int
- val a1 = (#add (e a1))(42);
val a1 = Set {add=fn,count=fn,exists=fn} : set
- (#exists (e a1))(13);
val it = true : bool


Жирным мой код, за ним ответ интерпретатора.
Ну и прошу делать скидку на мою криворукость, кто-то может быть элегантнее бы смог :)


 
Ega23 ©   (2013-02-05 11:24) [55]


> чтоб приблизить императивщину к ФП по выразительным средствам


Спорный вопрос. Биение на абстракции (а ООП, по сути, это и есть) оно хорошо само по себе, вне зависимости от своей реализации "в кишках".


 
Kerk ©   (2013-02-05 11:27) [56]

Форум съел табы :)
Вот тут нормальная версия http://yankovsky.me/sets.txt


 
Kerk ©   (2013-02-05 11:28) [57]


> Ega23 ©   (05.02.13 11:24) [55]
>
> > чтоб приблизить императивщину к ФП по выразительным средствам
>
> Спорный вопрос. Биение на абстракции (а ООП, по сути, это
> и есть)

Биение на абстракции было и до ООП и после него будет.


 
Игорь Шевченко ©   (2013-02-05 11:37) [58]

Kerk ©   (05.02.13 11:18) [53]


> Но я напомню о чем ветка. Автор утверждает, что на заре
> было ФП и была императивщина. И ООП придумали, чтоб приблизить
> императивщину к ФП по выразительным средствам. И действительно
> - убери из ООП то, что позаимствовано из ФП, непонятно что
> в итоге останется :)


Мне кажется, автор преувеличивает относительно заимствования.


 
Ega23 ©   (2013-02-05 11:50) [59]


> Биение на абстракции было и до ООП и после него будет.

Там оно как-то нагляднее, что ли? ИМХО.


 
Компромисс1   (2013-02-05 14:13) [60]

Насколько я помню Lisp, ФП предполагает работу на очень высоком уровне, когда нас интересует только результат и не особо интересует реализация, то есть как именно этот результат был достигнут. Уровень черного ящика.
Мы вызываем какой-нибудь CDR с параметрами и нам наплевать, как эти параметры представлены внутри List машины и как эта CDR их собственно обрабатывает.
Это близко к какому-нибудь SQL с его SELECT, которому тоже наплевать, как хранятся таблицы, строки и колонки, как происходят JOIN и пр. Тоже черный ящик.
Конечно, было невозможно использовать чисто процедурные императивные языки на таком высоком уровне, программисты вынуждены были работать на уровне переменных типа int и char[]. Библиотечные функции типа calculateAverage(int[]) явно недостаточны, потому что кто-то все равно должен был инициализировать/передавать параметры, то есть у нас множество серых ящиков вместо одного черного. Поэтому придумали ООП, которое позволяет легко создавать черные ящики любого уровня сложности.


 
clickmaker ©   (2013-02-05 14:55) [61]

> А ООП - это просто костыль

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


 
Медвежонок Пятачок ©   (2013-02-05 15:28) [62]

если ооп это костыль, то что же тогда есть процедурный подход?

а вообще тема ветки - для задротов.


 
sniknik ©   (2013-02-05 16:07) [63]

> Но костыль - это нечто ...
что при должном развитии становится протезом. :)


 
Kerk ©   (2013-02-05 16:13) [64]


> Компромисс1   (05.02.13 14:13) [60]

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


 
Компромисс1   (2013-02-05 16:56) [65]

Kerk ©   (05.02.13 16:13) [64]

Насколько я знаю, сперва появились низкоуровневые языки: машкоды, затем ассемблер. Только потом появились функциональные языки, а также императивные языки более высокого уровня, чем ассемблер, но более низкого, чем какой-нибудь C#. Так что не было никакого отказа от высокоуровневости. Просто функциональные языки сперва обогнали императивные, а теперь императивные их догоняют. Функциональные вообще обогнали время, появившись слишком рано, - как можно не заботиться о способе реализации, если памяти 16кб и процессор соответствующий (даже не помню, можно ли говорить тут о сотнях тысяч операций в секунду)...


 
Kerk ©   (2013-02-05 17:01) [66]


> Компромисс1   (05.02.13 16:56) [65]

Это понятно что сначала машкоды появились. Но вообще почва под ФП закладывалась еще до появления компьютера. Лямбда-исчисление Чёрч еще в 30х придумал.

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

> Функциональные вообще обогнали время, появившись слишком рано

В точку.


 
KilkennyCat ©   (2013-02-05 17:09) [67]


>  сперва появились низкоуровневые языки: машкоды, затем ассемблер.
>  

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

4-я страница идет, какие-нибудь предложения к действиям уже есть? а то у меня есть тушь, перья и большой кусок картона.


 
Игорь Шевченко ©   (2013-02-05 18:14) [68]

Kerk ©   (05.02.13 17:01) [66]


> любой функциональный язык "выше", чем С с Паскалем


Не совсем понял, в чем высота меряется ? В количестве строк кода для выражения алгоритма ? Тогда не уверен


> не говоря уже о фортранах и алголах.


Ты один от другого-то отличаешь ? :)


 
Kerk ©   (2013-02-05 18:23) [69]


> Игорь Шевченко ©   (05.02.13 18:14) [68]

> Не совсем понял, в чем высота меряется ? В количестве строк
> кода для выражения алгоритма ? Тогда не уверен

Ну вот Algol 68, Fortran, виртовский Паскаль и ML появились в рамках одной пятилетки. Угадай, в каком из этих языков полиморфная система типов? :)

LISP так вообще динозавр. Не уверен, что вообще были какие-то другие языки высокого уровня в 1958 году.

> Ты один от другого-то отличаешь ? :)

Я на них не писал, врать не буду. Но примеры кода видел, так что наверно отличу :)


 
Павиа   (2013-02-05 18:28) [70]

Вначале появился язык математики. Он был функциональным потом появилась польская натация после первый калькулятор. После машкоды и ассемблер. затем фортран. Фортран был императивным. После уже появляется ООП.  

Да в ООП в качестве входных данных выступает объект без конкретизации его части. Что облегчает труд программиста. Но делает программу слабо предсказуемой. (Похо сформулировал)


 
Kerk ©   (2013-02-05 18:36) [71]


> Ну вот Algol 68, Fortran, виртовский Паскаль и ML появились
> в рамках одной пятилетки. Угадай, в каком из этих языков
> полиморфная система типов? :)

Ах, да... и сборщик мусора, конечно же.


 
Kerk ©   (2013-02-05 18:38) [72]


> Не уверен, что вообще были какие-то другие языки высокого
> уровня в 1958 году.

А, Фортран таки был, чОрт. Ошибся с его датировкой. Его честнее с LISP сравнивать. Но это мало что меняет.


 
Игорь Шевченко ©   (2013-02-05 18:42) [73]

Kerk ©   (05.02.13 18:23) [69]


> Ну вот Algol 68, Fortran, виртовский Паскаль и ML появились
> в рамках одной пятилетки. Угадай, в каком из этих языков
> полиморфная система типов? :)


Угадай, в каких задачах в то время она была востребована ? Правильно :)

Фортран и Алгол появились слегка раньше, если что...


 
Игорь Шевченко ©   (2013-02-05 18:46) [74]

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

Кстати, в Фортране сборщика мусора не было, потому что там не было мусора :)


 
Kerk ©   (2013-02-05 18:59) [75]


> Игорь Шевченко ©   (05.02.13 18:42) [73]

> Угадай, в каких задачах в то время она была востребована ? Правильно :)

Ну да. Именно поэтому все то же самое начали прибивать гвоздями к наследникам Алгола и Фортрана через 40 лет. Зелен виноград :)

> Фортран и Алгол появились слегка раньше, если что...

По Фортрану я уже исправился, но насколько я понимаю, он на фоне LISP не сильно лучше смотрится, чем на фоне ML. А Алгол вроде как раз попадает в рамки одной пятилетки, как я и сказал. Это очень маленькая разница. В Делфи юникод дольше внедряли :)

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

Языки не только толкал вверх уровень сложности, но и тянули вниз "железячные" ограничения. Как только железо стало позволять, сразу появились в императивных языках и сборщики мусора, и дженерики и много чего еще :). Так что "не было, потому что не надо было" позиция хотя и удобная, но довольно шаткая.


 
Игорь Шевченко ©   (2013-02-05 19:04) [76]

Kerk ©   (05.02.13 18:59) [75]


>  Алгол вроде как раз попадает в рамки одной пятилетки, как
> я и сказал


Алгол разработан в 1958 году


> Именно поэтому все то же самое начали прибивать гвоздями
> к наследникам Алгола и Фортрана через 40 лет. Зелен виноград
> :)


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

Тебя не удивляет тот факт, что функциональные языки стали на слуху сравнительно недавно ? (За исключением LISP, разумеется)

Наверное это ж-ж-ж неспроста.


 
Kerk ©   (2013-02-05 19:13) [77]


> Игорь Шевченко ©   (05.02.13 19:04) [76]

> Тебя не удивляет тот факт, что функциональные языки стали
> на слуху сравнительно недавно ? (За исключением LISP, разумеется)

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

> Пратт в свое время очень неплохо это описал. Говорить сейчас,
>  что ООП берет из ФП сборщики мусора и полиморфные типы,
>  это по меньшей мере лукавство, потому что ООП это несколько
> иное, Буч об этом, опять же пишет.

Так вот давайте поймем что же такое ООП и чем оно радикально отличается от других парадигм? Да, после процедурности это было рывком вперед, уровень выше. Но пока все, о чем пишет Буч, можно реализовать в ФП. Давайте назовем это таким паттерном проектирования?

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


 
alexdn ©   (2013-02-05 19:14) [78]

> Игорь Шевченко ©   (05.02.13 19:04) [76]
> Наверное это ж-ж-ж неспроста.
наверное ооп исчерпалось?


 
Игорь Шевченко ©   (2013-02-05 19:19) [79]

Kerk ©   (05.02.13 19:13) [77]


> Так вот давайте поймем что же такое ООП и чем оно радикально
> отличается от других парадигм?


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

Этим на мой взгляд они и отличаются.


 
alexdn ©   (2013-02-05 19:19) [80]

> Kerk ©   (05.02.13 19:13) [77]
У меня как то дебильная идея родилась.. а что если б языки были не обьектно ориентированные, а событийно ориентированные? Хотя это тоже всё танцы с бубном вокруг ФП и ооп. Т.е. чтобы событие не привязывалось к обьекту. Эдакий язык из хуков..



Страницы: 1 2 3 4 вся ветка

Форум: "Прочее";
Текущий архив: 2013.06.30;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.65 MB
Время: 0.035 c
2-1352485025
Новичок
2012-11-09 22:17
2013.06.30
Посоветуйте ехе-пакер


2-1352812667
Александр_2012
2012-11-13 17:17
2013.06.30
DBEdit.Exit и DBNavigator


15-1360960202
Юрий
2013-02-16 00:30
2013.06.30
С днем рождения ! 16 февраля 2013 суббота


2-1352808806
IGray
2012-11-13 16:13
2013.06.30
Как локально отключить перехват исключений Delphi IDE


2-1352845344
123456789igor
2012-11-14 02:22
2013.06.30
подсчет символов в ячейке





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский