web-dev-qa-db-ja.com

神のクラスをどのようにリファクタリングしますか?

神オブジェクトをリファクタリングする最良の方法を知っている人はいますか?

高いメソッド結合があるため、いくつかの小さなクラスに分割するほど単純ではありません。 1つのメソッドを引き出すと、通常は他のすべてのメソッドを引き出すことになります。

20
Oliver Watkins

ジェンガみたいです。あなたは忍耐と安定した手を必要とするでしょう、さもなければあなたは最初からすべてを作り直さなければなりません。それ自体は悪いことではありません。コードを破棄する必要がある場合もあります。

その他のアドバイス:

  • メソッドを引き出す前に考えてください。このメソッドはどのデータで機能しますか?それにはどのような責任がありますか?
  • 最初はgodクラスのインターフェースを維持し、新しく抽出されたクラスに呼び出しを委任するようにしてください。結局、神のクラスは独自の論理のない純粋なファサードでなければなりません。次に、便宜上それを保持するか、破棄して新しいクラスのみを使用し始めることができます
  • 単体テストのヘルプ:メソッドを抽出する前に各メソッドのテストを記述して、機能が損なわれないようにします
33

「神オブジェクト」は巨大なクラス(コード行で測定)を意味すると思います。

基本的な考え方は、その関数の一部を他のクラスに抽出することです。

あなたが探すことができるものを見つけるために

  • 一緒に使用されることが多いフィールド/パラメータ。彼らは一緒に新しいクラスに移動するかもしれません

  • クラス内のフィールドの小さなサブセットのみを使用するメソッド(またはメソッドの一部)は、それらのフィールドのみを含むクラスに移動する場合があります。

  • プリミティブ型(int、String、boolean)。それらはしばしば、出てくる前に本当に価値のあるオブジェクトです。それらが値オブジェクトになると、それらはしばしばメソッドを引き付けます。

  • 神オブジェクトの使い方を見てください。異なるクライアントによって使用される異なる方法はありますか?それらは別々のインターフェースに入る可能性があります。これらのインターフェースには、個別の実装がある場合があります。

これらの変更を実際に行うには、次のようなインフラストラクチャとツールを使用する必要があります。

  • テスト:(おそらく生成された)徹底的なテストのセットを用意して、頻繁に実行できるようにします。テストなしで行う変更には細心の注意を払ってください。私はそれらを行いますが、extractメソッドのようなものに制限します。これは単一のIDEアクションで完全に実行できます。

  • バージョン管理:実際に速度を落とすことなく、2分ごとにコミットできるバージョン管理が必要です。 SVNは実際には機能しません。 Gitはそうします。

  • ミカドメソッド:ミカドメソッドのアイデアは、変更を試みることです。それがうまくいくなら。何が壊れているかに注意しない場合は、開始した変更への依存関係としてそれらを追加してください。変更をロールバックします。結果のグラフで、まだ依存関係がないノードでプロセスを繰り返します。 http://mikadomethod.wordpress.com/book/

12
Jens Schauder

ここには本当に2つのトピックがあります。

  • 神のクラスを考えると、そのメンバーはどのように合理的にサブセットに分割されますか?基本的な考え方は、概念の一貫性(クライアントモジュールでの頻繁な共同使用によって示されることが多い)と強制的な依存関係によって要素をグループ化することです。明らかに、これの詳細はリファクタリングされているシステムに固有です。結果は、神のクラス要素の望ましいパーティション(グループのセット)です。

  • 必要なパーティションを指定して、実際に変更を加えます。コードベースにスケールがある場合、これは困難です。これを手動で行うと、パーティションから形成された新しいクラスを呼び出すようにアクセサを変更している間、Godクラスを保持することをほぼ強制されます。そしてもちろん、これらの変更を手動で行うと間違いを犯しやすいので、テスト、テスト、テストする必要があります。 Godクラスへのすべてのアクセスがなくなったら、最終的にそれを削除できます。これは理論的には素晴らしいように聞こえますが、何千ものコンパイルユニットに直面している場合は長い練習が必要であり、これを行う間、チームメンバーにGodインターフェイスへのアクセスの追加を停止させる必要があります。ただし、自動リファクタリングツールを適用してこれを実装することはできます。このようなツールを使用して、ツールにパーティションを指定すると、信頼できる方法でコードベースが変更されます。私たちのDMSはこれを実装できます C++神クラスのリファクタリング そして3,000のコンパイルユニットを持つシステム間でそのような変更を行うために使用されてきました。

0
Ira Baxter