在OptaPlanner护士名册示例中,有SkillProficiency类:

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;
    }

}

我想知道为什么选择使用SkillProficiency类而不是将Skill变量嵌入Employee类中? 如果我们嵌入它会更简单吗? 这个决定背后一定有充分的理由,但是我无法弄清楚。 如果有人知道,请与我分享。 而且,是否可以将技能变量嵌入Employee类中? 这样做的不良后果是什么? 谢谢并恭祝安康。

#1楼 票数:2 已采纳

确实是类图设计的选择。 甚至是口味问题。

员工对技能的关系是多对多的关系(另请参见grudolf的评论)。 在这种情况下,我也希望将ManyToMany关系hapshap设计为一个类。 这有一些优点:

  • 与表在关系数据库中的外观非常相似(这使得与JPA的集成可能更容易)
  • 可扩展性:如果将来要对员工的技能进行评分,可以在SkillProficiency添加一个字段int rating
  • 通常更容易断言模型一致性。

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

另一种设计(我不喜欢)是让Employee类具有List<Skill>Skill类具有List<Employee> OptaPlanner中没有阻止您使用该模型的任何内容:我们不想强加您进行设计决策。 但是我确实担心使用该模型编写有效的scoreDRL可能会更加困难...

  ask by the.wizard translate from so

未解决问题?本站智能推荐:

1回复

使用 OptaPlanner 的组件测试类

我有一个组件,其中包括使用 OptaPlanner。 我们使用 junit 进行组件/集成测试,并且在运行测试时我在创建 bean 时遇到了问题。 运行我的测试时,我收到以下错误... 我使用 optaplanner-spring-boot-starter 通常会创建一个 SolveManag
1回复

OptaPlanner具有链接变量的多个实体类

我正在使用OptaPlanner解决车辆路径问题的一种变体,在该问题中,车辆所服务的客户需求有很大不同。 我有一些最常见的客户类型,并希望使用不同的实体类对它们进行建模。 由于单个驾驶员可能会参加不同的类型,因此他们应该能够与所有类的实例一起形成异构链。 我试图通过修改VRP示例来进行
1回复

使用 Optaplanner 的 SolverManager 时是否需要配置 xml 或 drools drl 文件?

我正在使用 optaplanner spring boot starter 来解决员工排班问题。 我有 2 个班级,Employee 和一个计划实体 Shift。 目前,我正在使用如下所示的约束提供程序根据员工的技能水平为他们分配班次。 我通过 JSON 将轮班和员工列表传递给控制器​​,然后控
1回复

OptaPlanner输入错误:想要使用数据库而不是XML

我正在使用OptaPlanner而不是从XML接收输入来为某事创建调度计划,我试图直接从dB导入数据,但是它仍在搜索XML输入,这可能是什么原因以及如何实现更正的
1回复

OptaPlanner:我可以对两个变量使用自定义的changeMove吗?

我有两个变量:期间和房间。 他们中的一些人受到特殊演讲的限制。 不允许进行某些更改,所以我需要自定义changeMove。 我已经检查了示例。 但是课程设置没有这种情况。 我应该写两个changemove类吗? periodChangeMove和roomChangeMov
1回复

Optaplanner-流口水使用旧的阴影变量

我正在使用VRP问题示例进行一些更改。 一种是计算所有任务的到达时间和目的地时间。 另一个原因是某些任务对具有相同的到达时间。 在更新到达时间之后,我“移动”了并行任务-并更改了它们的日期。 因此移动步骤可以更改另一辆车上任务的阴影变量。 但是流口水的规则验证两个任务的到达是否相同
1回复

使用Optaplanner解决VRPTWPD

我是optaplanner的新手,我希望用它来解决拾取和交付的VRPTW问题(VRPTWPD)。 我首先从示例repo中获取VRPTW代码 。 我想添加它来解决我的问题。 但是,我无法返回一个符合优先级/车辆限制的解决方案(必须在交付之前完成拾取,并且两者都必须由同一车辆完成)。
2回复

optaplanner护士调度系统中的XML文件可以实时与前台交互

我正在使用您的optaplanner作为医生调度系统。 我有一个问题问你: 我使用optaplanner作为后端系统,通过PHP将XML文件传递给optaplanner,并通过optaplanner将计算出的XML结果返回给PHP后端系统。 现在我希望医生能够实时查看网页上的变化。