Oop 设计以下域的最佳方法是什么

Oop 设计以下域的最佳方法是什么,oop,ooad,object-oriented-analysis,Oop,Ooad,Object Oriented Analysis,好吧,那么。。。我有一个名为Lead的实体,当我实例化这个实体时,它应该寻找一个名为Account的实体,通过属性Account\u id将它们自己关联起来。Lead通过Lead中的areacode和campaign\u id中的两个属性与帐户匹配。我如何设计它来创建一个好的对象定向 Lead中的方法matchAccount accountscoontroller/AccountAggregator中的方法intakeLead 另一个类AccountMatcher来处理它 没有。我建议 谢谢 从

好吧,那么。。。我有一个名为
Lead
的实体,当我实例化这个实体时,它应该寻找一个名为
Account
的实体,通过属性
Account\u id
将它们自己关联起来。
Lead
通过
Lead
中的
areacode
campaign\u id
中的两个属性与
帐户匹配。我如何设计它来创建一个好的对象定向

  • Lead
    中的方法
    matchAccount
  • accountscoontroller
    /
    AccountAggregator
    中的方法
    intakeLead
  • 另一个类
    AccountMatcher
    来处理它
  • 没有。我建议

  • 谢谢

    从严格意义上讲,OOP应该使用关联来描述对象之间的关系

    如果您使用方法通过键来表示寻找它们的关联,我认为您是使用关系设计原则来表示对象,而这不是面向对象编程

    事实上,我不知道您是否在使用OR/M来将此类域持久化到某个数据库,但如果您以这种方式进行操作,您应该能够创建实际关联并将它们映射到表中,这样您的域将表示为一个完整的面向对象编程设计:

    • Lead有一个名为“Account”的属性,它将1个Lead与1个Account关联(1:1关联)
    此外,OOP和OR/M,或者只是数据映射器,使用人工键(单列键)比使用复合键更有效

    也许您没有使用OR/M。那么,一个简单的解决方案是在类中添加一个方法,该方法将加载名为“load”的关联,而不带参数:

    Lead lead = new Lead();
    lead.Load();
    
    // Now you can access "Account" association:
    lead.Account.Id
    

    显然,您可以将此解决方案复杂化,但最终将使用您自己的OR/M,因此,如果您不重新发明轮子,并且利用现有的任何轮子,您会做得更好

    对于DDD,它完全是关于域概念和关系(不是rdbms关系)。OOP也不重要,因为当您使用业务(领域)方法时,它是一种技术方法。但是,您将隐式地使用OOP,因为它是对域建模的自然方式

    我不知道你的领域,但根据你对问题的描述,我认为那里没有多少DDD,而是被DDD术语掩盖的旧的CRUD心态。看起来您没有识别相关的有界上下文和聚合根(AR)。那么,这些实体能做什么(行为)?它们是如何使用的(它们所涉及的用例)

    当您执行DDD时,您可以让域告诉您哪些是对象以及它们如何相互交互。AR可以通过Id“指向”另一个AR,但是上下文和用例非常重要。你可以在同一个概念中,但在不同的环境中,建立多个AR模型,因此,并非所有地方都只有一个可用的AR帐户

    慢慢来,忘记OOP、ORM、rdbms等。只关注领域,以正确理解概念(它们可能很棘手!)及其含义。生成的代码将是良好的OOP,更重要的是良好的建模。然后再担心持久性和rdbms

    编辑

    根据OP和评论的要点,我认为(我只能猜测,因为我现在不知道这个领域)这是Lead(表)的一个用例,因此,如果没有其他相关细节,我会有一个服务或类似的服务,它将起带头作用,并且可以执行该行为。您向客户存储库询问潜在客户的客户,并提供匹配条件(区号和活动id)


    根据经验,我建议尝试剖析这些概念,并尝试重新构建它们之间的关系,直到你确定自己理解了正确的关系

    “当我实例化这个实体时,它应该寻找一个名为Account的实体”-这听起来像是人为的要求。这是否反映了你的问题领域内在的复杂性?对于那些投票结束Leo的问题的人来说,我不认为这主要是观点。。。Leo的方法不是面向对象的,所以可以用一种非常通用的方式来回答。你好,Matías,谢谢你的回答,但我的疑问不是我如何获得关系,而是我如何才能找到潜在客户。潜在客户应查看客户列表,并使用区号和活动id将其关联。因此,假设我有一个“侦听”区号11和活动id 12的客户,当我创建一个具有该特征的潜在客户时,我应该将该客户的ID与潜在客户中的Account_ID属性相关联。@LeoCavalcante在OOP中可以找到它,因为它与父对象相关联。这就是为什么我为你做了这个解释,当我在“Lead”中给你提示“Load”方法时,实际上我相信我已经回答了你的问题。我相信你需要仔细检查我的答案。@LeoCavalcante顺便说一句,要完全回答你的问题并提供大量细节是很困难的。我相信现在你需要慢慢想一想请看一下要点:我想我能更好地解释我的疑问。@LeoCavalcante我理解你的问题,但我试图给你一个正确的答案:OOP中的关联不是通过调用方法创建的。我相信我的回答回答了你的问题。你好,迈克,谢谢你的回答。你是对的,我只是使用DDD的术语,而不是概念。我会看看你的链接,试着把我的域名翻译成正确的DDD方式,看看我是否能找到更好的方法。迈克,我想我最好用桌椅的例子来阐述我的疑问,太长了,不能在这里发表,所以我提出了一个要点:请,你能回答这个问题吗?谢谢