2009-10-26 23 views
5

私は盲目的に "ベストプラクティス"に従うことで、ベストプラクティスを厳密に守っている悪ふざけの悪ふざけにつながる可能性があることを知っています。固体の原則はそれだけです、の原則です。それらはすべての状況に当てはまるわけではありませんが、コード内で改善が得られる可能性については、依然として非常に優れたヒューリスティックです。SOLIDの原則にどの程度厳密に従っているかを報告する静的解析ツールはありますか?

これらの弱点は、ソースコードを深く分析して適用する必要があることです。私は、ほとんどのプログラマーのように、より効率的な方法を探していますので、SOLIDの原則(またはその欠如)の適用をテストしようとする分析ツールについて誰かが耳にしていれば、私は不思議です。

SRPシングル責任 原則

クラスは 変化に一つだけの理由があるはずです。

OCPオープン・クローズ 原理

ソフトウェアエンティティ(クラス、モジュール、 機能など) 拡張のために開いている必要がありますが、 変更のため閉鎖。

LSPリスコフ 置換原理

サブタイプは その基本タイプの置換可能でなければなりません。

ISPインタフェース 棲み分け原理

クライアントは、彼らが使用していない方法により に依存することを強制すべきではありません。 インターフェイスはクライアントに属し、 階層には属しません。

DIP 依存関係逆転の原則

抽象化は 詳細に依存してはいけません。詳細は、 抽象に依存する必要があります。

-fromアジャイル原則、パターンとプラクティス

+0

*ソースコードを深く分析して適用することが必要な場合があります。*コードの分析(深度に関係なく)で十分であれば、そのようなツールも可能ですが、十分ではありません。 – Wolf

+0

@Wolfその特定の文章の文脈において、私は理解、洞察、直感に基づいた人間分析を意味しました。 –

+0

あなたは、後で自動的に存在が確認される人間のコード分析から取得されたパターンを意味しますか? – Wolf

答えて

7

私は原則が尊重されている場合は自動静的解析が判断できないと思います。 このようなツールを書くには、各コンセプトが意味するものを正式に定義し、それをどのコードに対してもチェックする方法が必要です。あなたは責任の概念をどのように形式化しますか?私は個人的には分かりません。

つまり、違反の可能性を検出するためのツールを用意することができます。 たとえば、クラスあたりのメソッド数、クラスあたりのメンバー数などのコードメトリックを使用して、クラスが大きすぎてSRPに違反する可能性があるかどうかを判断できます。

例外はLiskov置換原則かもしれません。 IFすべてのメソッド(前提条件、事後条件、不変条件)でコントラクトを定義すると、スーパークラスのメソッドを再定義するメソッドが前提条件を強化しないこと、後条件を弱めたり、不変条件を尊重しないことを確認できます。スーパークラスのメソッド私はツールESC/Javaがこれらのチェックを実行すると思います。 wikipedia page about LSPを読むと、より多くのチェックを実行する必要があります。

3

私の答えには、.NET固有の製品が含まれています。事前にお詫び申し上げます。誰かが非.NETアナログを提案する可能性があります。

私はNDependを試してみると、それはのような指標を使って、SRPとISPの違反に私を導くことができるかどうかを確認したい:

  • 異常に高い数字を持つタイプの種類ごとのメソッドの数アセンブリおよびタイプレベルでの方法
  • 求心/遠心性結合
  • 他のメトリック、full list of metrics here

DIPとLSPの違反は、プログラマーの意図に関係するため、追跡が難しい場合があります。解析ツールはタイプ間の関係を識別できますが、あるクラスがRectangleから不適切に由来するSquareの別のクラスを本当に拡張する状況をどのように伝えることができますか?あるいは、適切に設計されたプログラムでは、AはBに依存していて、それ以外のところに依存してはいけませんでしたか?

OCPは、クラスを開いたり閉じたりする拡張/変更が必ずしも行われていない可能性があるため、別の課題となります。

我々は(科学的にこの主張を証明すると、この問題が何であるかではありません)より保守製品にSOLIDリードを、以下のことを信じている場合は、その後、NDependのの抽象性・不安定性チャートは、どれだけの良い集計措置を与える必要がありますソフトウェアモジュールごとに原則が適用されました。もしそうなら、モジュールはチャートの左下隅を避けて、 "The Zone of Pain"と呼んでいたはずです。そのゾーンでは、モジュールは安定しています(良い方法ではなく、あまりにも多くのモジュールが依存するため、変更するのは難しいですが)。

関連する問題