refaktoryzacja if-ów w metodzie

0

Cześć, chciałbym poprawić swój kod i zmienić if-y w metodzie:

public void widgetSelected(SelectionEvent e) {

        try {
            technicalread = new TechnicalNoteRead(this);
        } catch (IOException ex) {
            ex.printStackTrace();
        }

    // Device choose start  
        if (TechnicalNote.rbDevice.getSelection() && TechnicalNote.rbNecessary.getSelection() && TechnicalNote.rbMechanical.getSelection() && TechnicalNote.rbPolish.getSelection())
        {
            TechnicalNote.cbElement.setItems(technicalread.getMyDeviceNecessaryPL());
            TechnicalNote.cbDescription.setItems(technicalread.getMyDeviceMechanicalPL());
        }

        else if (TechnicalNote.rbDevice.getSelection() && TechnicalNote.rbRecommended.getSelection() && TechnicalNote.rbMechanical.getSelection() && TechnicalNote.rbPolish.getSelection())
        {
            TechnicalNote.cbElement.setItems(technicalread.getMyDeviceRecommendedPL());
            TechnicalNote.cbDescription.setItems(technicalread.getMyDeviceMechanicalPL());
        }

        else if (TechnicalNote.rbDevice.getSelection() && TechnicalNote.rbAccessories.getSelection() && TechnicalNote.rbMechanical.getSelection() && TechnicalNote.rbPolish.getSelection())
        {
            TechnicalNote.cbElement.setItems(technicalread.getMyDeviceAccessoriesPL());
            TechnicalNote.cbDescription.setItems(technicalread.getMyDeviceMechanicalPL());
        }

        else if (TechnicalNote.rbDevice.getSelection() && TechnicalNote.rbNecessary.getSelection() && TechnicalNote.rbMechanical.getSelection() && TechnicalNote.rbEnglish.getSelection())
        {
            TechnicalNote.cbElement.setItems(technicalread.getMyDeviceNecessaryEN());
            TechnicalNote.cbDescription.setItems(technicalread.getMyDeviceMechanicalEN());
        }
}

ogólnie każdy if zależny jest od stanu czterech Radio Buttonów, czyli musiałbym napisać 4 klasy i każda zwracała by stan,tak?
potem co dalej? mogee prosić o podpowiedzi jak by to zrobiliście? może przykład na podstawie tego kodu?
przeczytałem już troche przykładów w sieci, ale dalej jest to dla mnie nie do końca zrozumiałe ;/

2

Np tak:

public void widgetSelected2(SelectionEvent e) {
        try {
            technicalread = new TechnicalNoteRead(this);
            if (isMechanical()) {
                if ( isPolish()) {
                    TechnicalNote.cbDescription.setItems(technicalread.getMyDeviceMechanicalPL());
                    if  (isNecessary()) {
                        TechnicalNote.cbElement.setItems(technicalread.getMyDeviceNecessaryPL());
                    } else  if (isRecommended() ){
                        TechnicalNote.cbElement.setItems(technicalread.getMyDeviceRecommendedPL());
                    } else if (isAcccessories()) {
                        TechnicalNote.cbElement.setItems(technicalread.getMyDeviceAccessoriesPL());
                    }
                }
                if ( isEnglish()) {
                    if  (isNecessary()) {
                        TechnicalNote.cbElement.setItems(technicalread.getMyDeviceNecessaryEN());
                        TechnicalNote.cbDescription.setItems(technicalread.getMyDeviceMechanicalEN());
                    }
                }
            }

        } catch (IOException ex) {
            throw new RuntimeException(ex);
        }
    }

    private boolean isAcccessories() {
        return TechnicalNote.rbAccessories.getSelection();
    }

    private boolean isRecommended() {
        return TechnicalNote.rbRecommended.getSelection();
    }

    private boolean isNecessary() {
        return TechnicalNote.rbNecessary.getSelection();
    }

    private boolean isEnglish() {
        return TechnicalNote.rbEnglish.getSelection();
    }

    private boolean isPolish() {
        return TechnicalNote.rbPolish.getSelection();
    }

    private boolean isMechanical() {
        return TechnicalNote.rbDevice.getSelection() && TechnicalNote.rbMechanical.getSelection();
    }
  1. podstawa to wywalenie ZBRODNICZEJ obsługi(?) błędu. Co się stanie jak poleci IOException? Walimy komunikatem i idziemy dalej mając nieustawione technicalread. W najlepszym razie NullPointerException, w najgorszym lecimy mając jakieś przypadkowe ustawienia (z poprzedniego wywołania).

  2. Warto warunki w ifach nazywać - wtedy zaczyna być widać zależności, nazywanie przeprowadzamy wydzielając je do metod.

  3. Szukamy częsci wspólnych. Sprawdzamy co ustawiamy niezależnie od pozostałych kombinacji - np. widać było, że zawsze jak jest wybrane polish (i mechanical) to masz
    TechnicalNote.cbDescription.setItems(technicalread.getMyDeviceMechanicalPL());, można to dac przed inne ify.

  4. Uwaga technicalread pewnie zamiast polem powinna być zmienną lokalną.

0

Dziękuje za pomoc i wyjaśnienie:)

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0