Auslagerung von verschachtelten Schleifen

budi

Mitglied
Servus,

ich hätte eine Frage an euch und zwar, ob man irgendwie in Java verschatelte Schleifen auslagern kann?
Ich bräuchte die Code-Fragmente noch an ein paar anderen Stellen im Code. Hier der Code:
Java:
final List<ShelfConfig> shelfList = ModelProvider.getInstance().getIntronDPlusConfiguration().getShelfConfig();
        for (final ShelfConfig shelf : shelfList)
        {
            final List<CTStation> stationList = shelf.getStationTable().getDigitalStationOrAnalogStationOrDioStation();
            for (final CTStation station : stationList)
            {
                final List<KeyPad> keypadList = station.getKeyPadTable().getKeyPad();
                for (final KeyPad keyPad : keypadList)
                {
                    final List<CTButton> buttonList = keyPad.getButton();
                    for (final CTButton button : buttonList)
                    {
                        if (!button.getCallAttr().isEmpty())
                        {
                            final List<CTCallAttr> callList = button.getCallAttr();
                            for (final CTCallAttr callAttr : callList)
                            {
                                if (isKeyUsingInDestKey(grKey, callAttr))
                                {
                                    return true;
                                }
                            }
                        }
                    }
                }
            }
        }

Ich wandere in diesen Schleifen in meiner Datenstruktur bzw. einem XML-Tree und lese meine Daten aus. Ich würde jetzt sehr gerne die 5 verschatelten Schleifen auslagern und die letzte if-Anweisung an einer anderen Stellen anders implementieren.

Ist das in Java möglich?
 

budi

Mitglied
ähm, ja im Moment will ich nur diese Verschatelungstiefe auslagern,
um auf der untersten Ebene verschiedene Dinge mit meinen Daten zu tun.
 
M

maki

Gast
wenn sie unterschiedliche dinge tun müssen, ja
Wieso, Methoden müssen nicht wiederverwendet werden oder unterschiedliche Dinge tun um ausgelagert ("extrahiert" )zu werden, entspricht modernen Best-Practices in jeder Methode höchstens eine "Einrückung" (zB. Schleife) zuzulassen, und die besten Methoden sind 1-3 Zeilen lang und haben einen aussagekräftigen Namen.
 

budi

Mitglied
Ja ich kenne beide. Das von "Clean Code" habe ich schon gelesen und an dem anderen bin ich im Moment dran. Mit Eclipse lässt sich sowas ja total einfach "extrahieren".

Hier die Zerlegung in Methoden:
Java:
public final void deleteSrcKeyInAllButtons(final String key)
    {
        getAllShelfs(key);
    }

    private void getAllShelfs(final String key)
    {
        final List<ShelfConfig> shelfList = ModelProvider.getInstance().getIntronDPlusConfiguration().getShelfConfig();
        for (final ShelfConfig shelf : shelfList)
        {
            getAllStations(key, shelf);
        }
    }

    private void getAllStations(final String key, final ShelfConfig shelf)
    {
        final List<CTStation> stationList = shelf.getStationTable().getDigitalStationOrAnalogStationOrDioStation();
        for (final CTStation station : stationList)
        {
            getAllKeyPads(key, station);
        }
    }

    private void getAllKeyPads(final String key, final CTStation station)
    {
        final List<KeyPad> keypadList = station.getKeyPadTable().getKeyPad();
        for (final KeyPad keyPad : keypadList)
        {
            getAllButtons(key, keyPad);
        }
    }

    private void getAllButtons(final String key, final KeyPad keyPad)
    {
        final List<CTButton> buttonList = keyPad.getButton();
        for (int i = buttonList.size() - 1; i >= 0; i--)
        {
            final CTButton button = buttonList.get(i);
            if (!button.getCallAttr().isEmpty())
            {
                getAllButtonCalls(key, buttonList, button);
            }
        }
    }

    private void getAllButtonCalls(final String key, final List<CTButton> buttonList, final CTButton button)
    {
        final List<CTCallAttr> callList = button.getCallAttr();
        for (int j = callList.size() - 1; j >= 0; j--)
        {
            final CTCallAttr callAttr = callList.get(j);
            if (isKeyUsingInDestKey(key, callAttr))
            {
                callList.remove(callAttr);
                removeButtonWithoutCalls(buttonList, button);
            }
        }
    }

    private void removeButtonWithoutCalls(final List<CTButton> buttonList, final CTButton button)
    {
        if (button.getCallAttr().isEmpty())
        {
            buttonList.remove(button);
        }
    }

    private boolean isKeyUsingInDestKey(final String key, final CTCallAttr callAttr)
    {
        return callAttr.getDestKey() != null && callAttr.getDestKey().equals(grKey);
    }

Habe ich jetzt nur mal so auf die schnelle durchgeführt, die Name der Methoden sind noch
nicht optimal !

