Преобразовать класс javascript es6 в стиль функционального программирования

У меня есть класс, который пишет в реагировать, но хотел бы преобразовать в функцию с использованием функционального программирования, а не ООП. Кто-нибудь скажи мне, как? Следуй за моим классом.

import * as h from './hydraulic';

export default class verticalfloculator_diag {
  constructor (width, length, depth, npantalla, espaciamiento, espesor, pasos) {
    this.detention_time = 0;
    this.ancho = width
    this.largo = length
    this.profundidad = depth
    this.npantalla = npantalla
    this.espaciamiento_pantallas = espaciamiento
    this.espesor_pantallas = espesor
    this.alto_pasos = pasos
    this.area_entrepantallas = this.espaciamiento_pantallas * this.ancho
    this.volumen = this.ancho * this.profundidad * this.largo
    this.radiohidraulico = h.radio_hydraulico(this.area_entrepantallas, 2 * (this.ancho + this.espaciamiento_pantallas))
    this.anchohueco = 0.3
    this.altohueco = 0.2
  }


  Q = (q) => h.q_m3s(q);
  tiempo = (q) => this.volumen / this.Q(q);  // en m3
  velocidad_canales = (q) => h.velocity(this.Q(q), (this.area_entrepantallas));
  velocidad_pasos = (q) => h.velocity(this.Q(q), (this.alto_pasos * this.ancho));
  velocidad_huecos = (q) => h.velocity(this.Q(q), (this.altohueco * this.anchohueco));
  perdidascanales = (q) => h.perdidas_canales(0.013, this.velocidad_canales(this.Q(q)), this.radiohidraulico);
  perdidasenvueltas = (q) => ((this.npantalla + 1) * Math.pow (this.velocidad_canales(q),2) + (this.npantalla) * Math.pow(this.velocidad_pasos(q),2))/2/9.81
  perdidasenhuecos = (q) => Math.pow(this.velocidad_huecos(q),2)/2/9.81
  perdidastotales = (q) => this.perdidascanales(q) + this.perdidasenvueltas(q) + this.perdidasenhuecos(q)

}

3 ответа

Решение

Альтернативный подход заключается в создании объекта флоккулятора "чистые данные":

const myFlocculator = {
    volumen: 10,
    ancho: 50
    //etc
};

и передать его в каждую функцию, которая отделяет вашу модель данных от вашей бизнес-логики в хорошем стиле FP:

export const tiempo = (floculator, q) => floculator.volumen / Q(q);

который вы называете так:

const t = tiempo( myFlocculator, q );

Так что теперь вы можете создавать любое количество функций, которые понимают, как работать с данными флоккулятора, не связывая их в классе. Если вы хотите, вы можете даже иметь функцию, похожую на конструктор:

function createFloculator( width, length, depth, npantalla, espaciamiento, espesor, pasos) {
   return {
      ancho: width,
      large: length, 
      //etc
   };
}

Самый простой способ - просто экспортировать отдельные функции напрямую по имени и дать им больше параметров, чтобы заменить сохраненные из класса. Например

export const Q = q => h.q_m3s(q); // or possibly even just Q = h.q_m3s
export const tiempo = (q, volumen) => volumen / Q(q);

Вы можете реализовать пакеты redux и response-redux и использовать функциональные компоненты без сохранения состояния.

redux позволяет вам вводить все ваши состояния и методы как реквизиты, поэтому единственный способ, которым вам понадобится полный компонент класса, - это метод жизненного цикла.

Другие вопросы по тегам