依存関係の自動登録が悪い理由

画像



さまざまなプログラミング言語用のSimpleInjectorタイプのプロジェクトが多数あり、クラス、インターフェイス、名前付け、場合によってはフォルダーの名前で、この機能によって統合されたクラスまたはクラスのグループ全体を登録できる場合があります。これは、依存関係を明示的に指定せずにオブジェクトを自動的にインスタンス化する目的で行われます。さらにインスタンス化する目的で、レジスタ内の共通機能によるオブジェクトのグループのこの登録を、依存関係の自動登録と呼びます。



依存関係レジスタにクラスを登録するときにクラスを明示的にインスタンス化する場合、これはこの記事のトピックではありません。



そして、それの何が問題になっていますか?



この投稿では、自動依存関係登録を使用するプロジェクトに対する私の不満について説明します。順番に行きましょう。



ランタイムとコンパイル時間



自動依存関係登録ツールを使用して、登録された依存関係の完全性のチェックを実行時に移動します。つまり、プログラムの起動時に、コードの実行に必要なインターフェイスの実装がない場合は、アプリケーションの開始時に、最悪の場合、システムの操作中およびユーザーから、それについて学習します。



これが例です。プロジェクトで、たとえば名前名によっていくつかのクラスが登録されていて、ある時点でクラスをそこから移動した場合は、実行時に問題について学習します。インターフェースを介した自動登録でも同じことが起こりますが、移動は問題になりませんが、インターフェースを削除すると問題が発生します。これについては、アプリケーションの起動後に学習します。



リファクタリングははるかに複雑です



リファクタリングだけでなく、コードの学習も非常に困難になります。これは、依存関係の自動登録を使用すると、開発環境の最新機能へのアクセスが失われるためです。これにより、ワンクリックでこのクラスを使用しているユーザーを特定し(参照を検索)、次の質問に答えることができます。



  • このクラスを削除できますか?
  • このクラスを別の名前名/フォルダーに移動できますか?






コンパイル中に必要な依存関係の完全性をチェックする機会が奪われているという事実に加えて、リファクタリングは、テスト、依存関係ツリーの検証などの形式のランタイムメカニズムがあることを期待しています。そして、それが機能することを願っています。これらのメカニズムは、コードの構成が正しいことを100%保証するだけでなく、コンパイルよりもはるかに遅いことに注意してください。



システムの本当の複雑さを隠す



クラスとそのすべての依存関係を手動でインスタンス化する場合、このすべてのアクションが実行されるファイルの巨大さにかなりおびえているかもしれません。クラスをインスタンス化するための数千行のコードを見て、自動依存関係登録を使用するときにそれらを数十と比較すると、私は本当に誘惑に負けて「ダークサイド」に行きたいと思います。



しかし、これらの数千行のオブジェクトインスタンス化コードは何を教えてくれますか?このモジュールは複雑で大規模であるため、サブモジュール(依存関係を明示的にインスタンス化する)を割り当てて構造化するか、このモジュールをいくつかに分割することを検討する必要があります。



抽象的に見えるかもしれませんが、何百ものオブジェクトをインスタンス化するなどの厄介な瞬間を目から取り除くと、プロジェクトのサイズが制御不能に大きくなり、その結果、複数のプロジェクトに分割する必要がある瞬間を逃してしまいます。



追加の依存関係



依存関係を登録し、その使用を制御しないことにより、遅かれ早かれ、アプリケーションの起動時に、実際に必要な数よりもはるかに多くのクラスが登録される状況になります。通常、フォルダに追加したり、インターフェイスを実装したりするだけで、このクラスが登録される可能性があります。



概要



これらすべての不利な点を抱えて生き、それらに気付かないことは可能ですか?承知しました!しかし、私はそれが間違った開発習慣を発達させると信じています。重要なのは、コードのコンパイルと入力は、システムの正確さをチェックするためのツールであるということです。それらを拒否すると、システムが壊れやすくなるという結論に達したため、開発者はシステム内の何かを変更することを恐れています。また、開発者がコードを変更することへの恐れは、コードベースの品質が低下するという事実にすでにつながり、その後、そのようなコードに変更を加えるのはコストのかかるプロセスになります。



自動依存関係登録の良い点は何ですか?



そして本当に、何が良いのでしょうか?この方法が人気を博した理由についてコメントで議論することを提案します。確かに彼は読者の中にファンがいます。



All Articles