3

Event インターフェイスを変更できない場合、次のメソッドをリファクタリングする方法は? PMD は複雑すぎると報告し、findbugs は ITC_INHERITANCE_TYPE_CHECKING を報告します。3、4、5などのマジックナンバーもあります。

 public int getEventCode(Event event) {
        if (event instanceof OneEvent) {
            return 1;
    }
        if (event instanceof TwoEvent) {
            return 2;
        }
        if (event instanceof ThreeEvent) {
            return 3;
        }
        if (event instanceof FourEvent) {
            return 4;
        }
        if (event instanceof FiveEvent) {
            return 5;
        }
        if (event instanceof SixEvent) {
            return 6;
        }
        if (event instanceof SevenEvent) {
            return 7;
        }
        if (event instanceof EightEvent) {
            return 8;
        }
        if (event instanceof NineEvent) {
            return 9;
        }
        if (event instanceof TenEvent) {
            return 10;
        }
        return event.getClass().hashCode() + 10;
    }
4

4 に答える 4

3

List<Class<?>>たとえば、次のように使用できます。

private static final List<Class<? extends Event>> EVENT_CLASSES
    = Arrays.asList(OneEvent.class, ...);

それで:

public int getEventCode(final Event event)
{
    final Class<? extends Event> c = event.getClass();
    final int index = EVENT_CLASSES.indexOf(c);
    return index != -1 ? index + 1 : c.hashCode() + 10;
}

注: イベントは派生ではなく、正確なクラスである必要があります (つまり、ではOneEventありませんOneDerivedEvent)。それ以外の場合、テストはもう少し複雑になりますが、それでも実行可能です。

に関して:

findbugs レポート ITC_INHERITANCE_TYPE_CHECKING

instanceofはい、チェックのせいです。

ただし、そもそもコードに根本的な欠陥があります。が2 つの異なる JVM 実行間で同じ値を返すという保証はありません.hashCode()。さらに、負の値を返すこともできます。つまり、たとえば値として -4 を返すことができます。つまり、「その他のイベント」に対して 6 が返されるため、 と競合しSixEventます。

リファクタリングを検討してください!

于 2013-07-05T09:11:32.947 に答える
1
public int getEventCode(OneEvent event) {
    return 1;
}
public int getEventCode(TwoEvent event) {
    return 2;
}
// etc.

これは良くありませんが、Event クラスを変更できない場合は、おそらくこれが要件に対応する最もオブジェクト指向の方法です。これは、問題のクラスを変更せずに、条件付きをポリモーフィズムに置き換えています

于 2013-07-05T15:27:58.483 に答える
0

これらの型ブロックは、コード ベースの周りにいくつかありますか? もしそうなら、条件付きをポリモーフィズムに置き換えるhttp://refactoring.com/catalog/replaceConditionalWithPolymorphism.htmlが役立つかもしれません。

于 2013-07-05T09:11:35.190 に答える