Nur ist mir folgendes noch nicht ganz klar: Wie verwende ich diese Stukturen am geschicktesten?
Mal angenommen, ich bräuchte an einer anderen Stelle wieder die unterste Ebene, sprich ich müsste
theoretisch nur die Methode "isKeyUsingInDestKey" ändern. Dann würde sich meiner Meinung nach hier empfehlen, von dieser Klasse zu erben und die unterste Methode zu überschreiben oder?
 
M

maki

Gast
Ja ich kenne beide.
:)

Nur ist mir folgendes noch nicht ganz klar: Wie verwende ich diese Stukturen am geschicktesten?
Mal angenommen, ich bräuchte an einer anderen Stelle wieder die unterste Ebene, sprich ich müsste
theoretisch nur die Methode "isKeyUsingInDestKey" ändern. Dann würde sich meiner Meinung nach hier empfehlen, von dieser Klasse zu erben und die unterste Methode zu überschreiben oder?
Hört sich nach dem Template Pattern an, vorraussgesetzt du willst nicht nur erben um die Methode wiederzuverwenden ;)
 
M

maki

Gast
Keine Einsprüche :)

u.U. bietet sich auch das Strategy Pattern an, um das Template (und dessen verhalten) & Erzeugung zu kapseln.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
L Best Practice Auslagerung von Code = Performance Optimierung? Allgemeine Java-Themen 4
8u3631984 Jacoco Testcoverage bei Abstracten Klassen in verschachtelten Modulen Allgemeine Java-Themen 6
Meeresgott Effizientester Weg um nach der Value einer verschachtelten Map aufzulösen Allgemeine Java-Themen 5
M Relative Anzahl an verschachtelten Forschleifen Allgemeine Java-Themen 8
P Erste Schritte Dynamische Anzahl von verschachtelten Schleifen Allgemeine Java-Themen 5
K Serialisierung einer verschachtelten Datenstuktur Allgemeine Java-Themen 9
F KI / Machine Learning Parameter verschachtelte for Schleifen Allgemeine Java-Themen 2
F KI / Machine Learning Parameter verschachtelte for Schleifen Allgemeine Java-Themen 1
A Mehrere for-Schleifen Allgemeine Java-Themen 2
Monokuma Foreach Schleifen in Streams umändern Allgemeine Java-Themen 23
Junger_Basileus Attribute, Arrays, Schleifen Allgemeine Java-Themen 9
E Angabe wie groß Array sein soll und in for-schleifen diesen Array füllen Allgemeine Java-Themen 3
D Integer-Array variabler Größe mit Zahlen befüllen (Schleifen) Allgemeine Java-Themen 0
C Schachbrett mit while-schleifen Allgemeine Java-Themen 7
R kann man irgendwie mit Arrays mit Eingabefenstern und Schleifen Werte abklappern? Allgemeine Java-Themen 2
R n verschachtelte Schleifen? Allgemeine Java-Themen 14
S Welcher Schleifen type für eine Berechnung Allgemeine Java-Themen 7
R Schleifen Allgemeine Java-Themen 11
L for-Schleifen Zählfehler Allgemeine Java-Themen 6
G Code nach Schleifen und Verzweigungen durchsuchen Allgemeine Java-Themen 6
S verzweigungen und schleifen Allgemeine Java-Themen 24
B BigDecimal Schleifen Allgemeine Java-Themen 9
prakdi Zeit zum Durchlauf der Schleifen unverständlich!? Allgemeine Java-Themen 3
T Verschachtelte Schleifen abbrechen Allgemeine Java-Themen 3
Meldanor For-Schleifen - byte statt int? Allgemeine Java-Themen 11
S Verschachtelte Schleifen Allgemeine Java-Themen 9
Z GC -> Allokation in Schleifen Allgemeine Java-Themen 25
A Fibonacci-Zahlen & kopfgesteuerte Schleifen & Strukt Allgemeine Java-Themen 8
V Vererbung und Schleifen Allgemeine Java-Themen 5
W kompliziertes Konstrukt von Schleifen/If/else. Rekursion? Allgemeine Java-Themen 22
S schleifen Allgemeine Java-Themen 3
A Schleifen in Ant? Allgemeine Java-Themen 5
G Methode mit Schleifen NullPointerException Allgemeine Java-Themen 2
L Schleife über Schleifen Allgemeine Java-Themen 4
M Verschachtelte Schleifen (unbekannte Tiefe) Allgemeine Java-Themen 3
N Code verkürzen(mit schleifen)? Allgemeine Java-Themen 10
C Effektivitaet bei for Schleifen Allgemeine Java-Themen 18
C Performance von FOR Schleifen Allgemeine Java-Themen 25
R Lohnt sich byte und short bei Schleifen? Allgemeine Java-Themen 9
P Schleifen liefern Werte nicht wie erwartet Allgemeine Java-Themen 2

Ähnliche Java Themen


Oben