我不太确定标题是否适合我想提出的这个问题。
我计划创建一个 Web MVC 框架作为我的毕业论文,并且在之前与我的顾问试图定义一些成就的对话中,他说服我应该在这个项目中选择模块化设计。
那时我已经开发了一些东西,停了一段时间来分析它会有多少模块化,我真的做不到,因为我不知道“模块化”的真正含义。
有些事情对我来说不是很清楚,例如,仅仅引用另一个模块会破坏我系统的模块化?
假设我有一个数据库访问模块,它可以选择使用缓存模块来存储复杂查询的结果。正如任何人所看到的,我至少会对缓存模块有一个命名依赖项。
在我的“模块化设计”概念中,我可以将每个组件分开分发,并使其与其他人开发的其他组件交互。在这种情况下,我展示了,如果有人想使用我的数据库访问模块,他们也必须使用缓存,即使他不会使用它,只是为了引用/命名目的。
所以,我想知道这是否真的是一个模块化设计。
我想出了一个替代方案,就像单独创建每个组件一样,甚至不知道是否存在对其功能并非绝对必需的其他组件。为了扩展功能,我可以创建一些基于装饰器和适配器的结构。
为了澄清一点,这里有一个例子(在 PHP 中):
前
interface Cache {
public function isValid();
public function setValue();
public function getValue();
}
interface CacheManager {
public function get($name);
public function put($name, $value);
}
// Some concrete implementations...
interface DbAccessInterface {
public doComplexOperation();
}
class DbAccess implements DbAccessInterface {
private $cacheManager;
public function __construct(..., CacheManager $cacheManager = null) {
// ...
$this->cacheManager = $cacheManager;
}
public function doComplexOperation() {
if ($this->cacheManager !== null) {
// return from cache if valid
}
// complex operation
}
}
后
interface Cache {
public function isValid();
public function setValue();
public function getValue();
}
interface CacheManager {
public function get($name);
public function put($name, $value);
}
// Some concrete implementations...
interface DbAccessInterface {
public function doComplexOperation();
}
class DbAccess implements DbAccessInterface {
public function __construct(...) {
// ...
}
public function doComplexQuery() {
// complex operation
}
}
// And now the integration module
class CachedDbAcess implements DbAccessInterface {
private $dbAccess;
private $cacheManager;
public function __construct(DbAccessInterface $dbAccess, CacheManager $cacheManager) {
$this->dbAccess = $dbAccess;
$this->cacheManager = $cacheManager;
}
public function doComplexOperation() {
$cache = $this->cacheManager->get("Foo")
if($cache->isValid()) {
return $cache->getValue();
}
// Do complex operation...
}
}
现在我的问题是:这是最好的解决方案吗?我应该为所有没有作为要求的模块一起工作,但这样做可以更有效吗?
有人会以不同的方式来做吗?
我还有一些涉及此问题的进一步问题,但我不知道这是否是 stackoverflow 可接受的问题。
PS:英语不是我的母语,可能有些部分会有点混乱