【问题标题】:How to structure my objects to clean up my controller code如何构造我的对象以清理我的控制器代码
【发布时间】:2011-01-13 09:43:08
【问题描述】:

我正在尝试构建一个对象来代表我正在从事的项目的大得可笑的形式。 http://www.flickr.com/photos/namtax/5351091239/

我不想将所有字段构建到一个大对象中,因为我认为这不是一种好方法,所以我将模型构造成这样 -

一个接触对象。

  • 一个工作对象 - 一对一链接到联系人。

  • 一个旅行对象 - 与联系人一对一关联。

  • 一个地址对象 - 一对多链接到联系人。

  • 一个紧急联系人对象 - 一对多地链接到联系人。

这是其中一种关系的示例代码 - 用 CF9 ORM 编写

    property name="work"
             fieldtype="one-to-one"   
             cfc="work"     
             mappedby="contact";

这里的问题是,由于您可以在表单中选择所有可能的选项,它会导致我的控制器中的 saveContact 函数很大并且代码很臭。这是代码的粗略翻译

VARIABLES.contact = contactService.getContact(form.iContactId);
contactService.set(contact:contact,argumentCollection:form);
contact = contactService.save(contact);

if(_emergencyContactService.userIsSubmittingAnEmergencyContact(form)){
  VARIABLES.emergencyContact = _emergencyContactService.getEmergencyContact(contact);

   emergencyContactService.setEmergencyContact(emergencyContact,form);

        if(! contact.hasEmergencyContact()){
            contact.setEmergencyContact(emergencyContact);
            emergencyContact.addarrContacts(contact);
        }

        _emergencyContactService.save(emergencyContact);
    }
// Repeat this logic to check if work object, travel object or address object have been selected in the form also, get and set accordingly.

然后我重复上面显示的紧急联系人的 if 语句,以检查工作对象、旅行对象或地址对象是否也已在表单中选择。如果是这样,获取并设置对象,然后在必要时链接联系人对象。

这对我来说似乎效率不高,尤其是当我还需要在另一个控制器方法上重复所有这些逻辑时。有没有更好的方法来构造我的对象,或者有更好的方法来处理我的控制器代码?

谢谢。

【问题讨论】:

  • 你用的是什么框架?
  • 啊,我们没有使用框架,但我正在组织应用程序以尽可能多地镜像 MVC。
  • 我强烈推荐一个框架。它将帮助您更好地组织起来,并为服务对象、ORM 对象等提供适当的“家”。我推荐 FW/1 (github.com/seancorfield/fw1)。还有其他的,赶紧谷歌一下吧!
  • 是的,这不是我的选择,但是该项目是在没有 MVC 的情况下启动的。我将 FW1 和 Coldbox 用于我的个人项目,它们的帮助很大。

标签: oop orm coldfusion


【解决方案1】:

我最初的想法是将任何重复的逻辑从您的控制器移动到您可以从许多地方调用的服务对象。

带来:您可以将表单分解为子表单 - 每个子表单都由一个“子表单”对象表示。这些对象中的每一个都应该能够处理与它的表单部分相关的信息,并且它应该知道将什么保存到数据库中。您可以将这些表单对象组合成您从控制器调用的服务对象。

我注意到的另一件事是您实际上将整个 FORM 范围传递给某些函数的方式。我倾向于避免这种情况,因为您实际上并没有描述该功能需要什么来完成这项工作,当然,当您不期望它时,这个范围可能会发生变化。我建议您指定每个子表单对象所需的参数并将它们传递给服务。

示例伪代码:

// Controller code
travelSubFrm = new TravelForm(name, dob, address ...); // etc
workSubFrm = new WorkForm(position, dept ...); // etc

// Create service and save details - the service knows the logic
contactFormService.setTravelSubFrm(travelSubFrm);
contactFormService.setWorkSubFrm(workSubFrm);
contactFormService.process();

只是一些快速的想法。

希望对您有所帮助!

编辑:如果您想开始研究如何构建面向对象的代码,那么我建议您查看Head First Design Patterns。这是对该主题的一个很好的介绍,将帮助您组织代码问题,就像您发布的那样。

【讨论】:

  • 非常感谢。是的,我认为这将是一个改进!想知道,我会在表单对象中放入什么?与它们所链接的对象的属性相同吗?
  • 每个表单对象将代表一组表单字段,并且知道要检查什么以及要更新哪些 ORM 对象。 contactFormService.process(); 调用将在它正在使用的每个子表单对象上调用 process()。他们会照顾自己的信息。抱歉,如果不清楚。
  • 好吧,这很有道理,我也会检查那本书。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多