当前位置: 首页 > 知识库问答 >
问题:

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

莫乐
2023-03-14

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

}

以下是员工类别:

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

}

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

共有1个答案

金宣
2023-03-14

这实际上是一个类图设计选择。甚至可能是品味问题。

员工到技能是一种ManyTo多名关系(另请参阅grudolf的评论)。在这种情况下,我更喜欢将ManyTo多名关系形状设计为一个类。这有几个优点:

  • 非常类似于它的表在关系数据库中的外观(这使得与JPA的集成可能更容易)

您可以轻松地扩展此模型以添加列表

另一种设计(我不喜欢)是让类员工有一个列表

 类似资料:
  • 问题内容: 什么时候嵌套类可行?我看到的最常见的优点是“共享范围”(跨类使用变量)。 这是否比仅将嵌套类放入其自己的文件中并通过构造函数传递参数更具吸引力/最佳实践少? 问题答案: 使用嵌套类的原因有很多,其中包括: 这是一种对仅在一个地方使用的类进行 逻辑分组 的方法。 它增加了 封装 。 嵌套类可以导致更具 可读性和可维护性的代码 。 子级到父级的连接更为简单,因为它 直观地说明 了每个类的变

  • OptaPlanner是在马拉维一家医院工作时发现的,它非常适合解决这个问题。一些新手问题: 1) 我看不到一种轻松进入假期的方法(除了多天的休假请求),可以看看如何添加这一点,但不希望重新发明轮子。 2) 我看不出有什么办法可以增加一个限制,让护士在上夜班之前Rest一天,在上夜班之后Rest两天(只有两班,白天和晚上)。我很感激地收到了任何建议,不知道从哪里开始。 非常感谢

  • 问题内容: 我在说Java语言。 变量“ this”在类内部使用时,指的是该类的当前实例,这意味着您不能在静态方法中使用“ this”。 但是,“超”在类内部使用时,是指该类的超类,而不是超类的实例,这意味着您可以在静态方法中使用“超”。但是事实证明你做不到。 一个可能的解释是说“超级”也指的是超类的一个实例,但我不知道为什么它应该… 问题答案: 这是JLS中有关关键字的部分: http://do

  • 我遵循这个例子,让我的页脚停留在我的网站底部。 它正在工作,但我需要用style

  • 我正在从这个url阅读Spring Hibernate CRUD教程 http://viralpatel.net/blogs/spring3-mvc-hibernate-maven-tutorial-eclipse-example/ 请任何人告诉我为什么在ContactController中。java,接口是自动连接的,而不是类ContactServiceImpl。 类似地,在接口被注入。我们不应

  • 我的朋友们,我的项目有三节课 主类: 首先,当我在类中实例时,java使结构如下所示:structure 我的意思是,当我们在类中实例类时,java逐行读取类,例如: 因为中有3个变量,所以我们可以说,当我们实例类时,我们有5个变量。 例如,我们有字符串、int、int、int、int来表示。我的问题是为什么我们不能直接访问或或? 例如,对于initialize name,我们可以使用以下代码:,