对具有不同功能的相同Java类进行数据建模的最佳方法

时间:2017-06-09 12:34:15

标签: java oop data-modeling

案例:

通常,产品对象具有以下属性:

  1. 名称
  2. 但是在促销周期间,虽然大多数产品仍然只有名称和价格作为属性,某些所选产品会获得额外的属性:

    • 颜色

    但是在推广周之后,这些先前推出的产品将失去其颜色属性并再次成为标准产品。

    当前实施:

    我有2个类 - >产品和产品推广

    public class Product {
    
        private String name;
        private BigDecimal price;
        private ProductPromotion promotion;
    
        public Product(String name, BigDecimal price) {
            this.name = name;
            this.price = price;
        }
    
        public void setProductPromotion(ProductPromotion promotion) {
            this.promotion = promotion;
        }
    }
    
    
    public class ProductPromotion {
    
        private Color color;
    
        public ProductPromotion (Color color) {
            this.color = color;
        }
    }
    

    如您所见,Product对ProductPromotion有单方面的参考。默认产品对象对其ProductPromotion具有空引用,而具有促销的产品,我只是执行:myproduct.setProductPromotion(new ProductPromotion(Color.RED));

    每当我决定myproduct的促销活动结束时,我就会: myproduct.setProductPromotion(null);

    我的问题:

    我不想为每个非推广产品提供对ProductPromotion的空引用,因为这种建模并不是很漂亮。我的意思是,如果占位符没有任何东西(至少对于非促销产品),我们为什么需要保留占位符。因此,我想请有经验的编码人员更好地实现此功能。

    进一步思考:

    根据您的意见和想法,我能够提出一种新的方法,我真的很欢迎您的想法:

    我会将ProductPromotion类拆分为默认版和升级版:

    public class ProductPromotion {
        private boolean promotionDisabled;
    
        public ProductPromotion() {
            setPromotionDisabled(true);
        }
    
        public boolean isPromotionDisabled () {
            return promotionDisabled;
        }
    
        public boolean setPromotionDisabled (boolean value) {
            promotionDisabled = value;
        }
    }
    
    public class ProductPromotionEnabled extends ProductPromotion {
        private Color color;
    
        public ProductPromotion (Color color) {
            super(false);
            this.color = color;
        }
    
        public Color getColor () {
            return color;
        }
    
        public void setColor(Color color) {
            this.color = color;
        }
    }
    

    所以我会创建一个类型为 ProductPromotion 的defaultPromotionObject,它引用了任何非提升对象。促销中的对象将指向类型为 ProductPromotionEnabled 的promoteEnabledObject。你对这个有什么看法?

2 个答案:

答案 0 :(得分:2)

类定义实体的属性和行为。 当我们进行私人" ProductPromotion促销"在类中的属性,这意味着所有产品都应该有促销,并且为了表明特定产品没有促销,我们在那里放置了空。

不应该这样。 实现这一目标的更好方法是删除"私人ProductPromotion促销" Product类和ProductPromotion类的属性应重命名为PromotedProduct。 PromotedProduct应该继承自Product,因此它将是具有促销的特定类型的产品。

通过这种方式,我们将有两个班级。 Product和PromotedProduct(特定类型的产品)然后我们可以使用多态来对产品列表进行操作。

代码:

public class Product {

    private String name;
    private BigDecimal price;

    public Product(String name, BigDecimal price) {
        this.name = name;
        this.price = price;
    }

}

public class PromotedProduct extends Product {

    private Color color;

    public PromotedProduct(String name, BigDecimal price ,Color color) {
        super(name ,price);
        this.color = color;
    }
}

Product product[3];
product[0] = new Product("keyboard",100);
product[1] = new PromotedProduct("stick", 80 ,Color.RED);

等等。

答案 1 :(得分:1)

使用班级Optional。这消除了null值,实际上你似乎想要这样的关系。

private Optional<ProductPromotion> promotion = Optional.empty();

promotion.ifPresent(promo -> promo...);

另一种方法是将产品映射到促销活动。