【问题标题】:Would having a Pure Class concept make sense or not?拥有纯阶级概念是否有意义?
【发布时间】:2020-02-12 18:11:50
【问题描述】:

我想知道纯类是否有意义(作为一个概念)?

例如,约束是:

  • 无继承(仅组合)

  • 所有依赖都在构造函数或方法中传递

例如:

class Elem {
  constructor(el) {
    this.el = el;
  }
  get html() {
    return this.el.innerHTML;
  }
  get cls() {
    return this.el.className.split(' ');
  }
  set cls(arr) {
    this.el.className(arr.join(' '));
  }
  hide() {
    this.el.style.display = 'none';
  }
}

const appEl = document.getElementById('app');
const app = new Elem(appEl);
app.cls = ['flex', 'h100'];
app.hide();

只是想知道这样的约束是否会增加类似于纯函数的好处?

更新

我认为上面的例子很糟糕,因为我猜this.el 住在其他地方(在 dom 中),但是呢:

class One {
  constructor() {
    this.val = 1;
  }
  add(val) {
    return this.val + val;
  }
}

const one = new One;
one.add(6);

【问题讨论】:

  • 在底层它们只是函数,JS 中不存在类,它只是语法糖。但要回答你的问题,是的,它可以提供一层抽象,通常这是一件好事..
  • 您提到的所有约束都与纯函数无关?此外,您的示例类绝对不是纯粹的,因为它的 cls setter 和 hide 方法会产生副作用。
  • 我想知道您是否可以考虑使类具有与纯函数相同的好处(更容易测试、更清晰等)的约束

标签: javascript node.js functional-programming


【解决方案1】:

使用函数并不能使您成为函数式程序员。您需要了解函数式编程试图实现的目标是什么。

例如一个纯函数:

  1. 不改变其参数
  2. 为相同的输入返回相同的输出
  3. 没有副作用

所以我听说一个类被转换为引擎盖下的函数......很好。他们会纯洁吗?视情况而定。

在您的特定情况下,它们不是。这是因为您正在使用的事物的性质:一个 DOM 元素。

您的.html() 方法几乎可以保证是不纯的,例如:

const el = document.querySelector('#foo');

const elem = new Elem(el);

elem.html();
//=> e.g. "foo"

el.innerHTML = "bar";

elem.html();
//=> "bar"

外部世界有权修改您的函数的行为。因此,您的函数是不纯的,因此您的类及其所有实例也是不纯的。

另一方面,你的班级也可以改变世界:

elem.cls = ['become-super-big'];

这可能会也可能不会使您的应用无法使用和/或与您应用的其他部分发生冲突。这绝对不是什么好事。

我个人尝试通过函数式编程实现的(相信我并不容易)是可预测性。您的系统及其较小的部分在相同情况下都应该具有可预测的行为。一直,一直。没有妥协。

你能有一个纯粹的类吗?有趣的问题!可能是。但恐怕肯定不是你接近它的方式。

【讨论】:

  • 是的,我明白这不仅仅是使用函数,我认为我的例子很糟糕
  • @TariqQubti 我觉得你的问题还是很有趣的!
  • 不访问其定义范围之外的变量”是什么意思?如果变量不在范围内,您当然无法访问它。
  • @customcommander 这与“不打算使用”的变量无关。这是关于变量(或其值)是可变的。访问任何变量,甚至是全局变量和窗口属性,只要它们是常量,都可以。另见here
  • 另外我认为“不会改变它的论点”可以被删除,因为它是由“#3 no side effects”暗示的,但当然假设每个读者知道“副作用”是什么意思。
猜你喜欢
  • 2016-06-13
  • 2019-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多