我有一个带有类型为object的成员变量的类。该对象具有固定数量的字段。我正在尝试确定是否应该使用一个或多个setter函数来更改这些字段。
为使问题更具体,我编写了以下课程,以两种不同方式对简单的组织管理结构进行建模:
多个设置器功能
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);
一个设置器功能
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.会更好?
答案 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
类中。这样,代码使用更少的if
和switch
条件,更易于阅读,理解和进一步开发。