面向对象+解耦:将知识/方法添加到对象或其他类?

时间:2016-04-21 07:24:17

标签: class oop decoupling

在处理基于Symfony 2的WebApp项目时,我想出了一个普遍的OOP问题:

基于Symfony框架的WebApp项目被分配到不同的Bundles。这基本上只是其他框架中LibraryAssembly等的别名:属于某种方式的代码/类在同一Bundle内组织。

要重复使用,不同的Bundles应该(或多或少)彼此独立。

我的WebApp项目包含(除此之外)以下两个包:

  • AppBundle :包含核心模型和布局等
  • ShopBundle :包含购买订阅所需的所有类和代码(访问WebApp)

代表登录用户实体的User类存储在AppBundle中。

现在我需要一种新方法,它告诉我,用户是否已经购买了。

大问题是:我应该在哪里实施此方法?

解决方案1:hasPurchases()添加到User

这听起来很合理,因为“用户XY是否有购买”这个问题当然是用户XY的问题。但是:如果User类实现了此方法,则该类必须知道/使用ShopBundle,因此将依赖于此捆绑包。这将是一个缺点,我想避免捆绑之间的耦合。

解决方案2:在某些外部课程中实施hasPurchases($user)

为了避免User类与ShopBundle的任何依赖关系,我可以将方法移动到某个外部类。该方法将接收user对象作为参数,然后检查该用户是否有任何购买。

优点是,User对象仍然不需要了解ShopBundle的任何信息。但是我只是将耦合问题移到另一个类:现在实现hasPurchases($user)的类XY需要知道User类和ShopBundle

那么,这里的correct解决方案是什么?

0 个答案:

没有答案