2012-04-05 3 views
1

私は非常に大きく肥大したクラスを持っています。私はそれを別々のファイルに分割したいのですが、そのクラスを使用する既存のプロジェクトと互換性があり、ユーザーには完全に透過的でなければなりません。

特に私は自分自身のImageMatrixクラスを持っており、単項関数のトン、スカラーのバイナリ関数のトン、別のイメージのバイナリ関数のトンなどを定義します。クラスをきれいに保つために、私はオペレータの各クラスを別々のファイルに入れることを望みます。

これらのメソッドをファイルにカット/ペーストしてソースに含める方法はありますか?

だから私は、私はまだこれを行うことができますことを願ったが、方法は実際には別のファイルに存在します、

ImageMatrix img = new ImageMatrix(800, 600, 3); 
    img.clear(0.5f, 0.0f, 0,0f); 
    img.addSelf(anotherImg); 
    img.normalize(); 
    img.abs(); 
    img.addSelf(0.5); 

実装は非常にパフォーマンスが最適化されているので、それぞれの方法は、コードの周りに15〜30行ですそのようなものはBufferedimageや単純なint []で達成することは不可能です。同様の方法をまとめる主な理由は、コードの重複が多いことです。関数を追加したり、エラーチェックなどのグローバル動作を変更したりすると、簡単に一貫性を保つことができます。

答えて

1

デリゲートメソッドを使用することもできます。つまり、メソッドの定義はまだImageMatrixですが、別のクラスに実装されています。メソッドの複雑さによっては、コードの量がImageMatrixに減少する可能性があります。

class ImageMatrix { 

    MatrixHelperOne helperOne = new MatrixHelperOne(); 

    ... 

    public void complexMethod1(Arg arg) { 
     helperOne.complexMethod1(arg); 
    } 

    ... 
} 
+1

これは最善の方法のように聞こえる。 ImageMatrixから呼び出された静的メソッドを使用して外部クラスを作成します。 –

2

残念ながら、Javaクラス定義を複数のファイルに分割することはできません。

コードを再構成して、巨大なクラス定義が不要になるようにしてください。しばしば、ゲッターとセッターのメソッドでいくつかの状態を公開し、これらのメソッドを使用してメインクラスに機能を追加するサポートクラスを作成することを意味します。

あなたの場合は、ImageFiltersなどのサポートクラスを追加することを検討してください。ごく小さいクラスが好きな場合は、ImageNormalizerのようにさらに狭くすることもできます。

+2

私はこの文脈では「残念なことに」とは言いません。 – bezmax

+0

コンパイル時にインラインメソッドを呼び出すことが重要な仮想マシンコードのように、便利な場合がいくつかあります。 –

1

ファイル間でJavaクラスを分割することはできません。あなたができることは、それぞれのメソッドが自己完結型である場合、静的メソッドを使ってクラスを作成できるということです。ですから、ある程度コードをカット&ペーストするだけです。

+0

私はそれについて考えましたが、それはユーザーにとって透過的ではありません。しかし、phlogratosの答えに従って、私はとにかくこれを行いましたが、メインクラスのデリゲートメソッドも作成したので、それは透過的になりました。 –

+0

@ Zom-B:そうですね、私は「ある程度」と言いました。そして、すべてのものに対して大きなラッパークラスを実装しなければなりませんでした。 – npinti

1

まあ、より一般的なクラスを作成してより一般的なメソッドを追加してからImageMatrixに拡張することができます。また、行列操作関数がたくさんある場合は、コードの重複、つまり共通コードをauxメソッドに移動して別の場所から呼び出すのではなく、異なるメソッドで同じコードを繰り返すことになります。

関連する問題