对于具有固定字段数的对象,最好使用一个setter方法或多个方法?

时间:2019-02-12 02:47:06

标签: javascript architecture readability maintainability

我有一个带有类型为object的成员变量的类。该对象具有固定数量的字段。我正在尝试确定是否应该使用一个或多个setter函数来更改这些字段。

为使问题更具体,我编写了以下课程,以两种不同方式对简单的组织管理结构进行建模:

  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 :(得分:0)

我的建议是有一个方法说setSalaryDetails,它将薪水对象作为输入,您可以直接设置。像-

setSalaryDetails(salaryDetails){this.salaryDetails =工资细节; }

调用此方法时,可以使用将传递给它的那些字段集来适当地创建该对象。

答案 1 :(得分:0)

如果可读性不高,我将始终考虑采用更高的可读性方法。第二个更通用,但第一个更清晰。

所以我认为第一个更好,因为更清楚的是salaryDetails中只有3个字段。只需考虑您不是作者,当您看到第二个作者时,您不知道salaryDetails中将有多少个字段,因为有人可以在某个地方致电management.setManagerSalary('someNewSalary', 100000);来添加一些新字段。

除非您有多个管理对象,并且每个对象可能在salaryDetails下都有特定的字段,否则我认为第二种方法不会更好。

答案 2 :(得分:0)

最好完全没有二传手。初始化构造函数中的所有必需属性(让构造函数为此提供参数)。

您发布的代码不是OOP,而是伪装的过程代码。如果要使其成为OOP,则代码必须保留在数据所在的位置,即在类中。

作为第一步改进,您的代码应如下所示:

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类中。这样,代码使用更少的ifswitch条件,更易于阅读,理解和进一步开发。