2013-02-14 15 views
18

誰でも神オブジェクトをリファクタリングする最良の方法を知っていますか?あなたはどのように神のクラスをリファクタリングしますか?

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

+2

これは答えることが、むしろ不可能です。 – jahroy

答えて

30

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

その他のアドバイス:

  • 方法を抜く前に考える:どのようなデータに、この方法では動作しませんか?それにはどのような責任がありますか?
  • 最初にgodクラスのインターフェイスを維持し、新しい抽出されたクラスに呼び出しを委任しようとします。結局のところ、神の階級は自分の論理を持たない純粋なファサードでなければなりません。そして、あなたは利便性のためにそれを保つことができるか、それを捨てると、新しいクラスにのみ
  • ユニットテストのヘルプの使用を開始する:あなたは、私が想定した機能
+0

ユニットテストに関するアドバイス。しかし、私は実際に方法を解き放つ方法が本当に必要です。多額のケースに依存問題 –

+0

の核心のthats。残念ながら(「適切な[リファクタリングパターンを使用する」(http://www.refactoring.com/catalog/index.html)以外の)1つのすべてのレシピはありません。 –

+2

私はそれをファサードに変換する考えが好きです。これはJengaの部分を互いにサポートするのに役立ちますが、リファクタリングを前進させます。 –

11

を壊さない保証するために、それを抽出する前に、各メソッドのテストを書きます「神の目的」は、巨大なクラス(コード行で測定)を意味します。

基本的な考え方は、その機能の一部を他のクラスに抽出することです。あなたがよく一緒に慣れる

  • フィールド/パラメータを探すことができ、それらを見つけるために

    。それらは一緒に新しいクラスに移動するかもしれません。クラス内のフィールドの小さなサブセットのみを使用するメソッド(またはメソッドの一部)は、それらのフィールドだけを含むクラスに移動する可能性があります。

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

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

    • テスト:あなたが頻繁に実行することができます準備ができてテストの(おそらく生成)徹底的なセットを持って、実際にあなたがあなたのコマンドでいくつかのインフラストラクチャとツールを持っている必要があり、これらの変更を行うための

    。テストなしで行う変更には十分注意してください。私はそれらを行いますが、抽出メソッドのようなものに制限します。これは、単一のIDEアクションで完全に行うことができます。

  • バージョン管理:バージョンコントロール:2分ごとにコミットできるようにするバージョンコントロールが必要です。 SVNは実際には機能しません。うん。

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

0

始める前に: はどのようにあなたが神クラスが悪いご存知でしたか?

または少なくともあなたは神クラスを測定する方法?

は良いビッグクラスと悪い神クラス間の境界との違いを探してみてください。例えば

:いくつかの余分なヘルパーを持つクラス、プロパティ、および内蔵のutilの-方法は、将来的には神クラスすべき候補であるが、それはまた、コードの非常に良い作品です。

私は神クラスはちょうど忘れたり、延期リファクタリングの大きなクラス本体が、時間によって成長しているリファクタリングの理由であると信じています。ここ

一般的アドバイスの使い方です:

  • 継承とミックスイン、
  • 代表団:、
  • (例:utilsのファイル、外部のクラス、API /ファサードに)分割クラス:サブクラスを追加したり、
  • は固体のように、良好なパターンを使用して、関連するクラス、自分でリファクタリングの芸術を開発
関連する問題