Pull to refresh

Comments 13

UFO just landed and posted this here
Данная реализация как раз и появилась из-за того, что вариант lodash не устраивал. Ну и вообще в последнее время я избегаю lodash — он очень недружественный к ФП
Это lodash недружественный? О_о

Первое что пришло в голову: нечисловые поля массива потеряются.

Второе что пришло в голову: рекурсивные объекты

Попробовал запустить:
deepClone({
  firstName: "John",
  lastName : "Doe",
  id       : 5566,
  fullName : function() {
    return this.firstName + " " + this.lastName;
  }
});
Упало c «InternalError: too much recursion»
Хочется узнать, что имеет ввиду автор под фп
ФП — это когда код запутанный и непонятный, вы не знали чтоли?
</sarcasm>
Постоянное копирование довольно труднозатратная операция (особенно в JS и особенно в ФП-стиле). Как насчет того чтобы задействовать copy-on-write?
function deepClone(source) {
	return ({
		'object': cloneObject,
		'function': cloneFunction
	}[typeof source] || clonePrimitive)(source)();
}
Боже, какой паттерн матчинг )))
Но так как, к сожалению, многие до сих пор не могут перестроить свое мышление с процедурщины и псевдо-ООП, я объясню...

Код, в первую очередь, должен выполнять свою функцию. А во вторую — он должен быть понятным. Хороший код не нужно объяснять, и это не зависит от привычек мышления.


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

Думаю, что это же самое можно было написать и на JavaScript, например так:


function deepClone(source) {
    const type = typeof source;
    let fnClone = (type === 'object') ? cloneObject
        : (type === 'function') ? cloneFunction
            : clonePrimitive;
    const fnWrap = fnClone(source);
    return fnWrap();
}
Как минимум было бы неплохи иметь какую-никакую типизированную документацию к таким функциям, например в стиле jsdoc. И не делать такие высоконагржуенные конвеерные функции, только для понимания добавить временные поясняющие равенства внутри.
Тфакже можно отказаться от ключевого function и arguments в пользу стрелочной (...args) =>
Sign up to leave a comment.

Articles