Можно ли считать функциональный компонент чистым, если он имеет внутреннее изменяемое состояние?

Рассмотрим функциональный компонент с изменяемым внутренним состоянием:

const FComponent = (options: any)  => {
     let privateID = '0000';

     return {
          ...{ // Public fields
               name: 'component'
          },
          ...{ // Public methods
               setPrivateID: (id: string) => {
                    privateID = id;
               }
          }
     }
};

FComponent({}).setPrivateID('0001');

Должен ли я вернуть новый компонент с запрошенным идентификатором?

Что-то вроде этого ? Я полагаю, функтор? https://medium.com/javascript-scene/functors-categories-61e031bac53f

const FComponent = (options: {id: string})  => {
     return {
          ...{
               name: 'component'
          },
          ...{
               privateID: (id: string) => {
                    return FComponent({id})
               }
          }
     }
};


person millsp    schedule 12.01.2019    source источник
comment
См. stackoverflow.com /questions/31722181/... если внутреннее состояние ненаблюдаемо извне, вы можете изменить его и по-прежнему считать функцию чистой. Из приведенного выше кода не похоже, что кто-либо может получить частный идентификатор.   -  person jcalz    schedule 13.01.2019


Ответы (1)


Функция, которая изменяет состояние, не является чистой, поскольку изменяющееся состояние является побочным эффектом.

Вторая версия не изменяет состояние, а создает новый объект. Вот как работает класс String в Java, который является чисто функциональным.

person Sylwester    schedule 12.01.2019