首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >客户/项目/报价/订单系统的体系结构

客户/项目/报价/订单系统的体系结构
EN

Software Engineering用户
提问于 2017-11-16 22:05:19
回答 2查看 409关注 0票数 4

我正在研究如何构建一个复杂的模块化系统,其中包含订单、客户、项目和报价。

客户可以有多个项目。对于每个项目,至少会有一个订单或报价相关联,但是有可能在每个属于客户的项目上有多个报价和订单。在软件需求中,如果不与项目挂钩,就不可能有报价或订单。

我遇到的问题是如何在这个系统周围创建类。如果Customer类具有包含所有项的ProjectsOrdersQuotes属性,这是错误的。似乎应该对Customers类进行一些扩展,比如如何添加这些项,而不是将其硬编码为属性。是否有我可以使用的设计模式,例如装饰模式?

EN

回答 2

Software Engineering用户

回答已采纳

发布于 2017-12-03 10:30:54

当然,对于当前的需求,不需要继承或基于继承的设计模式。我们可以立即创建类CustomerProjectOrderQuote。我们需要仔细地确定它们之间的关系,以便我们可以决定放置属性和方法。

您刚才提到Customer可以有多个Projects,所以Customer类有Lis<Project>addProject(Project)方法。

代码语言:javascript
复制
    public class Customer {
        private List<Project> projects;

        public void addProject(Project project) {
            projects.add(project);
        }
    }

同样,Project应该包含一个List<Quote>List<Order>来存储引号和订单。但是,add***()方法必须设计得稍微复杂一些。

让我们看看QuoteOrder。您的软件需求表明,如果不绑定到QuoteOrder,就不可能存在Project。因此,您需要一个QuoteOrder中的构造函数,它接受Project实例。这里有几件事值得注意。

  1. 我们需要将QuoteOrder添加到Project类中。正确的位置是QuoteOrder的构造函数。公共类引用{私有项目项目;公共引用(项目项目){ Project = p;project.addQuote(this);}公共类顺序{私有项目项目;公共秩序(项目项目){ project = p;project.addOrder(this);}}
  2. 通常编写这些类的正确位置是在Project类(静态内部类)中。您可以在MenuMenuItemsTabTabItems等中看到这种模式,其中MenuItemsTabItems在不绑定到MenuTab的情况下是不存在的。另一个例子是IteratorList
  3. 它们的构造函数通过使它们是私有的而变得不可访问,并且add***()将成为返回实例的封闭类中的工厂方法。公共类项目{私有List报价;私有List订单;公共引号addQuote(int id) { quote addQuote=新引号(此,id);quotes.add(报价);返回报价;}公共秩序addOrder(int id) { Order =新秩序(此,id);orders.add( Order );返回顺序;} public静态类Quote {私有最终int id;私有最终项目项目;私有引用(项目项目,int id) { project = p;this.id = id;}公共静态类顺序{私有最后int id;私有最终项目;私有订单(项目项目,int id) { project = p;this.id = id;}}

根据需要可以改变addQuote()addOrder()的参数。

现在要解决的最后一个问题是,在一个Quoteorder中至少应该有一个Project。我们可以通过在Project中使用静态工厂方法来解决这个问题。

代码语言:javascript
复制
    public class Project {
        // Fields

        private Project() {
            // Initialise the fields
        }

        public static Project createWithQuote(int id) {
            Project p = new Project();
            p.addQuote(id);
            return p;
        }

        public static Project createWithQuotes(int[] ids) {
            Project p = new Project();
            for (int id : ids)
                p.addQuote(id);
            return p;
        }

        // Add similar static factories for Order

        // Rest of the code

    }

私有构造函数和静态工厂提高了可读性,避免了构造函数重载冲突。如果您愿意,您也可以使用公共重载构造函数。如果要子类,则使构造函数受到保护。

票数 2
EN

Software Engineering用户

发布于 2017-12-02 22:21:49

由于您关注的是对象(主要是数据)与它们的基数之间的关系,这听起来更像是关系数据库问题。

如果使用现有约束设计一个良好的数据库,则可以使用现代IDE从数据库自动创建代码。

查看以下链接,了解从现有数据库结构创建普通旧(java)对象的自动化方法可能非常有益:

Java 6-在实验室OTN开发者日,使用虚拟机

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

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

复制
相关文章

相似问题

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