0

我的应用程序有一个设计问题。

我有一个产品和一个类别。两者都必须有身份证。

类别可以有任何正整数作为 ID。(-> 身份等级)

产品必须有一个介于 8 和 13 个密码之间的正整数作为 ID。(-> Ean 级)

因为这是这些类做的唯一事情(创建一个 id)和一个带有正确检查的 getter/setter。

为了减少代码(DRY),我让 Ean 从 Id 继承。但这不会违反 Liskov (LSP) 吗?

我的问题:

  1. 我的 LSP 推理是否正确?如果是:
  2. 我应该通过创建界面来解决它吗?(似乎是重复的代码)还是有其他解决方案?

提前致谢!

标识符.java

public class Identifier {

    private Long id = 1000000000000L;

    public Identifier(){

    }

    public Identifier(Long id){
        setId(id);
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

}

Ean.java

public class Ean extends Identifier {

    private final static int MIN_AMOUNT_OF_CIPHERS = 8;

    private final static int MAX_AMOUNT_OF_CIPHERS = 13;

    private final static String ERROR_EAN_LENGTH = "err_ean_length";

    public Ean() {
    }

    public Ean(Long ean) throws DomainException {
        setEan(ean);
    }

    public Long getEan() {
        return getId();
    }

    public void setEan(Long ean) throws DomainException {
        if (String.valueOf(ean).length() < MIN_AMOUNT_OF_CIPHERS
                || String.valueOf(ean).length() > MAX_AMOUNT_OF_CIPHERS) {
            throw new DomainException(ERROR_EAN_LENGTH);
        }
        setId(ean);
}
4

1 回答 1

0

我的 LSP 推理是否正确?

答案:没有

看起来任何接受 Id 的地方,一个 Ean 实例都是有效的,对吧?这就是 LSP 的全部意义所在。那是因为 Ean 是有效 ID 的子集。任何 Ean 都是有效的 Id,但并非总是如此。

我应该通过创建界面来解决它吗?(似乎是重复的代码)还是有其他解决方案?

你可以有一个接口和两个特定的实现(Id 和 Ean)。我可能会这样做,因为对我来说没有理由制作 Ean 子类 ID。两者都可以实现一个旨在用作标识符单元的接口。

编辑: 继承模型中的问题是,如果您调用从父类继承的 setId() 方法,Ean 实例可能会不一致。

于 2015-02-01T17:39:06.467 回答