Ответ:
В Википедии есть отличная статья о функциональном программировании с некоторыми примерами, которые вы просите. @ Конрад Рудольф уже предоставил ссылку на статью ООП .
Я не думаю, что одна парадигма является супер-набором другой. Это разные точки зрения на программирование, и некоторые проблемы лучше решать с одной точки зрения, а некоторые - с другой.
Ваш вопрос усложняется всеми реализациями FP и ООП. У каждого языка есть свои особенности, которые имеют отношение к любому хорошему ответу на ваш вопрос.
Все более Тангенциальный Рамблинг:
Мне нравится идея, что такой язык, как Scala, пытается дать вам лучшее из обоих миров. Я волнуюсь, что это дает вам осложнения обоих миров.
Java является ОО-языком, но в версии 7 добавлена функция «попробуй с ресурсами», которая может использоваться для имитации своего рода замыкания. Здесь он имитирует обновление локальной переменной «а» в середине другой функции, не делая ее видимой для этой функции. В этом случае первая половина другой функции - это конструктор ClosureTry (), а вторая половина - метод close ().
public class ClosureTry implements AutoCloseable {
public static void main(String[] args) {
int a = 1;
try(ClosureTry ct = new ClosureTry()) {
System.out.println("Middle Stuff...");
a = 2;
}
System.out.println("a: " + a);
}
public ClosureTry() {
System.out.println("Start Stuff Goes Here...");
}
/** Interface throws exception, but we don't have to. */
public void close() {
System.out.println("End Stuff Goes Here...");
}
}
Выход:
Start Stuff Goes Here...
Middle Stuff...
End Stuff Goes Here...
a: 2
Это может быть полезно по назначению: открыть поток, записать в него и надежно закрыть его, или просто соединить две функции так, чтобы вы не забыли вызвать вторую после выполнения некоторой работы между ними. , Конечно, это настолько ново и необычно, что другой программист может удалить блок try, не осознавая, что он что-то ломает, поэтому в данный момент это своего рода анти-паттерн, но интересно, что это можно сделать.
Вы можете выразить любой цикл в большинстве императивных языков как рекурсию. Объекты и переменные можно сделать неизменными. Процедуры могут быть написаны так, чтобы минимизировать побочные эффекты (хотя я бы сказал, что настоящая функция на компьютере невозможна - время, которое требуется для выполнения, и ресурсы процессора / диска / системы, которые она потребляет, являются неизбежными побочными эффектами). Некоторые функциональные языки могут выполнять многие, если не все объектно-ориентированные операции. Они не должны быть взаимоисключающими, хотя некоторые языки имеют ограничения (например, запрещение какого-либо обновления переменных), которые предотвращают определенные шаблоны (например, изменяемые поля).
Для меня наиболее полезными частями объектно-ориентированного программирования являются сокрытие данных (инкапсуляция), обработка достаточно похожих объектов как одинаковых (полиморфизм) и сбор ваших данных и методов, которые работают с этими данными вместе (объекты / классы). Наследование может быть флагманом ООП, но для меня это наименее важная и наименее используемая часть.
Наиболее полезными частями функционального программирования являются неизменяемость (токены / значения вместо переменных), функции (без побочных эффектов) и замыкания.
Я не думаю, что это объектно-ориентированный, но я должен сказать, что одна из самых полезных вещей в информатике - это способность объявлять интерфейс, а затем реализовывать различные части функциональности и данные для реализации этого интерфейса. Мне также нравится иметь несколько изменяемых фрагментов данных для работы, поэтому я думаю, что мне не совсем удобно работать исключительно на функциональных языках, хотя я стараюсь ограничивать изменчивость и побочные эффекты во всех моих проектах программ.