首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OOAD设计问题

OOAD设计问题
EN

Stack Overflow用户
提问于 2013-05-03 17:51:07
回答 4查看 317关注 0票数 0

我有两个表:tblCustomertblProduct

代码语言:javascript
复制
tblCustomer:
    Id: Integer, auto-increament
    Name: Varchar(30)
    ....

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

和两个类:CustomerProduct

代码语言:javascript
复制
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 */
    }
}

当客户注册帐户时,它调用:

代码语言:javascript
复制
Customer cus = new Customer(/* ... */);
Customer.add(cus);

当客户购买产品时:

代码语言:javascript
复制
Product pd = new Product(/* ... */);
currentCustomer.addProduct(pd);

但是我的老师说在面向对象的程序设计(甚至是面向对象程序设计)中是不正确的,因为Customer.addProduct是在tblProduct表上操作的,对吗?对于这种情况,什么是好的设计?

**更新:**产品还没有预定义,当客户购买产品时,商店会制作产品并交付给客户,所以很少发生两个相同的产品,那么tblCustomerProduct需要吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-05-03 17:55:51

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

这是我通常的做法:

  • basepackage.domain:包含您所有的实体(仅包含etc.
  • basepackage.service:数据,没有逻辑部分代码-在您的情况下,Customer)
  • basepackage.dao:包含您所有的DAO,Product仅用于访问数据代码,基本上每个实体一个,每个实体包含findAll() : List<E>findOne(K id) : Esave(E e) : void,包含所有服务的方法,应用程序的逻辑部分<代码>e222>。服务是唯一调用DAOs.
  • basepackage.presentation (或者webapp的basepackage.web )的服务:包含HMI/web services/...implementation.
票数 1
EN

Stack Overflow用户

发布于 2013-05-03 17:56:27

您的老师的意思可能是您需要第三个表,名称类似于"CustomerProduct“。此表包含客户与他们购买的产品之间的链接。

代码语言:javascript
复制
tblCustomerProduct:
    Id: Integer, auto-increament
    CustomerId: Varchar(30)
    ProductId: Varchar(30)

因此,当客户购买产品时,您可以将此数据添加到表CustomerProduct。这将删除冗余数据,并大大简化删除过程

票数 2
EN

Stack Overflow用户

发布于 2013-05-03 18:00:33

你的老师是对的。这不是一个好的设计,因为你创建的类应该是内聚的。所以它应该负责做它能做的事情。在这里,您在产品类中添加了客户id,这本质上是一种糟糕的做法,因为一个客户可能会购买多个产品。在这种情况下,这种设计将失败。另外,Product类不需要知道客户的任何信息。它所要知道的就是它自己。

顾客与产品的关系是一种关联,可以表述为“顾客购买产品”。因此客户id不应该出现在产品表中。

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

您的问题的简单解决方案是创建一个新的类,它可以将产品和客户联系起来。

例如

代码语言:javascript
复制
CustomerProduct

customerid
productid

在这个类中,你可以添加像"AddProductForCustomer“这样的方法,并且可以编写你的数据库逻辑来保持一致性。

希望这能消除你的疑虑。

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

https://stackoverflow.com/questions/16356106

复制
相关文章

相似问题

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