我正在尝试构建一个对象来表示我正在处理的项目的一个可笑的大表单。 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语句,检查表格中是否也选择了工作对象,旅行对象或地址对象。如果是,请获取并设置对象,然后在必要时链接联系对象。
这对我来说似乎并不高效,特别是因为我需要在另一个控制器方法上重复所有这些逻辑。有没有更好的方法来构建我的对象,或者更好的方法来处理我的控制器代码?
感谢。
答案 0 :(得分:1)
我最初的想法是将任何重复逻辑从您的控制器移动到您可以从许多地方调用的服务对象。
带来这一点:您可以将表单分解为子表单 - 每个子表单由“子表单”对象表示。这些对象中的每一个都应该能够处理与表单部分相关的信息,并且应该知道要保存到数据库中的内容。您可以将这些表单对象组合成一个从控制器调用的服务对象。
我注意到的另一件事是您将整个FORM范围实际传递到某些功能的方式。我倾向于避免这种情况,因为你真的没有描述函数需要做什么工作,当然这个范围可以在你不期望的时候改变。我建议你指定每个子表单对象所需的参数,并将它们传递给服务。
示例psuedocode:
// 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。这是对该主题的精彩介绍,将帮助您组织代码问题,就像您发布的那样。