設計のアンチパターン:機能的分解

名前:機能的分解(機能的分解)

その他の名前:オブジェクト指向AntiPatternなし「OOなし」

スケール:アプリケーション

リファクタリング:オブジェクト指向リエンジニアリング



関数分解は、アプリケーションを個別の機能モジュールに分割できるため、手続き型プログラミングの優れたプラクティスです。



残念ながら、機能の分解をクラス階層に直接反映することはできないため、記事で説明されている問題が発生することがあります。



多くの場合、手続き型プログラミングの経験豊富な開発者がオブジェクト指向言語でプログラムを設計および実装し始めると、アンチパターンが現れます。 開発者が他のサブルーチンを呼び出すメインサブルーチンを使用することに慣れている場合、クラス階層を完全に無視して、各サブルーチンをクラスとして実行する傾向があります(一般に、オブジェクト指向のアプローチ)。



結果のコードは、クラスとして実装された構造化プログラミング言語の構造に似ています。 そのようなコードは非常に複雑になる可能性があります。経験豊富な開発者は、オブジェクト指向アーキテクチャで昔ながらの手続き型プログラミング手法を繰り返す賢い方法を思いつくことができます。



CプログラマーがC ++で記述を開始するとき、またはCORBAインターフェイスを接続しようとするときに、ある種のオブジェクトテクノロジーを使用しようとするときに、アンチパターンに遭遇することがよくあります。 長い目で見れば、オブジェクト指向技術の学習に時間を費やすよりも、オブジェクト指向思考でプログラマを雇う方が簡単な場合があります。



アンチパターンの外観と結果の兆候





典型的な原因





例外



オブジェクト指向のソリューションが必要ない場合は、機能の分解は受け入れられます。 この例外は、オブジェクト指向のインターフェイスを提供するために、本質的に純粋に機能的なソリューションがクラスでラップされている場合にも適用できます。



リファクタリング



それでもソフトウェアの初期基本要件を決定できる場合は、ユーザーの観点から最も重要なソフトウェア機能を記述する分析ソフトウェアモデルを作成する必要があります。 これは、コードベースのほとんどのソフトウェア構成の目的を決定するために非常に重要です。 アンチパターンリファクタリングのすべての段階で、行われた変更を詳細に文書化する必要があります。これにより、将来システムに同伴する人の生活が楽になります。



次に、既存のシステムの主要部分を含む設計モデルを作成します。 モデルの改善ではなく、できるだけ多くのシステムを記述するための基礎を作成することに焦点を当てます。



理想的な場合、設計モデルはほとんどのソフトウェアモジュールの存在を正当化します。 既存のコードベースの設計モデルを開発することは非常に重要です-プロセスは、システムが全体としてどのように機能するかを理解します。



システムの一部がすでに未知の理由で存在することを期待することは論理的です。 設計モデルから外れたクラスの場合、次の規則を使用します。



アーキテクチャを調べ、同様のサブシステムを見つけます-これらは再利用の候補です。 プログラムの保守の一環として、コードベースをリファクタリングして、同様のサブシステムでコードを再利用します(リファクタリングの詳細な説明については、スパゲッティコードアンチパターンソリューション(「スパゲッティコード」)を参照してください)。





機能分解の基礎は、たとえばJackson構造化プログラミング(JSP)メソッドを使用して、データ操作を実行する関数の順次呼び出しです。 多くの場合、関数はオブジェクト指向のコンテキストのメソッドです。 関数の分布は、異なるOOPパラダイムに基づいており、クラス内の関数と関連データの異なるグループ化につながります。



次の図の簡単な例は、クライアントのローン計算シナリオの手順バージョンを示しています。



計算シナリオ:

  1. 新しい顧客を追加します。
  2. クライアントアドレスを更新します。
  3. バイヤーのローンを計算します。
  4. ローン金利を計算する
  5. ローンの返済スケジュールを計算します。
  6. 新しい支払いスケジュールを保存します。


次の図は、ローン計算アプリケーションのオブジェクト指向ビューを示しています。 手続き関数はオブジェクトメソッドにマッピングされます。



関連ソリューション



システムの開発にすでに多くの労力が費やされている場合は、Blobアンチパターン問題の代替ソリューションに似たアプローチをとることができます。

クラスの階層全体を一度にボトムアップでリファクタリングする代わりに、クラス「メインサブプログラム」をクラス「コーディネーター」に拡張し、システムのすべての機能を管理できます。

次に、機能クラスを組み合わせて、その機能の一部を「コーディネーター」クラスに転送することにより、機能クラスを準オブジェクト指向クラスに変換できます。 結果は、より効率的なクラス階層になります。



All Articles