OOAD的设计问题(OOAD Design issue)

2019-09-01 21:04发布

我有两个表: tblCustomertblProduct

tblCustomer:
    Id: Integer, auto-increament
    Name: Varchar(30)
    ....

tblProduct
    Id: Integer, auto-increament
    Name: Varchar(50)
    customerId: Integer
    ....

而两大类: CustomerProduct

public class Product
{
    private int id;
    private int name;
    /* Other stuffs */
}

public class Customer 
{
    private int id;
    private String name;
    private String phoneNumber;

    /* get-set and others stuffs */

    public static boolean add(Customer cus) {
        /* This is for insert a customer to tblCustomer */
    }

    public boolean addProduct(Product pd) {
        /* This is for insert a product to tblProduct with current customer Id */
    }
}

当用户注册账号,它调用:

Customer cus = new Customer(/* ... */);
Customer.add(cus);

当客户购买一个产品:

Product pd = new Product(/* ... */);
currentCustomer.addProduct(pd);

但是我的老师说,这不是正确的OOAD(甚至OOP),因为Customer.addProduct是操作tblProduct表,是不是? 什么是好的设计对于这种情况?

**更新:**产品都还没有预先定义的,当客户购买产品,商店将使它和交付客户,于是两个同样的产品是罕见的发生,所以是tblCustomerProduct需要什么?

Answer 1:

添加一个DAO层,将包含这些方法的逻辑部分savedeleteupdate等。

下面是我平时做:

  • basepackage.domain :包含所有实体( 只有数据,没有逻辑的一部分 -在你的情况下, ProductCustomer
  • basepackage.dao :包含所有的DAO, 仅用于访问数据 ,每个实体基本上一个,每一个含有的方法,例如findAll() : List<E> findOne(K id) : Esave(E e) : void等。
  • basepackage.service :包含所有服务, 应用程序的逻辑部分 。 该服务是调用DAO的唯一的问题。
  • basepackage.presentation (或basepackage.web用于web应用程序):包含HMI / Web服务/ ...实施。


Answer 2:

你的老师大概意思是,你需要第三个表,名字类似“CustomerProduct”。 此表包含客户和产品,他们已经买之间的联系。

tblCustomerProduct:
    Id: Integer, auto-increament
    CustomerId: Varchar(30)
    ProductId: Varchar(30)

所以,当客户购买产品,你这个数据添加到表CustomerProduct。 这将删除冗余数据,也使删除容易得多



Answer 3:

你的老师是对的。 这是不好的设计,因为你创建一个类应该是凝聚力。 所以,它应该是负责做,它可以做的事情。 在这里,你的产品类,你已经添加客户ID,其本质上是一种不好的做法,因为客户可以购买多个产品。 这样的设计在这种情况下失败。 而且产品类不需要知道客户什么。 所有它必须知道的是自己。

客户与产品之间的关系可表示为“客户购买产品”的关联。 因此,该客户ID不应该出现在产品表。

关于currentCustomer.addProduct(pd); 方法,它不是很适合,因为它更适合于产品类,而不是客户类。

简单的解决问题的方法可以创建一个新的类,它可以涉及产品和客户。

对于如

CustomerProduct

customerid
productid

这个类里面你可以像“AddProductForCustomer” Add方法,可以写你的数据库逻辑将保持一致性。

希望这将清除您的疑问。



Answer 4:

在该表中,用户被分配到一个产品,而是在方法你给客户,并添加产品。

所以,我会去为任何一个方法pd.setCustomer(currentCustomer),而不是currentCustomer.addProduct(PD)

还是在产品表中的客户字段更改为一个产品领域中的客户表。



文章来源: OOAD Design issue
标签: java oop ooad