@sinevik

Объясните на простом примере разницу между ООП и ФП?

Ребята, поясните вообще разницу в методологии программирования на конкретном просто примере.

Вот этот стиль написания? Он как называется? Процедурный?

router.get('/users', (req, res) => {
  //get users from DB
  res.json(users)
})
router.post('/users', (req, res) => {
  //create user 
  res.json(userCreated)
})


Вот это тоже самое только в стиле ООП (условно.....)

class UserRouter {
  public router = express.Router() 
  public address = '/users'
  constructor() {
    this.initRoutes()
  }
  initRoutes() {
    this.router.get(this.address, this.getUsers)
    this.router.post(this.addressm this.createUser)
  }
  getUsers(req: express.Request, res: express.Response) {
    //get users from DB
    res.json(users)
  }
  createUser(req: express.Request, res: express.Response) {
    //create user
    res.json(userCreated)
  }
}


Хорошо, тогда как будет выглядеть все тоже самое только в функциональном стиле? Хотя бы условно как это будет выглядеть на ФП, не обязательно рабочий код, желательно на js. Если express позволяет использовать только ООП, то можно условно его на что то заменить (главное понять принцип а не рабочий код написать).
  • Вопрос задан
  • 481 просмотр
Решения вопроса 1
Griboks
@Griboks
В чистом ФП будет примерно так:
releaseSocket(releaseConnection(releaseRouter(json(get('/users',prepareRequest(createRouter(routerParams,connect(createSocket('TCP'),ip, port)))),users))))

Некоторые приёмы использовать стоит, но не самая лучшая идея - писать в функциональном стиле такие программы.
Ответ написан
Пригласить эксперта
Ответы на вопрос 4
mayton2019
@mayton2019
Bigdata Engineer
На чистом ФП программировать достаточно тяжело. Нужно сильно изменить подход к задаче. Чистое ФП предполагает что когда вы вызываете функцию то "вся вселенная замерла". И второй вызов функции с такими-же параметрами будет видеть эту-же мертвую версию вселенной. Это если вобщем.

Наш мир состоит из постоянно менающихся объектов. Файлы. Сетевые соединения. Объекты в БД. Это грязный мир. И натянуть на него ФП парадигму довольно сложно. В хаскель довольно жёстко порешали с этим. Сказали что есть монада IO. И если функция ее возвращает - то она работает с таким грязным миром. Всё остальное - чистое. Тоесть провели границу.

Как тебе конфигурить твой роутер в ФП - я честно говоря не знаю. Мы должны сначала договориться об абстракциях. И понять где проходят границы чистого и грязного миров. Что делает get users from DB. Изменяет ли он мир? Или может вернуть внезамно другой результат при тех-же аргументах. Это все - сложные вопросы которые просто выходят за рамки твоего.

Поэтому лучше не парь себе мозги именно таким вопросом. Кстати функциональщики тоже не могут сойтись на мнении например считать ли Sheme функциональным или мультипарадигменным языком. Вообще строгого деления на такие классы не существует. Можно просто сказать что когда мы программируем - то мы тяготеем к чему-то больше или меньше. Например форма Бекуса-Науэра (БНФ) - это чистое функциональное описание грамматики. А язык XPath - чистый функциональный. При этом и одно и второе могут быть инкапсулированы в проект на языке Java например который вобщем грязно-императивный. Тоесть в каких-то частях проекта мы сами исповедуем ФП.
Ответ написан
Комментировать
easimonenko
@easimonenko
Любитель
Ваши примера кода в обоих случаях в стиле ООП с классами. Привести пример ФП стиля для роутера Express вряд ли получится, так как Express написан в стиле ООП. Можно посмотреть на аналоги на других языках, таких как Haskell, Rust, Scheme.
Ответ написан
Комментировать
DollyPapper
@DollyPapper
Разница ИМХО в моделировании задачи. Парадигма у языка может быть не одна, но одна из тех которые язык поддерживает всегда превалирующая. Например в Java можно писать и в функциональном стиле, но большинство проектов это ООП подход.
Сама парадигма дает вам подход для моделирования и декомпозиции задачи. В ООП обьект декомпозиции это обьект, уж простите за тавтологию, в ФП обьект декомпозиции это фукнция. В ООП вы создаете обьект, возможно мутируете его состояние, вызываете у обьекта методы и вот это вот всё. В ФП у вас есть изначальные данные и они должны пройти через цепочку преобразований (вызовов функций) чтобы вычислить конечный результат, при этом изначальные данные не мутируются, и функция (в чистом ФП) всегда идемподентна, т.е. подавая на вход одни и те же данные мы получаем один и тот же результат, что в ООП и других подходах не всегда возможно, поскольку состояние обьекта например может поменять другая часть кода, например в другом потоке.
Когда говорят про функциональный стиль в JS это чаще всего вые**ны говорящего, потому что в жс просто понадергали фишек из ФП: декларативный подход к написанию кода, каррирование (которое чаще является частичным применением, а не каррированием), иммутабельность. А чисто ФПшный подход я ни разу в жизни если честно не встречал. Да и надо ли оно...
Ответ написан
Комментировать
Danov
@Danov
разработчик Windows Store
Метафоричный взгляд с высока, но без отражения полной сути:

ФП это код ДНК (DNA), программа роста/синтеза системы/организма

ООП это чертеж/схема системы/организма.

Система/организм предназначена для обработки/вычисления входного потока данных в выходной.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы