依存とは
たとえばユーザープログラマーがライブラリのクラスを使う時、このユーザーの書いたコードはそのライブラリに依存します。
ライブラリがバージョンアップした場合、ユーザーはそれに対応するためにコードを書き直す必要にせまられることがあります。これを「ユーザーのコードはそのライブラリに依存している」と言います。
しかし逆に、ユーザがいくら自分のコードをバージョンアップしても、ライブラリの作者はライブラリに手を入れる必要はありません。これを「そのライブラリはユーザーの書いたコードに依存していない」と言います。
相互依存
このように依存が片方から片方の場合、依存している方のバージョンアップに依存されている方は付き合う必要がありません。
しかし、お互いに依存した場合はどうなるでしょうか?
特に結合が密であればあるほど問題は深刻になりますが、片方がバージョンアップすればもう片方はそれに従ってバージョンアップしなければいけません。
するとそのバージョンアップに従ってもう片方が更にバージョンアップし、それに従ってもう一方的が更に更にバージョンアップし……と、さながらトランプの塔のように、どこか一カ所崩れたら全て崩れる様相になります。
これが相互依存です。
これを避けるため、プログラマーはコードをモジュール化し、相互依存を無くし、結合を疎にするのです。
View と ViewModel
さて View と ViewModel の関係ですが、V は VM のメソッド(あるいはコマンド)を呼び、プロパティを変更します。ユーザーコードがライブラリを呼ぶのと同じ関係ですね。つまり、V は VM に依存します。
ここで VM が V に依存するとどうなるでしょうか。
相互依存になりますね。
相互に依存しても最初のうちは問題になりません。しかし、後から手を入れる際の労力が半端なく大きいものになる可能性があります。