Лучше иметь один метод установки или несколько для объектов с фиксированным количеством полей? - PullRequest
0 голосов
/ 12 февраля 2019

У меня есть класс с переменной-членом типа object.Этот объект имеет фиксированное количество полей.Я пытаюсь решить, использовать ли мне одну или несколько функций-сеттеров для изменения этих полей.

Чтобы сделать вопрос более конкретным, я написал следующий класс для моделирования простой организационной структуры управления в двух разныхспособы:

  1. Функции множественного задания

    class Management {
        constructor() {
            this.numberOfManagers = 100;
            this.salaryDetails = {
                regionalManagerSalary: 80000,
                stateManagerSalary: 110000,
                executiveManagerSalary: 200000
            };
        }
    
        setRegionalManagerSalary(salary) {
            this.salaryDetails.regionalManagerSalary = salary;
        }
    
        setStateManagerSalary(salary) {
            this.salaryDetails.stateManagerSalary = salary;
        }  
    
        setExecutiveManagerSalary(salary) {
            this.salaryDetails.executiveManagerSalary = salary;
        }
    }
    
    const management = new Management();
    management.setRegionalManagerSalary(100000);
    management.setStateManagerSalary(120000);
    management.setExecutiveManagerSalary(210000);
    
  2. Функция одного задания

    class Management {
        constructor() {
            this.numberOfManagers = 100;
            this.salaryDetails = {
                regionalManagerSalary: 80000,
                stateManagerSalary: 110000,
                executiveManagerSalary: 200000
            };
        }
    
        setManagerSalary(typeOfManagerSalary, salary) {
            this.salaryDetails[typeOfManagerSalary] = salary;
        }
    }
    
    const management = new Management();
    management.setManagerSalary('regionalManagerSalary', 100000);
    management.setManagerSalary('stateManagerSalary', 120000);
    management.setManagerSalary('executiveManagerSalary', 210000);
    

Будет ли реализация 1. лучше или реализация 2. лучше?

Ответы [ 3 ]

0 голосов
/ 12 февраля 2019

Я всегда буду рассматривать подход с более высокой читабельностью, если он не компенсирует большую читабельность.Второй более общий, но первый более понятный.

Так что я думаю, что первый лучше, так как более ясно, что в salaryDetails есть только 3 поля.Просто подумайте, что вы не автор, и когда вы видите второе, вы не представляете, сколько полей будет в salaryDetails, так как кто-то может просто вызвать management.setManagerSalary('someNewSalary', 100000); где-нибудь, чтобы добавить несколько новых полей.

Если у вас нет более одного объекта управления и у каждого из них могут быть определенные поля в salaryDetails, я не думаю, что второй подход лучше.

0 голосов
/ 12 февраля 2019

Лучше вообще не иметь никакого сеттера.Инициализируйте все необходимые свойства в конструкторе (пусть конструктору потребуются аргументы для этого).

Код, который вы разместили, не ООП, а замаскированный процедурный код.Если вы хотите сделать его ООП, тогда код должен оставаться там, где находятся данные, то есть в классе.

В качестве первого шага улучшения ваш код должен выглядеть следующим образом:

class Management {
    constructor(nb, regionalSalary, stateSalary, executiveSalary) {
        this.numberOfManagers = nb;
        this.salaryDetails = {
            regionalManagerSalary: regionalSalary,
            stateManagerSalary: stateSalary,
            executiveManagerSalary: executiveSalary
        };
    }
}

const management = new Management(100, 100000, 120000, 210000);

Короче, намного чище, меньше подвержено ошибкам.

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

Более понятный дизайн - использование отдельных классов для каждого типа менеджера:

/* abstract */ class Manager {
    constructor(salary) {
        this.salary = salary;
    }
}

class RegionalManager extends Manager { }
class StateManager extends Manager { }
class ExecutiveManager extends Manager { }

class Management {
    constructor(nb, regionalManager, stateManger, executiveManager) {
        this.numberOfManagers = nb;
        this.managers = {
            regionalManager: regionaManager,
            stateManager: stateManager,
            executiveManager: executiveManager
        };
    }
}

const management = new Management(
    100,
    new RegionalManager(100000),
    new StateManager(120000),
    new ExecutiveManager(210000)
);

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

0 голосов
/ 12 февраля 2019

Я бы рекомендовал иметь один метод, скажем, setSalaryDetails, который будет принимать объект зарплаты в качестве входных данных, которые вы можете установить напрямую.Что-то вроде -

setSalaryDetails (salaryDetails) {this.salaryDetails = salaryDetails;}

Когда вы вызываете этот метод, вы можете соответствующим образом создать этот объект с теми полями, которые вы передадите ему.

...