2010-01-21 71 views
3

我们有两种域类型:用户地址对象模型中的“视点”

我们有一个方法LocationRepositoryGetUserLocations()

现有方案:

var user = UserRepository.GetUser(userId); 
var locations = LocationRepository.GetUserLocations(userId); 

对我来说更有意义,检索与用户从用户类型,即相关的位置:

var user = UserRepository.GetUser(userId); 
var locations = user.GetLocations(); 

我认为后者实现读取更干净,作为一个API客户端,我必须处理更少的类型(即LocationRepository不是必需的)。另一方面,会有更多的代码需要维护,因为我必须将“外观”写入LocationRepository

我应该作用于我的直觉,创造的用户类型的LocationRepository一个门面,或者我应该是快乐与现状,并用序列图住的是“感觉”我错了(即检索位置信息感觉就像是从错误的“观点”中检索到的)?

+0

+1好问题,我通常在这两个概念之间来回切换。非常好奇人们对此有何评论。 – 2010-01-21 23:22:17

+0

还没有回答?游民。我们能否碰到这个问题? :) – 2010-01-21 23:58:07

+0

// @本阿斯顿:什么平台? .NET/C#? – 2010-03-08 18:37:06

回答

1

我会从可维护性的角度来处理这个问题。我同意在LocationRepository上使用Facade将会“感觉不错”,并且可能会使代码更具可读性。

正如你所说的,权衡是更多的代码来维护。但是我们在谈论多少代码?它有很多,你需要经常更新吗?或者你可以写一次而忘记它,并且容易单元测试?如果它是前者,只需吞下它,随着当前的实现,并提醒自己它并不会真正影响功能。如果是后者,那么可能值得在其他地方为这种良好感觉和更可读的代码付出努力。

1

这肯定是可能我们的东西模拟的东西是这样的:

Universe.Instance.Galaxies["Milky Way"].SolarSystems["Sol"] 
     .Planets["Earth"].Inhabitants.OfType<Human>().WorkingFor["Initech, USA"] 
     .OfType<User>().CreateNew("John Doe"); 

也许库实例不应该是为了“结束开发商”可见,并在模型进行封装。

但是,由于我们可能无法轻松访问Universe.Instance,因此我们确实需要一个或多个“入口点”来实际获取数据。

UPDATE:

我认为,一方面应该保持的有“仓库门面入口点”尽可能低的数目,因为这更接近现实世界,因为假设目标只能是一个“必应”,其中的一切都来自于最终产生所有现有数据;-)另一方面,当然,今天的系统总是我们必须做出的大妥协,因为能够模型真实世界是有限的,有性能影响等等...你可以在你的具体的例子去然而

一种方法是使用存储库检索总是新鲜的数据,如:

LocationRepository.Instance.GetUserLocations(userId); 

...而你用你的User模型类来保存结果的属性,如在:

var locations = myUser.Locations; 

该属性将使用延迟加载技术起初需求加载从LocationRepository的数据,然后保存该结果。这表明这些位置只加载一次,这使得使用库的开发人员更容易。然后,您可以决定是否要使LocationRepository.GetUserLocation(userId)对最终开发人员也是可见的。请记住,在走这条路线时,您还需要构建某种隐式以及显式刷新机制和生命周期管理。

这种全面的方法已被证明对我非常有用。然而,Silverlight等异步世界现在增加了一些新的注意事项,因为这些属性不能立即刷新,并且不再与一行代码中的新值同步。当我们请求刷新时,我们现在必须利用绑定技术和/或使用回调来进一步处理刷新的值。总而言之,我认为最终目标仍然是看到例如UserRepository就像另一个常规域类型,显然有责任创建新的单一User实例并将它们添加到用户存储中,以及以提供所有可用用户的过滤视图(查询)。 myUser.Locations以及myLocations.ByUser["John Doe"]对同样的结果持有参考是可以接受的。这个UserRepository然后可能只是负责持有它的另一个类的属性,例如CompanyStaff。进一步提出这个想法是什么使我想到了这个事情。 ;-)

+0

你的回答有点模棱两可。你是否赞成创建一个门面(本身就是一个“入口点”),还是你说任何系统都是一个大的折衷,所以我也可以直接使用该位置库? – Ben 2010-01-23 07:07:32

+0

有一点点。 ;-) ...我用更丰富的解释更新了我的答案。 – herzmeister 2010-01-23 15:32:32