web-dev-qa-db-ja.com

デカップリングは特定の状況で保守性を損なう可能性がありますか?

ビジネスロジックが実装ではなくインターフェイスにマップされているという事実は、特定の状況でアプリケーションのメンテナンスを実際に妨げる可能性がありますか?

JavaのHibernateフレームワークの素朴な例は、たとえば(コードベース全体が頭の中にない場合、プロジェクト構造は混乱し、クラスには任意の名前が付けられます)、何が何であるかを確認したい場合です。特定のDAOで、データサービスが呼び出されたポイント(実装の詳細がないインターフェイスでツリーが終了する場所)からツリーを逆方向にトラバースする代わりに、実際に想定どおりに動作しているかどうかを確認します。署名以外は何でも)たとえば、実際の実装の詳細にアクセスする前に、構成XMLファイルを探して、実装として上記のインターフェイスにマップされているクラスを確認する必要があります。

疎結合があると実際に保守性が損なわれる可能性がある状況はありますか?

5
Ceiling Gecko

トレードオフはソフトウェア設計に固有のものです。結合を減らすと、ほとんどの場合、コードが最終的に依存する具体的な実装を見つけることが難しくなります。その実装を変更して個別にテストすることが容易になり、具体的な実装を見つけるために必要な時間が最小限に抑えられ、変更による波及効果が最小限に抑えられるため、このコストを受け入れます。だまされてはいけません。コストを支払う価値があるからといって、それがないという意味ではありません。

2
Karl Bielefeldt

インターフェースへのコードの開発は、コードを書き直したりリファクタリングしたりすることなく変更を加えることができるため、私が知る限り推奨されています。

そうは言っても、疎結合があると保守性がある程度損なわれる可能性があると私は信じています。私が見ている主な問題は、人々が以前の方法で何をしていたかを見失う可能性があることです。これは、問題をデバッグするときに頭痛の種になる可能性があります。過度に単純化された例は次のとおりです。

public class Login
{
     public void verifyLogin(...)
     {
         if(VerifyUtlis.isUserValid(...))
         {
             //redirect to home 
         }
         //redirect to somewhere else
     }
}

public class FTPHandler
{
     public void verifyLogin(...)
     {
         if(VerifyUtlis.isUserValid(...))
         {
             //redirect to home 
         }
         //redirect to somewhere else
     }
}

public class VerifyUtils
{
     public boolean isUserValid(...)
     {
         ...
     }
}

VerufyUtilsでコードをデバッグするとき、開発者(おそらく参加したばかりの人)は、どこから来たのかを追跡するのが難しいかもしれません(確かに、上記は単純化されすぎていますが、物事がどのように行われるかを理解してください100個のクラスが相互に呼び出しているときに取得します)。

開発者がどこでどの方法が使用されているかを追跡するのに苦労する可能性がある場合、開発者が行う変更は、アプリケーションを不安定にする可能性があります。したがって、疎結合アプローチを採用する場合は、使用しているコードと行った変更が文書化されていることを確認してください。何千もの単語を含める必要はありませんが、通常、(コードが何をしているのかを説明するコメントを書くのではなく)物事が現状のままである理由を説明することは、疎結合システムの範囲を維持するのに役立ちます。

1
npinti