PHP聚合耦合?解决方案
程序员文章站
2022-04-23 18:11:13
...
PHP聚合耦合???
这是一个通用模型接口:
然后,一般模型类继承它:
前端控制器,解析了URL后实例化模型类,调用接口,传递模型数据:
这是我做的简单的耦合结构,但是,这只是相对于控制器和模型类之间的耦合,而且是通用类,如果是特殊类还得使用特殊的接口和控制器,但问题不在这,问题在于我想让模型之间也通过接口交互(数据耦合?),但是想了很多也没有实际的解决办法,该怎样做这个接口呢???
比如,我需要调用一个数据库类的函数,一般情况下是直接调用:
$db = db::main();
#db -> Query(***********************);
但是,这不符合低耦合概念,我只要一改Query();方法就完蛋了,有什么办法能拉取数据??
或者说,给个数据耦合的实例也行,自己慢慢研究算了....
谢谢啦!
(注:我知道,可能会有人说上面的代码不过完善什么的?的确,我是把前端控制器的一些东西都集成起来了,但这不是我今天讨论的焦点,如果给大家带来了视觉上的不便,请见谅)
------解决方案--------------------
说是实话非常不明白你到底要做什么。。。
但是数据层要交互的话,明显应该通过控制层来做,否则要控制层做什么?因为只有控制层知道数据之间有什么具体业务逻辑上的关系,而model仅仅应该关心的是自己的一亩三分地,超出这个范围之外的都应该交给上层处理,这样才是降低了耦合!
另外提到的$db->query的问题,明显可以通过抽离字段、条件、排序等,将query转换成
$db->select()->where()->order()->limit()
下面有2种方式:
1 然后接着抽象
$db::fetch($where, $order, $limit) {
return $db->select('*')->where($where)->order()->limit();
}
调用的时候
$db = db::main();
$db->fetch($where, $order, $limit);
2 或者可以封装一个底层的model基类
basemodel::fetch($where, $order, $limit) {
$db = db::main();
return $db->select('*')->where($where)->order()->limit();
}
模型基础
class test extends basemodel implements API {
function dothing(){
parent::fetch($where, $order, $limit);
}
}
没有明白这个和数据耦合有什么关系,这仅仅是调用db的封装!
------解决方案--------------------
2楼得说的有理,我个人认为降低耦合的办法就是显示层只负责显示,逻辑处理就交个业务逻辑层,数据访问层只管处理数据,个做个的事!
关于数据库类得问题,我建议你去看看uchome的数据库类,我觉得他的类写得还不错,跟2楼说的比较相似!
------解决方案--------------------
既然是控制器的基类。控制器不都可以遵循基类提供的标准执行数据?
------解决方案--------------------
我以为你应经被各种名词带入到一个误区了
你实际上是想在各个功能模块间传递某中信息
其实这是很容易实现的一种机制,就是操作系统中广泛使用的事件驱动或消息驱动
一个模块将自己的需求广播出去,能够实现此需求的模块就此需求返回需要的数据
这是一个通用模型接口:
- PHP code
interface API{ public function main(); public function params($value); }
然后,一般模型类继承它:
- PHP code
class test implements API { public function main(){ echo 'hello world!'; } public function params($value){ var_dump($value); } }
前端控制器,解析了URL后实例化模型类,调用接口,传递模型数据:
- PHP code
class Control{ private function __construct(){ self::Router(); $obj = new self::$Model(); self::_Interface($obj); } public static _Interface(API $obj){ $obj -> main(); $obj -> params(); } }
这是我做的简单的耦合结构,但是,这只是相对于控制器和模型类之间的耦合,而且是通用类,如果是特殊类还得使用特殊的接口和控制器,但问题不在这,问题在于我想让模型之间也通过接口交互(数据耦合?),但是想了很多也没有实际的解决办法,该怎样做这个接口呢???
比如,我需要调用一个数据库类的函数,一般情况下是直接调用:
$db = db::main();
#db -> Query(***********************);
但是,这不符合低耦合概念,我只要一改Query();方法就完蛋了,有什么办法能拉取数据??
或者说,给个数据耦合的实例也行,自己慢慢研究算了....
谢谢啦!
(注:我知道,可能会有人说上面的代码不过完善什么的?的确,我是把前端控制器的一些东西都集成起来了,但这不是我今天讨论的焦点,如果给大家带来了视觉上的不便,请见谅)
------解决方案--------------------
说是实话非常不明白你到底要做什么。。。
但是数据层要交互的话,明显应该通过控制层来做,否则要控制层做什么?因为只有控制层知道数据之间有什么具体业务逻辑上的关系,而model仅仅应该关心的是自己的一亩三分地,超出这个范围之外的都应该交给上层处理,这样才是降低了耦合!
另外提到的$db->query的问题,明显可以通过抽离字段、条件、排序等,将query转换成
$db->select()->where()->order()->limit()
下面有2种方式:
1 然后接着抽象
$db::fetch($where, $order, $limit) {
return $db->select('*')->where($where)->order()->limit();
}
调用的时候
$db = db::main();
$db->fetch($where, $order, $limit);
2 或者可以封装一个底层的model基类
basemodel::fetch($where, $order, $limit) {
$db = db::main();
return $db->select('*')->where($where)->order()->limit();
}
模型基础
class test extends basemodel implements API {
function dothing(){
parent::fetch($where, $order, $limit);
}
}
没有明白这个和数据耦合有什么关系,这仅仅是调用db的封装!
------解决方案--------------------
2楼得说的有理,我个人认为降低耦合的办法就是显示层只负责显示,逻辑处理就交个业务逻辑层,数据访问层只管处理数据,个做个的事!
关于数据库类得问题,我建议你去看看uchome的数据库类,我觉得他的类写得还不错,跟2楼说的比较相似!
------解决方案--------------------
既然是控制器的基类。控制器不都可以遵循基类提供的标准执行数据?
------解决方案--------------------
我以为你应经被各种名词带入到一个误区了
你实际上是想在各个功能模块间传递某中信息
其实这是很容易实现的一种机制,就是操作系统中广泛使用的事件驱动或消息驱动
一个模块将自己的需求广播出去,能够实现此需求的模块就此需求返回需要的数据
相关文章
相关视频