優れた MVC 実装のリトマス試験紙は、ビューの交換がいかに簡単かということです。私は怠け者だったので、いつもこれを本当に下手にやっていましたが、今は正しくやりたいと思っています. これは C++ で書かれていますが、誇大宣伝を信じるなら、デスクトップ以外のアプリケーションにも同様に当てはまるはずです。
以下に 1 つの例を示します。アプリケーション コントローラーは、バックグラウンドで URL が存在するかどうかを確認する必要があります。次のように、(Boost シグナルを使用して) "URL available" イベントに接続できます。
BackgroundUrlCheckerThread(Controller & controller)
{
// ...
signalUrlAvailable.connect(
boost::bind(&Controller::urlAvailable,&controller,_1))
}
それで、どのようにController::urlAvailable
見えますか?
1 つの可能性を次に示します。
void
Controller::urlAvailable(Url url)
{
if(!view->askUser("URL available, wanna download it?"))
return;
else
// Download the url in a new thread, repeat
}
これは、私には、ビューとコントローラーの全体的な結合のように思えます。このような結合により、Web を使用するときにビューを実装することができなくなります (コルーチンは別として)。
別の可能性:
void
Controller::urlAvailable(Url url)
{
urlAvailableSignal(url); // Now, any view interested can do what it wants
}
私は後者に部分的ですが、これを行うと次のようになります。
- 400億のそのような信号。アプリケーション コントローラは、自明でないアプリケーションでは巨大になる可能性があります
- 特定のビューが誤っていくつかのシグナルを無視する非常に現実的な可能性 (API はリンク時に通知できますが、シグナル/スロットは実行時です)
では、カップリングを取り除き、複雑さを抑えるために何を提案しますか? 前もって感謝します。