有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Optaplanner护士排班:为什么需要使用SkillExperience类,而不是在Employee类中嵌入技能变量?

在OptaPlanner护士排班示例中,有技能熟练程度课程:

public class SkillProficiency extends AbstractPersistable {

    private Employee employee;
    private Skill skill;

    public Employee getEmployee() {
        return employee;
    }

    public void setEmployee(Employee employee) {
        this.employee = employee;
    }

    public Skill getSkill() {
        return skill;
    }

    public void setSkill(Skill skill) {
        this.skill = skill;
    }

    @Override
    public String toString() {
        return employee + "-" + skill;
    }

}

以下是Employee类:

public class Employee extends AbstractPersistable {

    private String code;
    private String name;
    private Contract contract;

    private Map<ShiftDate, DayOffRequest> dayOffRequestMap;
    private Map<ShiftDate, DayOnRequest> dayOnRequestMap;
    private Map<Shift, ShiftOffRequest> shiftOffRequestMap;
    private Map<Shift, ShiftOnRequest> shiftOnRequestMap;

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Contract getContract() {
        return contract;
    }

    public void setContract(Contract contract) {
        this.contract = contract;
    }

    public int getWeekendLength() {
        return getContract().getWeekendLength();
    }

    public Map<ShiftDate, DayOffRequest> getDayOffRequestMap() {
        return dayOffRequestMap;
    }

    public void setDayOffRequestMap(Map<ShiftDate, DayOffRequest> dayOffRequestMap) {
        this.dayOffRequestMap = dayOffRequestMap;
    }

    public Map<ShiftDate, DayOnRequest> getDayOnRequestMap() {
        return dayOnRequestMap;
    }

    public void setDayOnRequestMap(Map<ShiftDate, DayOnRequest> dayOnRequestMap) {
        this.dayOnRequestMap = dayOnRequestMap;
    }

    public Map<Shift, ShiftOffRequest> getShiftOffRequestMap() {
        return shiftOffRequestMap;
    }

    public void setShiftOffRequestMap(Map<Shift, ShiftOffRequest> shiftOffRequestMap) {
        this.shiftOffRequestMap = shiftOffRequestMap;
    }

    public Map<Shift, ShiftOnRequest> getShiftOnRequestMap() {
        return shiftOnRequestMap;
    }

    public void setShiftOnRequestMap(Map<Shift, ShiftOnRequest> shiftOnRequestMap) {
        this.shiftOnRequestMap = shiftOnRequestMap;
    }

    public String getLabel() {
        return "Employee " + name;
    }

    @Override
    public String toString() {
        return code + "(" + name + ")";
    }

}

还有技能课:

public class Skill extends AbstractPersistable {

    private String code;

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    @Override
    public String toString() {
        return code;
    }

}

我想知道为什么它选择使用SkillExpertency类,而不是将技能变量嵌入Employee类中?如果我们嵌入它会更简单吗? 这个决定背后一定有很好的理由,但我就是搞不懂。如果有人知道,请与我分享。 而且,如果我在Employee类中嵌入技能变量,也可以吗?这样做会有什么不良影响? 谢谢和问候


共 (1) 个答案

  1. # 1 楼答案

    这真的是一个类图设计的选择。甚至可能是品味的问题

    员工与技能是一种多人关系(另见格鲁多夫的评论)。在这种情况下,我更喜欢将多个relationshap设计为一个类。这有几个优点:

    • 非常类似于它的表在关系数据库中的外观(这使得与JPA的集成可能更容易)
    • 可扩展性:如果在将来的某个时候,我们想要评估一名员工的技能,我们可以在SkillProficiency中添加一个字段int rating
    • 通常更容易维护模型一致性

    您可以轻松地扩展这个模型,在类Employee(和/或类Skill)上添加List<SkillProficiency> proficiencyList。我没有这么做的唯一原因是因为我还不需要它

    另一种设计(我不喜欢)是让类Employee有一个List<Skill>,而类Skill有一个List<Employee>。在OptaPlanner中没有任何东西阻止您使用该模型:我们不想强迫您做出设计决策。但我确实担心用这种模式写一个高效的记分卡可能会更难