tim*_*den 1 oop model-view-controller codeigniter kohana
我一直在阅读和学习面向对象的编程(首先面向对象的分析和设计以及代码完成:软件构建的实用手册 - 感谢StackOverflow上的建议).我也一直在学习如何使用几个PHP MVC框架(特别是Codeigniter和Kohana).
我读过的一些面向对象的主体由MVC框架以不同的方式处理.我想我已经设法理解了差异和做出决定的原因(完整且易于使用的解决方案),但我想测试我的假设...所以如果你要幽默我......请评论或纠正.
假设#1:
考虑到Web应用程序的正确抽象,包含类库的目录应位于包含演示文件的目录之外.该组织遵守DRY("不要重复自己")主体,允许多个演示文件夹(www.domain.com,management.domain.com,api.domain.com等)使用相同的对象.
假设#2:
如果您的所有类都位于演示文件夹之外,那么MVC实现中的模型只使用这些类的实例.如果这是真的,那么MVC框架只是一个表示类(控制器),它有助于管理输入(GET和POST请求),响应(模型或实例)和输出(视图或模板).
假设#3:
如果MVC框架只是一个表示类,那么控制器实例初始化的数据库类会破坏控制器类的抽象.一个(控制器实例的)模型不应该有一个("有一个")数据库,它应该有一个来自类库的东西(用户,产品),那个东西应该有一个数据库.
假设#4:
此外,如果MVC框架只是一个表示类,则控制器实例初始化的数据库类与控制器类紧密耦合.从一种存储方法改为另一种存储方法需要对所有模型进行重新分解.
假设#5:
使用HMVC框架时,包含数据库的控制器的问题更严重,因为您的模型更多模块(更多模型,更多重新分解).
更新:
对不起,我可能已经使用了一些松散的控制器和模型这两个术语......也许这说明了紧耦合.我混淆的根源来自数据库类语法.
有了模型,不应该是:
$user = new User($id);
$data['name'] = $user->getName();
$data['title'] = $user->getTitle();
return $data
Run Code Online (Sandbox Code Playgroud)
代替:
$query = $this->db->get_where('user', array('id' => $id), 1, 0);
$row = $query->row_array();
$data['name'] = $row['name'];
$data['title'] = $row['title'];
return $data
Run Code Online (Sandbox Code Playgroud)
假设#1:考虑Web应用程序的正确抽象,包含类库的目录应位于包含演示文件的目录之外.该组织遵守DRY("不要重复自己")主体,允许多个演示文件夹(www.domain.com,management.domain.com,api.domain.com等)使用相同的对象.
这是正确的,因为库不用于表示(即不是视图).它们是将在多个控制器中使用的模块.通常他们不应该使用持久性数据,因为它们不是模型,但在某些情况下(例如,codeigniter会话).
假设#2:
如果您的所有类都位于演示文件夹之外,那么MVC实现中的模型只使用这些类的实例.如果这是真的,那么MVC框架只是一个表示类(控制器),它有助于管理输入(GET和POST请求),响应(模型或实例)和输出(视图或模板).
这对我来说有点混乱.你是正确的控制器只是用于编排GET和POST请求,但是当然要调用"表示类".控制器负责模型(持久数据)和视图(数据表示)的编排.
假设#3:
如果MVC框架只是一个表示类,那么控制器实例初始化的数据库类会破坏控制器类的抽象.一个(控制器实例的)模型不应该有一个("有一个")数据库,它应该有一个来自类库的东西(用户,产品),那个东西应该有一个数据库.
这很令人困惑,我真的不明白你在这里说的是什么.MVC只是一个"表示类",模型没有"数据库",框架可以保存与数据库的连接,模型是数据库的抽象(对象如用户,产品).
假设#4:
此外,如果MVC框架只是一个表示类,则控制器实例初始化的数据库类与控制器类紧密耦合.从一种存储方法改为另一种存储方法需要对所有模型进行重新分解.
控制器不初始化数据库,框架通常只处理控制器访问数据库的抽象(模型).如果数据库系统被任何东西替换,则仅重新考虑模型接口的实现.
假设#5:
使用HMVC框架时,包含数据库的控制器的问题更严重,因为您的模型更多模块(更多模型,更多重新分解).
HMVC并不一定意味着更多的模型.使用HMVC允许来自项目的可移植模块,可以跨多个控制器访问.通常,您会看到Libraries在非HMVC框架中执行此操作,即不具有某些db/templating的库.
| 归档时间: |
|
| 查看次数: |
1163 次 |
| 最近记录: |