[JAVA] [Memo lesen] Refactoring - Ersetzen von Typcodes (für Typecodes, die das Verhalten beeinflussen) -1

(Was) Welcher Typcode beeinflusst das Verhalten?

Zum Beispiel so.

Geben Sie Code ein, der das Verhalten beeinflusst.java


public int getPayAmount() {
    switch (getType()) {
        case ENGINEER:
            return getMonthlySalary();
        case SALESMAN:
            return getMonthlySalary() + getCommission();
        case MANAGER:
            return getMonthlySalary() + getBonus();
        default:
            return 0;
    }
}

Hier wird der Typcode ermittelt und je nach Ergebnis ein unterschiedlicher Code ausgeführt. Im Allgemeinen entsprechen die Anweisungen "if --other" und "switch" den Teilen, die Gegenstand dieser Zeit sind.

Wenn Sie sich einen solchen Code ansehen, möchten Sie Folgendes tun.

  1. Ersetzen Sie den Typcode durch eine Vererbungsstruktur, die ein polymorphes Verhalten erzielt
  2. Ersetzen Sie die bedingte Verzweigung durch Polymorphismus

(Warum) Warum ersetzen?

Ich versuche, die Teile zu ersetzen, die je nach Beurteilungsergebnis des Typcodes unterschiedlich verarbeitet werden, aber der Vorteil davon ist ↓

★ Sie können dem Client Wissen über das Verhalten unter verschiedenen Bedingungen entfernen.
    =>Infolgedessen wird es beim Hinzufügen einer neuen Variation möglich, nur durch Hinzufügen der Variation zu reagieren.
    =>Ohne Polymorphismus müssten Sie alle vorhandenen bedingten Zweige finden und jedem eine Verarbeitung hinzufügen.
        =>Dies deutet darauf hin, dass zusätzliche Lecks auftreten können, und ist eine Brutstätte für Fehler.

(Wie) Wie ersetze ich es?

Austausch der Unterklasse

Vorher ändern.java


@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch (requestCode) {
        case REQUEST_CODE_FOR_EVALUATION_SEND:
                       //Etwas verarbeiten
            break;
        case REQUEST_CODE_FOR_SMS_SEND_ACTIVITY:
                       //Etwas verarbeiten
            break;
        case REQUEST_CODE_FOR_CAMERA_USAGE:
                       //Etwas verarbeiten
            break;
        default:
    }
}

Nach der veränderung.java


class ActivityResult {
    public static final int REQUEST_CODE_FOR_EVALUATION_SEND = 1;
    public static final int REQUEST_CODE_FOR_SMS_SEND_ACTIVITY = 2;
    public static final int REQUEST_CODE_FOR_CAMERA_USAGE = 3;

    static ActivityResult create(int requestCode) {
        switch (requestCode) {
            case REQUEST_CODE_FOR_EVALUATION_SEND:
                return new ActivityResultEvaluationSend();
            case REQUEST_CODE_FOR_SMS_SEND_ACTIVITY:
                return new ActivityResultSmsSend();
            .. //Gleiches gilt für andere Codes
        }
    }

    private ActivityResult() {}

    abstract int getRequestCode();
}

class ActivityResultEvaluationSend extends ActivityResult {
    @Override
    public int getRequestCode() {
        return ActivityResult.REQUEST_CODE_FOR_EVALUATION_SEND;
    }
}

class ActivityResultSmsSend extends ActivityResult {
    @Override
    public int getRequestCode() {
        return ActivityResult.REQUEST_CODE_FOR_SMS_SEND_ACTIVITY;
    }
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    ActivityResult result = ActivityResult.create(requestCode);
    // @Implementieren Sie den Prozess im ToDo-Ergebnis.
}

Sie haben es jetzt durch eine Unterklasse ersetzt. Dies ist nicht die endgültige Form dessen, was ich tun wollte, aber da es danach zu Polymorphismus wurde, würde ich jeden Prozess in jeder Unterklasse implementieren. Ich werde es jedoch separat schreiben.

Recommended Posts

[Memo lesen] Refactoring-Typecode ersetzen (für Typecodes, die das Verhalten beeinflussen) -2
[Memo lesen] Refactoring - Ersetzen von Typcodes (für Typecodes, die das Verhalten beeinflussen) -1
Ein Memo für mich, dass Objektorientierung etwas ist