Могут ли чистые функции видоизменять другие свойства внутри своего класса контейнера с помощью `this`? - PullRequest
0 голосов
/ 14 января 2019

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

 class Car {
    color: string = 'red';
    make: string = 'Dodge';

    constructor() {}

    changeMake(newMake: string): string {
      this.color = 'blue';  // <-- Is this impure?
      return newMake;
    }
  }

Это нечисто? Почему или почему нет?

1 Ответ

0 голосов
/ 15 января 2019

Нет, вы не можете изменить свойства, так как это изменяет значение (объект), и это побочный эффект. Чистые методы могут предоставлять свои данные, но никогда не изменять их. Они могут создавать новые объекты, и тогда они считаются чистыми:

class Car {
    color: string;
    make: string;

    constructor(color = 'red', make = 'Dodge') {
        this.color = color; 
        this.make = make;
    }

    changeMake(newMake: string): Car {
        return new Car(this.color, newMake);
    }
}

При этом создается копия оригинальной машины с новой маркой, и, таким образом, в каждом месте, где использовался старый объект, все еще есть старый объект.

Действительно хорошим примером этого является класс Java String, который является чисто функциональным. Каждый метод, который возвращает String, который отличается, всегда возвращает вновь созданный. Весьма подвиг, если подумать, что он был задуман в золотой век ОО.

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