Выбор парадигмы программирования
Ни к чему не обязывающий мысленный эксперимент, навеянный чтением Дейкстры и Киллелиа с легкого похмелья.
Какую парадигму программирования вы бы использовали для создания самой любимой и дорогой сердцу собственной программы, если бы вас никто не ограничивал в выборе инструментов, ресурсов, настройке быстродействия и сроков разработки продукта? (структурное, ООП, процедурное, прототипное, императивное, функциональное, логическое, аспектное, клеточно-автоматное, событийное... хватит, пожалуй.)
Джихады типа «embedded vs. outsorce» и «сишники против джаверов», естественно, не благословляются.
20 коментарів
Додати коментар Підписатись на коментаріВідписатись від коментарівВаш тон, Grez, наводит на мысль, что вы не заинтересованы в продуктивном исходе холиворчика. Учите матчасть, в числе прочего Inside F#.
Можно я не буду комментировать это высказывание, а просто дам пруф?Interaction design for software engineering: boost into programming future by Claude Knaus, Interactions, vol. 15, #4 (07−08/2008). p. 71−74.
Правильно, я никогда и не претендовал на копирайт в отношении этого куска кода.: -)Upd. Извините, пожалуйста, но вас бы не затруднило копипастить текст из M$ Word с включенным спеллчекером, а то читать неприятно для глаз?
Ваш пример действительно по всему интернету разбросан, и его задача показать мосч и силу F# по сравнению с классической императивной парадигмой (где вы здесь, в С#-ом примере ООП увидели?). Имхо, этот пример демонстрирует целый ряд недостатков F#, впрочем не буду оффтопить.
Что самое главное — я понять никак не могу, как данный пример вяжеться с тем, что вы раньше постили. Чего он такого демонстрирует, в чом чистая функциональная парадигма имеет сногшибательное преимуущество перед ООП в виде отсуствия «танцев плясок с бубном».
А, ну я так и знал.^_^ Вот самый что ни на есть бородатый пример, восходящий к руководствам МакКракена по Фортрану 66. Задача: дана стартовая точка на плоскости и примерный координатный разброс нескольких следующих точек, найти кратчайшее расстояние от ГМ этих точек до стартовой. Решение на С#:
Решение на F# в стиле руководств Санчеса и Макнамары:
Yep
А на счет того, что не следует кидать новичков в ООП, в лоб, я с вами согласен, но альтернатив, похоже, становиться все меньше...
2 Михаил Сорочан да, 5233 поста — это сильно, нам еще расти и расти до них: -)
Опубликованных материалов по ней особо нет, уж извините.
Ключевые моменты идеологии (не в контексте программирования) можно найти здесь.
К теме предыдущих постов — интересный топик по функциональному программированию. Там чтива почти на месяц. Нашел там много интересных ссылок и мыслей.
Да уж. Некоторые олдфаги, вовремя приспособившие реальность под свои мыслительные процессы, оказываются способны высказывать весьма конструктивные, хотя и парадоксальные вещи. Я когда-то пытался изучать С++ по Прате. Прочитал первые шесть глав и захлопнул книгу. Долго попускало, пришлось перейти на Дейтела и Бьярне, и тогда более-менее пошло. Когда ООП-парадигма подается в лоб, без обсуждения и интеграции (при случае) каких-либо альтернатив, и сопровождается зубодробительными проповедями о мире объектов, это имхо лучший способ запудрить нубасу моск и превратить его в сферического быдлокодера в вакууме, клиента всяких сутенеров типа Developers Club ^-)) On the other hand, я не отрицаю, что у функциональных языков есть существенные траблы при типизациях для кода Win/Web Forms.
Извинение принято: -)) По существу сабжа
Уфф, объясняю по-русски. Вот представьте себе, скажем, что вы используете командный шаблон, реализуя его через класс Command или интерфейс с методом Execute. ООП-парадигма as is требует многократной возни с теми самыми «сущностями», которые не рекомендует умножать принцип бритвы Оккама, как то — класс Command, интерфейс, метод Execute, более конкретные подтипы, участвующие в воплощении шаблона в реальном коде.А программа на языке, использующем функциональную парадигму, не нуждается во всех этих плясках с бубном. Тип функции (напр., int-> unit) является необходимым, достаточным и единственным нужным описанием интерфейса, и даже любое лямбда-выражение корректного синтаксиса может быть теперь применено в качестве верного воплощения шаблона. Но ведь такие вышеперечисленные шаги, как моделирование с шаблонами, декомпозиция и инкапсуляция, имеют определяющее значение для кошерного десктоп аппа. Отпадает необходимость и упаковывать математические функции в оболочку классов, хотя более естественным с точки зрения общей математической структуры программы является их определение в открытом модуле и более свободное обращение с ними, включая вызовы по коротким именам. Соответственно, интеграция функционального программирования, как в том же F#, может быть более полезной для проектирования десктопа, чем следование рамкам одной парадигмы. Вот как-то так. Кстати, кто знает, F# будет уже интегрирован в M$ Visual Studio 2010?
З.Ы. по поводу русского, прошу меня простить, и больше к этому вопросу не возврашаться; -)
Я думал STL это Standard Template Library, оказывается... after all, STL stands for STepanov and Lee:)
en.wikipedia.org/...xander_Stepanov
Grez, поправьте немного русскую орфографию и вдумайтесь в следующие строки:
© угадайте кто, это, кстати, и к вопросу о том, можно ли программировать после сорока лет...
Если говоирить про десктоп апп, то помойму ООП настолько сейчас распространено, что рассматривать альтернативные парадигмы, можна только в ключе «нефиг-делать, поэксперементируем».
1. Hardware/RTL
2. RTOS/Drivers
3. Embedded Apps
4. Simple Server Apps
5. Desktop/Client Apps
6. Web Dev
7. HA apps/clusters
8. AI
В каждом классе эффективным является узкий набор парадигм и/или инструментария, которые часто бывают еще и повязаны помеж собой. Потом есть задачи гималайской сложности, в комплексе которых может применяться практически весь набор доступных способов и средств. Ну и также можно еще добавить человеческий фактор со своим ограниченным набором и взглядом на задачу...
vs. при том, что здесь недавно публиковалась обросшая мини-холиваром статья «Уявна криза аутсорсу». Я позволю себе процитировать один коммент к ней, имхо, его достаточно:
А причём тут versus?
Если драйвер, то выбора, как правило, нет.
если бы это была вычислительная система — процедурное,
если драйвер — то событийное,
если нужно обрабатывать/анализировать текст по каким-либо правилам — автоматное
и т.д.
Получается — всему своё место.
Но ближе всего к сердцу ООП. Уж очень оно совпадает с тем, как информация представлена в голове.