Имеет ли смысл концепция Pure Class или нет? - PullRequest
0 голосов
/ 12 февраля 2020

Мне было интересно, имеют ли смысл чистые классы (как концепция)?

Например, ограничения будут:

  • Нет наследования (только состав)

  • Все зависимости передаются в конструктор или методы

Например:

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 живет где-то еще, я думаю (в Доме ) а как же:

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

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

1 Ответ

2 голосов
/ 12 февраля 2020

Использование функций не делает вас функциональным программистом. Вам нужно понять, чего добивается функциональное программирование.

Например, чистая функция:

  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'];

Это может или не может сделать ваше приложение непригоден к использованию и / или конфликтует с другими частями вашего приложения. Это определенно не очень хорошая вещь.

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

Можете ли вы иметь чистый класс? Интересный вопрос! Может быть. Боюсь, конечно, не так, как ты к нему подходишь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...