[JAVA] [Memo lesen] Refactoring-Typecode ersetzen (für Typecodes, die das Verhalten beeinflussen) -2

Was? Zustandsmuster?

https://qiita.com/takutotacos/items/654e204d618d2059de7f Es geht darum, etwas Ähnliches zu tun.

Ich möchte ↑ tun, aber dieses Muster verwenden, wenn sich der Typcode während der Lebensdauer des Objekts ändert. Es ist eine Unterklassifizierung, die Änderungen im Typcode verarbeiten kann.

Wie machst du das?

Vorher ändern.java


class Employee {
    static final int ENGINEER = 0;
    static final int SALESMAN = 1;
    static final int MANAGER = 2;

    private int type;

    public Employee(int type) {
        this.type = type;
    }

    int payAmount() {
        switch (type) {
            case ENGINEER: return monthlySalary;
            case SALESMAN: return monthlySalary + commission;
            case MANAGER : return monthlySalary + bonus;

        }
    }
}

Ich möchte die obige switch-Anweisung loswerden. Implementieren Sie zu diesem Zweck Folgendes.

Nach der veränderung.java


class Employee {
    private EmployeeType type;

    int getType() {
        return type.getType();
    }

    void setType(int type) {
        this.type = EmployeeType.newType(type);
    }
}

abstract class EmployeeType {
    public static final int ENGINEER = 0;
    public static final int SALESMAN = 1;
    public static final int MANAGER = 2;

    static EmployeeType newType(int code) {
        switch (code) {
            case EmployeeType.ENGINEER: return new Engineer();
            case EmployeeType.SALESMAN: return new Salesman();
            case EmployeeType.MANAGER : return new Manager();
            default: throw new IllegalArgumentException("Unzulässiger Mitarbeitercode");
        }
    }

    abstract int getType();
}

public class Engineer extends EmployeeType {
    @Override
    int getType() {
        return EmployeeType.ENGINEER;
    }
}

class Salesman extends EmployeeType {
    @Override
    int getType() {
        return EmployeeType.SALESMAN;
    }
}

class Manager extends EmployeeType {
    @Override
    int getType() {
        return EmployeeType.MANAGER;
    }
}

Wenn danach die Gehaltsberechnungslogik in jeder Unterklasse implementiert ist, gibt es keine bedingte Verzweigung von der Clientklasse außer der Objekterstellung. In diesem Fall werden Sie anscheinend nicht vergessen, die Logik zu implementieren, selbst wenn Sie die Arten von Unterklassen erhöhen. Selbst wenn Sie beim Erstellen eines Objekts vergessen, der switch-Anweisung eine Unterklasse hinzuzufügen, wird ein Fehler ausgegeben und beendet, sodass Sie leicht erkennen können, dass Sie die Implementierung vergessen haben, was das Programm zu einem einfach zu debuggenden Programm macht.

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