gpt4 book ai didi

php - 如何以正确的方式设计模型 : Object-oriented or "Package"-oriented?

转载 作者:可可西里 更新时间:2023-10-31 23:00:01 24 4
gpt4 key购买 nike

我知道在 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com