Как стать автором
Обновить
9
66.2
Андрес Ковалев @andres_kovalev

Разработчик

Отправить сообщение
Любопытная статья. Автор проделал большую работу, за что заслуживает похвалы. Но
… что в первом случаи...

… благодаря обработки...

… есть пару моментов...

… к нам прийдет текстовый...

Может оттолкнуть многих (я, например, на каком-то подсознательном уровне не могу серьезно относиться к тексту, в котором неправильно склонены существительные). Попробуйте почистить статью от этого, так она станет намного лучше.
Например, нам нужно написать декорирующую функцию, которая будет считать количество вызовов какой-то функции. Это можно сделать весьма изящно с помощью NFE.

На мой взгляд, плохой пример — тут лучше подойдет замыкание. Поля вашей функции могут быть изменены извне:
const count = f => function df() {
    df.calls = (df.calls || 0) + 1;
    return f(...arguments);
};

const foo = count(console.log);
foo.calls = 100;
...
Компонент UserList изначально следовало разбить на компоненты UserList и UserListItem, а для поставленной задачи отображения полного имени замечательно подойдет соответствующий pipe, который очень легко переиспользовать, не создавая при этом «умные данные».
[http|https] и http[s] не эквиваленты. Наверное, Вы хотели написать (http|https).
Аналогично с состоянием. Вместо этого у автора пример стратегии. ИМХО, в качестве хорошего примера подойдет что-то детерминированное. Например, нам в университете замечательно иллюстрировали состояние на примере телефона:

// интерфейс-состояние
interface IPhoneState {
    pickUp():IPhoneState;
    hangUp():IPhoneState;
    dial():IPhoneState;
}

// несколько реализаций
class PhoneStateIdle implements IPhoneState {
    pickUp():IPhoneState {
        return new PhoneStatePickedUp();
    }
    hangUp():IPhoneState {
        throw new Exception("already idle");
    }
    dial():IPhoneState {
        throw new Exception("unable to dial in idle state");
    }
}

class PhoneStatePickedUp implements IPhoneState {
    pickUp():IPhoneState {
        throw new Exception("already picked up");
    }
    hangUp():IPhoneState {
        return new PhoneStateIdle();
    }
    dial():IPhoneState {
        return new PhoneStateCalling();
    }
}

class PhoneStateCalling implements IPhoneState {
    pickUp():IPhoneState {
        throw new Exception("already picked up");
    }
    hangUp():IPhoneState {
        return new PhoneStateIdle();
    }
    dial():IPhoneState {
        throw new Exception("already dialing");
    }
}

// автомат
class Phone {
    private IPhoneState state;

    constructor() {
        this.state = new PhoneStateIdle();
    }
    pickUp():void {
        this.state = this.state.pickUp();
    }
    hangUp():void {
        this.state = this.state.hangUp();
    }
    dial():void {
        this.state = this.state.dial();
    }
}


Лично меня особенно восхищает этот шаблон за его умение организовать ветвящуюся логику без if'ов.

Мне кажется, не очень правильно писать статью с объяснениями, в которых автор сам не уверен и путается (судя по комментариям). Можно кого-то научить чему-то плохому.
В статье действительно приведено два примера имеративного подхода, лишь на разном уровне абстракции.
Имхо, имеративный подход описывает алгоритм через последовательность действий, а декларвтивный использует набор деклараций.


Имеративно:


div = docoment.getElementById("#someid");
for(var i=0; i<=10; i++)
div.appendChild(document.createElement("span"));


Декларвтивно (псевдокод):


<div id="someid">
<for var="i" start="0" end="10">
<span><span>
</for>
</div>


Хорошим примером декларативных подходов являются HTML, XML+XSLT. Различные файлы конфигураций (package.json etc) тоже в своем роде декларативных программы. Jasonette — декларативных фреймворк.
Отличным примером декларативного подхода в императивных языках являются аннотации (декораторы):
Имеративно:


class MyAnalyser extends Analyse {

}

Object.seal(MyAnalyser.constructor);
Object.seal(MyAnalyser.constructor.prototype);


Декларативно:


@Sealed
class MyAnalyser extends Analyser {

}

Raf группирует анимации, чтобы избежать ненужных вычислений. Что Вы будете делать, когда у Вас таймеров будет 10? 100? Это как раз подвешивает интерфейс и нагружает систему даже в неактивных вкладках. А raf отработает тогда, когда нужно, за раз выполнит все анимации вместе с css трансформациями и будет экономить процессорное время для фоновых вкладок. В случае сильной аллергии на raf или необходимости поддерживать старые браузеры хотя бы нужно сделать один setInterval для обработки анимации и в нем выполнять все вычисления.

12 ...
7

Информация

В рейтинге
86-й
Откуда
Ухта, Коми, Россия
Дата рождения
Зарегистрирован
Активность