首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重新设计进度价值层次

重新设计进度价值层次
EN

Software Engineering用户
提问于 2016-05-15 15:54:03
回答 1查看 122关注 0票数 4

我有几个调度值类,它们表示计划对特定时隙的值。

首先,有用于二维调度的ScheduleValue类,其中第一个(行)是玩家,第二个(列)是时隙(当球员每场比赛时)。

我用公共静态ints表示不同的可能值,这就是用来实例化一个新ScheduleValue的方法:

代码语言:javascript
复制
public class ScheduleValue {
    public static int OCCUPIED = 1;
    public static int FREE = 2;
    public static int UNAVAILABLE = 3;
    public static int BREAK = 4;
    public static int LIMITED = 5;
    public static int NOT_IN_DOMAIN = 6;

    private int value;

    public ScheduleValue(int val) {
        value = val;
    }
}

但是,有一个特殊的值OCCUPIED,它要求传递一个整数,因此匹配位置所在的本地化(法院)由调度值表示。因此,我添加了另一个构造函数,并被迫添加控件以防止出现错误的状态:

代码语言:javascript
复制
public ScheduleValue(int val) {
    if (!(val >= OCCUPIED && val <= NOT_IN_DOMAIN))
        throw new IllegalArgumentException("Illegal value (" + val + ")");

    if (val == OCCUPIED)
        throw new IllegalArgumentException("A localization must be specified if the schedule value is OCCUPIED");

    value = val;
}

public ScheduleValue(int val, int l) {
    if (!(val >= OCCUPIED && val <= NOT_IN_DOMAIN))
        throw new IllegalArgumentException("Illegal value (" + val + ")");

    if (val != OCCUPIED)
        throw new IllegalArgumentException("Only schedule values of OCCUPIED can specify a localization");

    value = val;
    localization = l;
}

我真的不喜欢我这样做。必须抛出异常和检查值的方式(使用关系操作,而不是检查它们是否包含在允许的值列表中)。我怎么能重新设计呢?我是否应该仅仅为了保存本地化的值而创建一个ScheduleValueOccupied类?

然后,我还有一个LocalizationScheduleValue,它是为另一种类型的时间表创建的,其中第一个维度是进行比赛的局部化,而不是球员(因此矩阵是按时隙而不是按时隙进行的)。虽然它看起来很像ScheduleValue,但它甚至没有扩展到它:

代码语言:javascript
复制
public class LocalizationScheduleValue {
    public static int OCCUPIED = 1;
    public static int FREE = 2;
    public static int UNAVAILABLE = 3;
    public static int LIMITED = 4;
    public static int CONTINUATION = 5;
    private int value;
    private List<Integer> playersIndices;

    public LocalizationScheduleValue(int val) {
        if (!(val >= OCCUPIED && val <= CONTINUATION))
            throw new IllegalArgumentException("Illegal value (" + val + ")");

        if (val == OCCUPIED)
            throw new IllegalStateException("A match must be specified if the schedule value is OCCUPIED");

        value = val;
    }

    public LocalizationScheduleValue(int val, List<Integer> indices) {
        if (!(val >= OCCUPIED && val <= CONTINUATION))
            throw new IllegalArgumentException("Illegal value (" + val + ")");

        if (val != OCCUPIED)
            throw new IllegalStateException("Only schedule values of OCCUPIED can specify a match taking place");

        value = val;
        playersIndices = indices;
    }
}

我想更改这个类,以便它与ScheduleValue相关,但是我不知道如何更改这个类,因为我要提到的原因是。

我主要关心的是我在内部表示值的方式,我应该坚持整数,还是应该改为枚举呢?

然后,创建一个新的层次结构。如果我最后有一个ScheduleValueScheduleValueOccupiedLocalizationScheduleValueLocalizationScheduleValueOccupied,我如何表示所有可能的值?如果我使用in,我必须跟踪我在父程序中使用的数字,否则就会发生冲突;例如:

代码语言:javascript
复制
public class ScheduleValue {
    public static int OCCUPIED = 1;
    // ...
}

public class LocalizationScheduleValue extends ScheduleValue {
    public static int OCCUPIED = 1; // clash with parent here
    // ...
}

而如果我使用枚举,我如何才能继承其中的一部分,并附加一些更多的价值?示例:

代码语言:javascript
复制
public class ScheduleValue {
    protected enum Value { OCCUPIED, FREE, UNAVAILABLE, BREAK, LIMITED, NOT_IN_DOMAIN };
    // ...
}

public class LocalizationScheduleValue extends ScheduleValue {
    // I would only want OCCUPIED, FREE and UNAVAILABLE, but not the rest
    // and I would need to add to the possible values LIMITED and CONTINUATION
}

我对如何重组整件事情感到非常困惑,尤其是关于内部代表及其继承的问题。也有冗余的名字,我怎么能命名枚举呢?

也许我想得太多了,解决办法比我想象的要简单。我希望这是你说的一次,我怎么能不看到这个呢?

有什么建议吗?

EN

回答 1

Software Engineering用户

发布于 2016-05-15 20:38:57

您可以选择在示例中使用类而不是int或enum。(我没有用Java编程,所以如果语法错误请原谅)

代码语言:javascript
复制
public interface Value{
}
public interface LocalizationValue implements Value{
}
public class Occupied implements LocalizationValue{
}
public class Free implements LocalizationValue{
}
public class Limited implements Value{
}
//...

这样,您就可以确保构造器只能接受正确的类型:

代码语言:javascript
复制
public ScheduleValue( Value val ){ 
     //...
}
public LocalizationScheduleValue( LocalizationValue val ){
     //...
}

当然,您不应该只保留这个类为空。他们现在是真正的课程,应该开始承担一些责任。例如,让我们声明在代码库中有几个类似于此的if/ lets语句:

代码语言:javascript
复制
public void doSomething( Value val ){
    if( val == OCCUPIED ){
         doSomethingOccupied();
    else if( val == FREE ){
         soSomethingFree();
    }
    //...
}

现在不再需要这些开关了,因为您可以在值接口中定义doSomething()并在具体的类中实现它。

代码语言:javascript
复制
public interface Value{
    public void doSomething();
}
public class Occupied implements Value{
    public void doSomething(){
        //...
    }
}
public class Free implements Value{
    public void doSomething(){
        //...
    }
}
//...

public void doSomething( Value val ){
    val.doSomething();
}

当在值类中实现doSomething方法没有意义时,可以使用访问者模式提取它。我不会为此键入代码片段,但是如果您不知道,应该查找访问者模式。这样做更安全,因为如果要添加另一种值类型,编译器会一直抱怨,直到实现了正确的函数。

票数 1
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/318588

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档