Простой пример одного и того же кода в ООП, функциональном и процедурном стиле?

Здравствуйте, приведите пожалуйста какой нибудь простой пример сравнения одного и того же кода в ООП, ФП и процедурном стиле.
В интернете не нашел чтобы сравнивали именно 3 этих подхода.
Хотелось бы понять разницу между 3мя этими стилями конкретном примере
  • Вопрос задан
  • 3138 просмотров
Решения вопроса 1
sfi0zy
@sfi0zy
Creative frontend developer
(Все это дико не академично, не корректно и воообще, но должно быть понятно):

Процедурный подход: есть последовательность команд. Каждая из них может содержать последовательность команд.
возьми_кофемашину();
налей_воды_в_кофемашину();
нажми_кнопку();
подставь_кружку();
вылей_кофе_в_кружку();
наслаждайся();


ФП - акцент на действии. Одни действия влекут за собой другие.
наслаждайся(
    своим_кофе(
        которое_сделала_кофемашина(
            в_которую_налили_воды())))


ООП - акцент на объектах. Любое действие совершает конкретный предмет
есть кофемашина;
есть кружка;
есть ты;

ты.имеешь(кружку)
кофемашина.имеет(кружку)
кофемашина.поехали();
ты.возьми_свою_кружку();
ты.наслаждайся();
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
longclaps
@longclaps
сложение в ООП:
x.value = 2 + 2
сложение в ФП:
(+ 2 2)
сложение в процедурном стиле:
x = 2 + 2
Ответ написан
@Mercury13
Программист на «си с крестами» и не только
Просуммировать элементы std::vector<int>. Си++.

Процедурный
int sum = 0;
for (int v : vec)
  sum += v;
std::cout << sum << std::endl;


ООП.
class Accumulator
{
public:
  void feed(int value) { fSum += value; }
  int sum() const { return fSum; }
private:
  int fSum = 0;
}

Accumulator acc;
for (int v : vec)
  acc.feed(vec);
std::cout << acc.sum() << std::endl;


Функциональный (правда, слегка настоянный на шаблонах)
int sum = std::accumulate(vec.begin(), vec.end(), 0);
std::cout << sum << std::endl;


UPD. Третий такой маленький, потому что в стандартной библиотеке нашли подходящую функцию.

UPD2. А теперь представьте себе, что нужно вычислять не сумму, а что-то сложное — например, среднее и квадратичное отклонение. В процедурном придётся или раскрывать сложные формулы, или налаживать какие-то обобщения. Объектное меняется на раз-два. В функциональном придётся менять функцию-шаблон, работающую над итератором.
Ответ написан
Комментировать
@red-barbarian
не пытайтесь понимать различие между стилями по текстам. )))
дело в том что различия в парадигмах. различия в том как некий аналитик моделирует предметную область.
пример
есть расчет заработной платы
процедурный подход - считаем отработанные часы, вычисляем сумму по тарифу, вычисляем вычеты, вычисляем налоги, и проч и проч.процедуры состоят из под процедур.
объектный подход - есть табель, есть тарифная ставка, есть налоги, выплаты, вычеты. Это уже что-то похожее с чем работает бухгалтер. следовательно такой подход в этом случае близок к данной предметной области.
функциональный - можно представить так. есть поток данных. мы преобразуем в новый поток данных. затем еще преобразуем и т.д. есть часы. сделаем из них сумму , уберем из них вычеты, уберем налоги, снова вычеты ... на выходе получим сумму выплат.
хотя в примере названия пересекаются, но не факт что сущности в одном подходе появятся и другом. Именно, поэтому не нужно сравнивать одну и туже предметную область в разных подходах.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы