IU_Sviridov
@IU_Sviridov
Развиваюсь в направлении web-разработки

Как улучшить модуль обработки дерева?

updateChildren(model, modes) {
        model.get('children').forEach(child => {
            if (child.has('children')) {
                modes.forEach(mode => this[mode.actionName](child, mode));
                this.applyTreeModes(child, modes);
            }
        });
    },

    setCollapsed(model, options) {
        const { value, expandedConfiguration, save, reqres } = options;
        const currentValue = (typeof value === 'boolean') ? value : NavigationItemFactory.getCollapsed(expandedConfiguration, model.get('id'));
        model.set('collapsed', currentValue);
        if (save) {
            reqres.request('configuration:collapsed:save', model);
        }
    },

    setCurrentEdited(model, options) {
        const { value } = options;
        model.set('currentEdited', value);
    },

    setChecked(model, options) {
        const { value } = options;
        model.set('checked', value);
    },

    setFilterChecked(model, options) {
        const { value, filter } = options;
        if (filter.length === 0 || filter.indexOf(model.get('id')) !== -1) {
            model.set('checked', value);
        }
    },

    formSelectedConfiguration(model, options) {
        const { selectedConfiguration } = options;
        if (model.get('checked')) {
            selectedConfiguration.push(model.get('id'));
        }
    }

Модуль для обработки древесной структуры.
Вынесен отдельно, требуется переиспользование кода.

async __editMode() {
        this.model.set('editMode', !this.model.get('editMode'));
        const editMode = this.model.get('editMode');

        if (editMode) {
            await this.reload({ editMode: editMode });
            TreeService.updateChildren(this.model, [
                { actionName: 'setFilterChecked', value: true, filter: this.configuration.selectedConfiguration || [] },
                { actionName: 'setCurrentEdited', value: true },
                { actionName: 'setCollapsed', value: false, save: true, reqres: this.reqres }
            ]);
        } else {
            const selectedConfiguration = [];

            TreeService.updateChildren(this.model, [
                { actionName: 'setCurrentEdited', value: false },
                { actionName: 'formSelectedConfiguration', selectedConfiguration }
            ]);
            this.__applyConfigurationChanges(selectedConfiguration, false);
        }
    }

Пример использования модуля.

Хотелось бы получить оценку с точки зрения:
- дальнейшей поддержки кода (другим разработчиком)
- масштабируемости
- скорости

Что происходит в модуле?
Нужно пройти по children и произвести действия с каждым child (операции не зависимы)
Передается узел дерева / массив. Для каждого child применяются все методы обработки из массива на 1 итерации DFS.

Массив содержит в себе:
- actionName для выбора метода обработки child
- options для child
  • Вопрос задан
  • 105 просмотров
Пригласить эксперта
Ответы на вопрос 1
@AlexHell
Это вот все не типизированное - ни конкретных классов\функций, а по имени передается 'setCurrentEdited' который текстовым поиском искать надо, и его опции value: false - плохо с точки зрения архитектуры

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

p.s. а еще model, modes - очень плохое название, во 1х это отличие всего в одном символе, и в теле метода будет путаница (ктото пропустит последнюю букву), вот чисто по опыту вам скажу
к тому же modes вообще не говорит что это за режим
лучше - actions

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

Войдите, чтобы написать ответ

Похожие вопросы
22 нояб. 2024, в 08:04
1 руб./за проект
22 нояб. 2024, в 06:06
1500 руб./в час
22 нояб. 2024, в 06:04
1 руб./за проект