タイトルが、私がテーブルに置きたいこの質問にぴったり合っているかどうかはわかりません.
私は卒業論文として Web MVC フレームワークを作成することを計画しており、アドバイザーとの以前の会話で、いくつかの成果を定義しようとしており、彼はこのプロジェクトではモジュール設計を選択する必要があると確信しました。
私はそれまでにいくつかの開発を行っていましたが、それがどの程度モジュール化されるかを分析するためにしばらく停止しましたが、「モジュール化」の本当の意味がわからないため、実際には実行できませんでした。
たとえば、別のモジュールを参照するだけでシステムのモジュール性が爆発するなど、私には明確ではないことがありますか?
データベースアクセスモジュールがあり、複雑なクエリの結果を保存するためにオプションでキャッシュモジュールを使用できるとしましょう。誰でもわかるように、少なくともキャッシュ モジュールには名前付けの依存関係があります。
「モジュール設計」という私の概念では、各コンポーネントを個別に配布し、他の人が開発した他のコンポーネントと相互作用させることができます。この場合、誰かが私のデータベースアクセスモジュールを使用したい場合、参照/命名の目的で、使用しない場合でも、キャッシュも取得する必要があることを示しました。
それで、これが本当にモジュラー設計なのか疑問に思っていました。
その機能に絶対に必要ではない他のコンポーネントの存在についても知らずに、各コンポーネントを個別に作成するような代替案を思いつきました。機能を拡張するために、Decorators と Adapters に基づいた構造を作成できます。
物事を少し明確にするために、ここに例を示します(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...
}
}
ここで私の質問は次のとおりです。これが最善の解決策ですか? 要件として一緒に動作しないすべてのモジュールに対してこれを行う必要がありますが、そうすることでより効率的になりますか?
誰かが別の方法でそれを行うでしょうか?
これに関するさらにいくつかの質問がありますが、これがスタックオーバーフローにとって受け入れられる質問であるかどうかはわかりません。
PS: 英語は私の第一言語ではありません。一部の部分が少し混乱する可能性があります。