将javascript es6类转换为函数式编程风格

将javascript es6类转换为函数式编程风格,javascript,reactjs,class,functional-programming,es6-class,Javascript,Reactjs,Class,Functional Programming,Es6 Class,我有一个用reactjs编写的类,但我想使用函数编程而不是OOP转换为函数。有人告诉我怎么做吗?跟着我的课 import * as h from './hydraulic'; export default class verticalfloculator_diag { constructor (width, length, depth, npantalla, espaciamiento, espesor, pasos) { this.detention_time = 0;

我有一个用reactjs编写的类,但我想使用函数编程而不是OOP转换为函数。有人告诉我怎么做吗?跟着我的课

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)

}

最简单的方法是直接按名称导出各个函数,并为它们提供更多参数以替换类中存储的参数。例如

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

最简单的方法是直接按名称导出各个函数,并为它们提供更多参数以替换类中存储的参数。例如

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

另一种方法是创建“纯数据”絮凝器对象:

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
   };
}

另一种方法是创建“纯数据”絮凝器对象:

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
   };
}

您可以实现redux和react redux包,并使用无状态功能组件


redux允许您将所有状态和方法作为道具注入,因此您需要完整类组件的唯一方法是使用生命周期方法。

您可以实现redux和react redux包,并使用无状态功能组件



redux允许您将所有状态和方法作为道具注入,因此您需要完整类组件的唯一方法是使用生命周期方法。

谢谢,现在我理解得更好了。但是我如何对这些单独的函数进行分组呢?实际上,除了将它们放在它们自己的文件中之外,您不需要对它们进行分组。在javascript中,您可以只拥有函数并自行导出/导入它们;这更符合功能性风格,让你避免了大量的陈词滥调。我开始看到它的好处了。但仍有疑问。类絮凝器具有固定的物理值。我们创建了一个絮凝器,希望检查它的功能(参数)是否改变了流量q的值。让我用另一种方法添加另一个答案。谢谢,现在我理解得更好了。但是我如何对这些单独的函数进行分组呢?实际上,除了将它们放在它们自己的文件中之外,您不需要对它们进行分组。在javascript中,您可以只拥有函数并自行导出/导入它们;这更符合功能性风格,让你避免了大量的陈词滥调。我开始看到它的好处了。但仍有疑问。类絮凝器具有固定的物理值。我们创建了一个絮凝器,希望检查它的功能(参数)是否改变了流量q的值。让我用另一种方法添加另一个答案。到底是什么让你认为你当前的代码不起作用?他不是说他希望它“起作用”,他希望使用“功能编程风格”而不是“面向对象风格”。你为什么要避免对象?(这在JS中是不可能的)。对于像您这样的复杂结构,它们是最好的解决方案。您当前的解决方案有不变的数据,这就是所需要的。@DuncanThacker这是理解这个问题的一种方法,但我不太确定他是否只想更改方法/函数调用语法。@AlejandroA.E.Díaz我同意Bergi的说法,您已经有了一个函数式“程序—“避免使用对象”不是一件事;如果你听到有人说函数式程序不(或不能)使用对象,那么他们是错的,并且严重误解了函数式编程。到底是什么让你认为你当前的代码不起作用?他并不是说他希望它“起作用”,他想用“函数式编程风格”而不是“面向对象风格”。你为什么要避开对象?(这在JS中是不可能的)。对于像您这样的复杂结构,它们是最好的解决方案。您当前的解决方案有不变的数据,这就是所需要的。@DuncanThacker这是理解问题的一种方法,但我不确定他是否只想更改方法/函数调用语法。@AlejandroA.E.Díaz我同意Bergi的观点,您已经有了一个“功能性”程序—“避免使用对象”不是一件事;如果你听过有人说函数式程序不(或不能)使用对象,那么他们是错误的,并且严重误解了函数式程序的完美性。我喜欢这种方式。很高兴听到!我的编程教育主要是OOP(C++,Java),因此需要一段时间来适应没有类的结构,但现在通常更喜欢FP风格(ReactJS使其更容易实现)。“现在我不需要重复这个。我可以一直将函数的结果分配给可以在其他函数中使用的值。”。哈哈!另一个皈依者:DDon不要用“纯数据对象”之类的词组;这不是真的——在对象中使用函数作为数据成员也没什么错——函数也可以是数据完美的。我喜欢这种方式。很高兴听到!我的编程教育主要是OOP(C++,Java),因此需要一段时间来适应没有类的结构,但现在通常更喜欢FP风格(ReactJS使其更容易实现)。“现在我不需要重复这个。我可以一直将函数的结果分配给可以在其他函数中使用的值。”。哈哈!另一个皈依者:DDon不要用“纯数据对象”之类的词组;这不是一件真实的事情——将函数作为对象中的数据成员也没有错——函数也可以是数据