Objective C 面向领域设计

4

通常在使用C#编程时,我会根据领域驱动设计原则来构建项目。我刚开始学习用Objective C编写iPhone应用程序,想知道是否有人有示例项目或代码,使用Objective C的领域驱动设计原则。我正在寻找如何使用业务对象等方面的示例。谢谢!

3个回答

6
有可能你误解了领域驱动设计原则是什么。DDD是一组指南,更多的是关于你的思考方式和解决问题的方法,它基本上与技术无关。如果你编写Objective C代码,没有任何东西会阻止你的设计受到领域的驱动而不是技术的驱动(我个人喜欢你必须命名参数的事实,因为我认为这使得代码更易读)。
你的问题可能是关于通常支持(但不定义)DDD的技术:ORM、DI、单元测试。在我看来,这部分并不太好(基于短暂而相对过时的经验)。与其使用ORM,你通常会使用Core Data,它是一个对象图持久器,在理论上应该更好,因为你不涉及“关系”部分。然而,我记得Core Data对我的对象模型施加了某些限制,我希望在其他环境中避免这种情况。不能代表DI,但单元测试很痛苦(在2010年),我听说在2012年仍然如此。
底线是,你需要详细阐述你的问题,将其拆分,并可能在Objective-C部分提出问题。

3
我很惊讶没有人提及CoreData是如何反对DDD的。即使是针对CRUD风格的应用程序,我也总是试图使用DDD方式编码。你会注意到的第一件事情就是Cocoa中广泛使用CoreData,尤其是在Mac上。
XCode和Cocoa通过绑定来促进使用CoreData。然而,CoreData强制你始终要基于数据库编码,而非领域模型。确实,如果你想重命名一个单独的领域对象属性,那么你就必须强制执行整个数据库迁移。
如果你正在学习Cocoa,你必须学习CoreData,因为许多应用程序和示例代码都依赖它。随着你对这个框架的了解逐渐加深,你可能希望完全放弃CoreData,如果你真的想拥有一个领域模型的话,这正是我通常为自己的项目所做的。

我也认为这是一个问题。使用“托管”模型并从中创建领域对象(领域模型对象Movie由基于Core Data的存储库创建,该存储库获取ManagedMovie并复制属性)太过繁琐。Core Data的内容是基础设施的一部分,不留给领域本身任何空间。你如何解决这个问题呢? - ctietze

2
我也有C#背景,学了ObjC半年后,我必须说,在Objective-C中完全可以遵循DDD原则。部分原因是因为语言的静态/动态混合Smalltalk式的特性。

例如,你可以非常容易地“劫持”对象发送的消息(拦截方法调用),只需覆盖几个方法即可,如果你明白我的意思,这使得依赖注入和单元测试非常容易实现。

此外,Grand Central Dispatch 使得在系统间进行解耦的消息传递非常方便,你可以使用它来简化你的领域中大部分部分之间的通信。

最后,基础框架中的key-value observing约定允许你轻松地将你的领域对象连接到用户界面元素,并实时反映更改。

也就是说,你的控制器不会直接操作服务对象,而是向其中一个领域对象发送命令来修改其状态。通过使你的控制器观察这些更改(通过KVO机制),状态很容易被反映回来。

我会说在ObjC中遵循DDD原则是完全可能的/甚至更容易。
至于实例,我从未见过任何实例。但是,按照您在C#项目中使用的相同结构(不是复制它们,而是类似地建模)肯定不难。学习我提到的技术也会对您有很大帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接