我知道在 OOP 中你希望每个对象(来自一个类)都是一个“东西”,例如。用户、验证者等
我了解 MVC 的基础知识,了解它们的不同部分如何相互交互。
但是,我想知道MVC中的模型是否应该按照传统的OOP设计来设计,也就是说每个模型都是数据库/表/行(方案2)?
或者更像是收集影响同一个表或一堆相关表的方法(解决方案 1)。
CodeIgniter 中地址簿模块的示例,我希望能够在其中“CRUD”联系人并将其添加到/从可 CRUD 的联系人组中删除。
模型解决方案 1:将所有相关方法捆绑在一起(不是真实对象,而是“包”)
class Contacts extends Model {
function create_contact() {)
function read_contact() {}
function update_contact() {}
function delete_contact() {}
function add_contact_to_group() {}
function delete_contact_from_group() {}
function create_group() {}
function read_group() {}
function update_group() {}
function delete_group() {}
}
模型解决方案 2:OOP 方式(每个文件一个类)
class Contact extends Model {
private $name = '';
private $id = '';
function create_contact() {)
function read_contact() {}
function update_contact() {}
function delete_contact() {}
}
class ContactGroup extends Model {
private $name = '';
private $id = '';
function add_contact_to_group() {}
function delete_contact_from_group() {}
function create_group() {}
function read_group() {}
function update_group() {}
function delete_group() {}
}
当我想创建模型时,我不知道如何思考。上面的例子是我创建地址簿的真实任务。我应该将所有功能集中在一个类中吗?那么该类包含不同的逻辑(联系人和组),因此它不能保存其中任何一个特定的属性。
解决方案 2 根据 OOP 工作。但我不知道为什么我应该做这样的划分。例如,拥有一个 Contact 对象会有什么好处。它肯定不是 User 对象,那么为什么 Contact 应该以其自己的状态(属性和方法)“存在”。因为我倾向于这样想:如果某些东西需要状态,那么我会创建一个 OOP 类,以便这些方法可以影响状态或基于状态的其他事物。
那么模型也应该是“有状态的”吗?如果他们不需要状态,我为什么要根据 OOP 模式创建它。然后我可以像“打包”解决方案一样将它们捆绑在一起。
你们有 OOP/MVC 经验的人,请说明在这个非常具体的任务中(以及通常在创建模型时)应该如何思考
编辑:想想 MVC 中的 Controller 。它们是根据“包”解决方案创建的。这让我想知道...
最佳答案
should every model be a database/table/row (solution 2)?
没有。不要将模型的定义与其持久性方法联系起来。尽管对于简单的应用程序,您可能会从数据库行对象扩展模型,但您至少应该在思想上将它们分开。
模型只是您域中实体的表示,因此它们必然具有状态。在谈论联系人模型的地方,您实际上是在谈论映射器或网关,即从数据存储中检索模型的对象。不幸的是,如此多的 Active Record 临时实现混淆了这一点。
映射器可以作为静态函数的集合或作为对象来实现 - 但是,如果您出于任何原因(例如单元测试的模拟)想要扩展或改变行为,则集合不太灵活。
模型本身应该只是一个数据集合,要么存储为公共(public)属性,要么最好带有适当的 setter 和 getter(请不要只为每个变量定义一个 get/set 函数对或您不妨将它们公开),以及其他对数据进行操作的方法。它不应该有数据存储的概念或依赖性。映射器负责通过其接口(interface)实例化和初始化模型。这样做将为您创建和保存模型的方式提供灵 active 。您可以通过数据库、XML 文件、代码内、通过网络发送的序列化流来实现,无论您的船真正漂浮在何处,所有这些都可以通过替换不同的映射器来完成,并且模型仍然完全不知道。
关于php - 如何以正确的方式设计模型 : Object-oriented or "Package"-oriented?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2619742/
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
我正在尝试测试是否存在表单。我是Rails新手。我的new.html.erb_spec.rb文件的内容是:require'spec_helper'describe"messages/new.html.erb"doit"shouldrendertheform"dorender'/messages/new.html.erb'reponse.shouldhave_form_putting_to(@message)with_submit_buttonendendView本身,new.html.erb,有代码:当我运行rspec时,它失败了:1)messages/new.html.erbshou
我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-
我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar
我正在查看instance_variable_set的文档并看到给出的示例代码是这样做的:obj.instance_variable_set(:@instnc_var,"valuefortheinstancevariable")然后允许您在类的任何实例方法中以@instnc_var的形式访问该变量。我想知道为什么在@instnc_var之前需要一个冒号:。冒号有什么作用? 最佳答案 我的第一直觉是告诉你不要使用instance_variable_set除非你真的知道你用它做什么。它本质上是一种元编程工具或绕过实例变量可见性的黑客攻击
我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby1.9+ 关于ruby-主要:Objectwhenrun
如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象
我遵循MichaelHartl的“RubyonRails教程:学习Web开发”,并创建了检查用户名和电子邮件长度有效性的测试(名称最多50个字符,电子邮件最多255个字符)。test/helpers/application_helper_test.rb的内容是:require'test_helper'classApplicationHelperTest在运行bundleexecraketest时,所有测试都通过了,但我看到以下消息在最后被标记为错误:ERROR["test_full_title_helper",ApplicationHelperTest,1.820016791]test