1 Вопрос: Каков наилучший способ преобразования классов ООП в функции FP?

вопрос создан в Thu, May 2, 2019 12:00 AM

Я нашел репозиторий GitHub, полный алгоритмов JavaScript и типов данных. Дело в том, что все написано в ООП. Я сам предпочитаю более FP подход с использованием небольших, многократно используемых функций. Каковы некоторые рекомендации по преобразованию классов в более мелкие расходуемые функции?

А пока я могу привести следующий рабочий пример. Это путь?

OOP:

class LinkedListNode {
  constructor(value, next = null) {
    this.value = value;
    this.next = next;
  }

  toString(callback) {
    return callback ? callback(this.value) : `${this.value}`;
  }
}

FP:

function toString(value, callback) {
  return callback ? callback(value) : `${value}`;
}

function Node(value, next = null) {
  return {
    value,
    next,
    toString(callback) {
      return toString(value, callback);
    }
  };
}
    
0
  1. Я думаю, вы неправильно понимаете различие между функциональным и объектно-ориентированным программированием. Хотя я определенно предпочитаю вторую версию вашего кода первой, это связано с ее превосходной инкапсуляцией. Простой переход от конструктора к фабрике не приводит к изменению функциональности.
    2019-05-02 15: 10: 04Z
  2. Что ж, вся моя кодовая база написана функционально. Я не хочу добавлять один класс для реализации нового типа данных, это кажется немного неуместным? Кроме того, это позволяет мне использовать toString везде, где я хочу, без зависимости от структуры данных.
    2019-05-02 15: 10: 18Z
  3. @ VeraPerrone Я согласен, что «функциональный» стиль имеет тенденцию давать более многократно используемый (и, что важно, тестируемый код), но переход от класса к классу не дает вам этого , Однако это не относится к вашему примеру, потому что вы можете легко использовать автономную версию toString для реализации метода class, так же как вы делали это для реализации метода объектного литерала.
    2019-05-02 15: 20: 30Z
  4. @ VeraPerrone Хотя это и не является исчерпывающим определением, FP в первую очередь касается использования программных абстракций высшего порядка, преобразования неизменяемых значений и исключения подходов, основанных на наследовании. Однако в JavaScript сами классы могут быть более высокого порядка.
    2019-05-02 15: 24: 42Z
  5. По сути это не плохой вопрос, но он слишком широк для стекового потока. Краткий ответ без объяснений: золотое правило FP - отделять логику от кода, который выполняет побочные эффекты (например, доступ DOM). Логика должна быть чистой: любое преобразование данных должно возвращать новое значение, а не изменять оригинал. Вы можете сделать все это с помощью классов (функциональное программирование Google на Java), но это неудобно и добавляет множество ненужных шаблонов в JS. Чтобы объяснить, почему все эти пункты являются ценными, нужно взять книгу, но вы можете начать 2019-05-03 11: 57: 39Z
1 ответ                              1                         

Во втором примере у вас все еще есть метод, прикрепленный к каждому экземпляру, который не идеален, если вы хотите повторно использовать этот метод на совместимом интерфейсе. Также он не очень хорошо работает со многими библиотеками FP js.

Чтобы было ясно, что это не функция конструктора, начните с нижнего регистра и добавьте префикс, например, например, create.

Сделайте функции максимально чистыми и не смешивайте логику композиции кода (составьте, карри) с бизнес-логикой. (Я говорю о обратном вызове, не имеющем ничего общего с toString)

Я добавляю экспорт, чтобы четко показать, что нужно экспортировать как минимум 2 функции.

export { nodeToString, createNode };

function nodeToString(node) {
  return `${node.value}`;
}

function createNode(value, next = null) {
  return {
    value,
    next
  };
}

Это будет использовано так

import { nodeToString, createNode } from "./x.js";

const node = createNode(`myvalue`);
const string = nodeToString(node);
    
1
2019-05-14 19: 36: 37Z
источник размещен Вот