Zeilen pro Methode/ Klasse

[abgespalten von http://forum.byte-welt.net/java-forum-erste-hilfe-vom-java-welt-kompetenz-zentrum/allgemeine-themen/16009-labels-evil-2.html#post115189 ]

Dazu vielleicht mein Senf… ich halte es für Schwachsinn wirklich nach zeilenanzahl zu entscheiden ob etwas zu viel auf einmal ist oder nicht.
Aber man sollte sich halt generell an das Prinzip halten, Etwas (Klasse, Methode…) „sollte nicht zu viel können“. Wenn eine Methode also einfach
„zu mächtig“ ist, einfach zu viel macht, sollte man die Aufgaben aufteilen, auch wenn diese Aufgaben alle letztlich logisch zusammenhängen.
Klar, jedes Programm gehört irgendwo auf einer logischen ebene zusammen. Aber dennoch „betreiben“ wir OOP, und schreiben nicht alles in eine main,
um das mal als extrem beispiel anzuführen…

Guter Einwand, kann mich dem nur uneingeschränkt anschließen.

Glaubst du etwa nicht dass es eine direkte Korrelation gibt zwischen Methodengroesse in Zeilen und der Anzahl der Dinge die darin gemacht werden? :wink:
Mit anderen Worten SoC und SRP werden bei grossen Methoden fast imer verletzt.
Selbiges gilt fuer Klassen.

Ansonsten waeren IMHO weniger Worte wie „Schwachsinn“ angebracht, stattdessen sind Argumente besser.

ups, tschuldigung, dann stell dir einfach vor
da steht da jetzt „nicht besonders sinnvoll“ :wink:

[QUOTE=mymaksimus]ups, tschuldigung, dann stell dir einfach vor
da steht da jetzt „nicht besonders sinnvoll“ ;)[/QUOTE]
Klar, wenn du noch eine Begruendung dazu lieferst… :wink:

Ansonsten muss ich das fuer mich unter „nicht fundierte Meinung“ ablegen :wink:

der Inhalt der letzten Postings ist doch nicht schwer zu überblicken,
warum auch immer Sen-Mithrarin das begann, ist der (zuvor hier nicht direkt postulierte?) Punkt darauf ‚wirklich nach zeilenanzahl zu entscheiden‘ in der Tat richtig als Schwachsinn oder ähnliches Wort bewertet,

eine direkte Grenz-Zahl dazu wird sicher selbst Verfechter maki nicht haben, wozu diskutieren?
dass bei 300 Zeilen eine Methode wahrscheinlich zu lang ist, ist sicher Mehrheitsmeinung, aber genauso schon bei 290,

außerdem kann es einzelne Ausnahmen wie lange Auflistungen geben die selbst mit 300 noch ok wären,
komplizierter Schleifencode hat dagegen viel geringeren Schwellwert

aber in keinem Bereich kann man die einzelnen Zeilen zählen (und 30 sind noch gut, 31 erfordern Refactoring),
auch allein schon weil je nach Formatierung/ Stil derselbe Code verschieden lang sein kann

richtig ist die Frage nach dargestellter Logik, zusammenhängenden Blöcken, wiederholter Code usw.,

wie gut etwas aufgetrennt werden kann ist auch ein Kriterium:
5 Zeilen unabhängiger Code können in eine parameterlose wiederverwendbare Methode viel eher weg
als in eine Methode mit 5 Parameter, die eh nur in der aktuellen Verarbeitung sinnvoll ist,

vielleicht noch erfordern Umstellungen im ersten Code analoge Umstellungen in der abhängigen Methode, grausig


alles Allgemeinwissen als Konsenz, da hat mymaksimus eigentlich nichts neues geschrieben, nicht unbedingt ‚Guter Einwand‘ :wink:
aber darüber dann noch weiter zu diskutieren liegt noch eine Stufe unnötiger darunter…,

Doch, habe ich in anderen Threads zu diesem Thema schon genannt.

Aber wozu ellenlange „nicht Diskussionswuerdig“ Posts absetzen wenn man auch einfach darueber diskutieren kann?
Ausser natuerlich man will das nicht… dann kann man das auch sagen anstatt um den heissen Brei zu reden…

Nebenbei, im Schnitt 250 Zeilen pro Klasse inkl. Javadoc ist eine konkrete Zahl, diese stammt nicht von mir, sondern ist aus der einschlaegigen Fachliteratur.
Das es immer Abweichungen nach oben und unten gibt ist auch klar, d.h. aber nicht dass es fuer 95% der Faelle keine klare Regel gibt.

Number of lines is not a good metric. A better rule would be to follow the Single Responsibility Principle. ie. A class should only do one thing. Try to identify code smells. Does your class have feature envy or does it contain methods that have too many parameters? Does your class violate the Law of Demeter? These are just some code smells to look for. When you encounter code smells, refactor and you’ll find your classes often naturally shrink in size or get broken up into multiple smaller classes.

ist die grüne Antwort eines Themas
guidelines - Recommended number of lines per Java source file - Stack Overflow

und quasi die Antwort #22 von mymaksimus, abgesehen von dem ach so schlimmen Wort Schwachsinn, welches in Diskussionen schnell fällt,
würdest du da auch sofort '[keine] Argumente, ‚[keine] Begruendung‘ (obwohl in #22 so viel steht…?!), ‚nicht fundierte Meinung‘ abfeuern?

es haben doch alle dieselbe Meinung, nur mit dem Hinweis nicht sklavisch Zeilen zu zählen,
ging erst um Methoden, aber nun Klassen, da wird ein bestimmtes TableModel von 270 Zeilen mit lauter wichtigen Methoden zur Darstellung und Abfrage von Daten in Bezug nur auf TableModel auch nicht direkt problematisch sein

umgekehrt können auch schon 2 Zweizeiler oder zwei Methoden in einer 100 Zeilen-Klasse schlecht platziert und aufzutrennen sein


zivilisiert darüber diskutieren, höflich Hinweise ergänzen kann man natürlich, aber aus ‚ich halte es für Schwachsinn wirklich nach zeilenanzahl zu entscheiden‘
quasi als Gegenfrage ‚du glaubst also nicht dass bei 500 statt 50 Zeilen mehrere Dinge in einer Methode behandelt werden?‘ abzuleiten
ist nur destruktiv provokativ, dabei die Aussage klar

Nun gut, dann eben weiter in Gossensprache…

„Nur inkompetente Schwachkoepfe die nicht in der Lage sind sauberen Code zu schreiben sind der Meinung dass es keine konkrete Anzahl von Zeilen gibt aber Code unsauber wird.
Das sind meistens Anfaenger ohne echte Erfahrung und/oder Versager die es nach Jahren immer noch nicht schaffen sauberen Code zu schreiben.
Um ihre Unfaehigkeit zu verheimlichen bringen die immer dieselben Argumente…“

Persoenlich beleidigend? Klar.
Polarisierend? Sicher!
Schlechter Diskussionsstil? Ganz bestimmt!
Richtig? Auf jedenfall :wink:

nicht dass man Vertreter dieser Gosse nicht besser allein lassen sollte, es ist alles gesagt,
aber Kein wahrer Schotte fiel mir dazu noch halbwegs passend ein,
ist wohl der Religions-Fall, traurig

Wie jetzt?

Ist Gossensprache nicht in Ordnung wenn dein Standpunkt nicht vertreten wird?
Oder meidest du die Diskussion um deine Inkompetenz zu verbergen? (<- nicht ernstgemeinter Ironie, durchaus provokant, spiegelt aber nicht meine Meinung ueber dich wieder)

Mal wieder ernsthaft…
Sorry, aber wenn man Argumente der Gegenseite als “Schwachsinn” tituliert und das dann ok findet weil die eine Meinung reflektiert wird darf man sich nicht ueber ein sinkendes Niveau beschweren, nur weil die Gegenseite dieselben Mittel einsetzt, ist schlicht unbalanziert.

Ansonsten koennte man jederzeit wieder auf eine fachliche und niveauvolle Diskussion ueber das Thema zurueckkommen, falls erwuenscht.

Meine Aussage steht immer noch: Lange Klassen/Methoden neigen fast immer dazu Soc und SRP zu verletzten, “lang” bedeutet dabei mehr als 10-15 Zeilen pro Methode und mehr als 300 Zeilen pro Klasse. Tatsaechlich sollten die meisten Methoden sogar kuerzer sein als 10 Zeilen.

Ja Geil, ich bin am Start!!!

[quote=maki;115240]„Nur inkompetente Schwachkoepfe die nicht in der Lage sind sauberen Code zu schreiben sind der Meinung dass es keine konkrete Anzahl von Zeilen gibt aber Code unsauber wird.
Das sind meistens Anfaenger ohne echte Erfahrung und/oder Versager die es nach Jahren immer noch nicht schaffen sauberen Code zu schreiben.
Um ihre Unfaehigkeit zu verheimlichen bringen die immer dieselben Argumente…“[/quote]

Jetzt pass ma uff du Suffkopp. Wenn ich här was so manch ähner fa e vorstellung hot, uf wieviel Zeile ma des reklämentiere soll, jo do denk ich ma: der Bub hot in seim g’samte läwe noch kä GUI programmiert oda e switch g’sehe … Jo alla, vergess mo dei red nit, ich geh ma erstmo en neie Schoppe hole und dann sehn ma weiter.


Ich würde Anzahl an Zeilen pro Methode eher als Indikator ansehen, der in >90% der Fälle vermutlich richtig ist. Ich halte mich da an folgendes: Kommentare die den Nachfolgenden Code erklären (und somit auch in Abschnitte einteilen) werden gar nicht erst verfasst - sondern ich pack das Codestück in eine neue Methode. Dadurch sind die meisten meiner Methoden sehr kurz gehalten und dürften auch deinen Regeln entsprechen. Überleg mal, wieviel Zeilen alleine ein Switch belegen kann :wink:

muss man wirklich jeden klaren Punkt einzeln erklären? (‚in Kindersprache‘ wäre ein persönlicher Zusatz, während alles vor der Klammer noch angemessen ist)

in Posting #22 gab es noch keine Gegenseite, habe jetzt schon zum zweiten Mal nachgeschaut ob irgendwo vorher du, maki oder ähnliche die Zeilenanzahl gepostet haben,
auf welches sich das beziehen könnte,

einfach so in die Welt hinausposaunt kommt das ständig vor

[QUOTE=Bleiglanz;111801]Meine Regel ist:

this immer und überall hinzuschreiben ist Schwachsinn: Methoden sollten so kurz sein (und scopes so klein), dass man immer
halbwegs den Überblick über die vorkommenden Variablen hat.[/QUOTE]
in jenem Thema gab es sogar noch andere Meinungen, aber auch da macht die Formulierung die Musik,
eigenen Standpunkt dargelegt, niemand direkt angesprochen/ angegriffen, kein Mensch regt sich auf

besonders als Moderator musst du aufpassen, keine anderen vermeintlich kleineren von oben herab zu behandeln,
keine Ahnung ob du mymaksimus näher kennst für freundschaftliche Zurechtweisung,

‚ups, tschuldigung‘ dahinter klingt schon ziemlich duckend, und dann noch ‚nicht fundierte Meinung‘ hinterherzuschießen…, ich schäme mich fremd


zum Thema bestätigst du mit ‚10-15 Zeilen‘ einmal mehr, dass es keine genaue Grenze gibt,
eine Zeile mehr wird eine ansonsten gute Methode nicht leicht auftrennbar machen, sondern eher ein behandelter logischer Punkt mehr

‚Soc und SRP‘ schreibst du und ‚Etwas (Klasse, Methode…) „sollte nicht zu viel können“‘ schreibt mymaksimus (oder auch in meinem Zitat von Stack Overflow, der Vollständigkeit halber),
der wichtige Kern ist allen bekannt, es gibt gar keinen Konflikt

stell dir vor (auch wenn folgendes für ein allgemein schlechtes design sprechen würde…)
du hast ein switch mit 50 cases, jeweils 2 zeilen code unter jedem case + ein break, macht allein 200 zeilen
für diesen switch block… und das kannst du nicht wirklich aufsplitten ^^

edit:
ach… es galt bei dir 10 - 15 zeilen als lang? okay, nimm 5 cases :wink:

was nebenbei manchmal nicht gut geht wenn mit mehreren lokalen Variablen hantiert wird, es gibt nicht immer nur Simpelcode,
und neue Klassen mit 5 Instanzattributen zu erstellen wäre komplexer als eine Methode mit 5 lokalen Variablen, und mehr Code obendrein

als irgendein Beispiel aus der API

[spoiler]``` protected void fireActionEvent() {
if (!firingActionEvent) {
// Set flag to ensure that an infinite loop is not created
firingActionEvent = true;
ActionEvent e = null;
// Guaranteed to return a non-null array
Object listeners = listenerList.getListenerList();
long mostRecentEventTime = EventQueue.getMostRecentEventTime();
int modifiers = 0;
AWTEvent currentEvent = EventQueue.getCurrentEvent();
if (currentEvent instanceof InputEvent) {
modifiers = ((InputEvent)currentEvent).getModifiers();
} else if (currentEvent instanceof ActionEvent) {
modifiers = ((ActionEvent)currentEvent).getModifiers();
}
// Process the listeners last to first, notifying
// those that are interested in this event
for ( int i = listeners.length-2; i>=0; i-=2 ) {
if ( listeners**==ActionListener.class ) {
// Lazily create the event:
if ( e == null )
e = new ActionEvent(this,ActionEvent.ACTION_PERFORMED,
getActionCommand(),
mostRecentEventTime, modifiers);
((ActionListener)listeners[i+1]).actionPerformed(e);
}
}
firingActionEvent = false;
}
}

da kann man nicht sinnvoll mal eben an der Stelle mit Variablen listeners, modifiers, mostRecentEventTime, die zweite Hälfte mit der Schleife abtrennen,
eine Methode mit entsprechenden Parametern, die sonst niemand braucht wäre auch (Achtung ;) ) Schwachsinn, einfach nur linear aufgetrennt in zwei Hälften

(Zeile 10-15 wäre dagegen ein erkennbar herausnehmbarer Teil, das ist sinnvolle Arbeit, 
egal ob die restliche Methode aus 30 Zeilen oder 4 Zeilen besteht!, darauf kommt es eben nicht unbedingt an)

mit beliebigen Refactoring-Aufbau des gesamten Modells ginge freilich irgendwann irgendwie sicher der gesamte Aufbau besser

[quote=Tomate_Salat;115245]Überleg mal, wieviel Zeilen alleine ein Switch belegen kann[/quote]Wobei switch aber auch zu den Anweisungen gehört, die ich in meinen Programmen sehr, sehr, sehr sparsam einsetze, eigentlich nur in Factories…

bye
TT

[QUOTE=mymaksimus]stell dir vor (auch wenn folgendes für ein allgemein schlechtes design sprechen würde…)
du hast ein switch mit 50 cases, jeweils 2 zeilen code unter jedem case + ein break, macht allein 200 zeilen
für diesen switch block… und das kannst du nicht wirklich aufsplitten ^^

edit:
ach… es galt bei dir 10 - 15 zeilen als lang? okay, nimm 5 cases ;)[/QUOTE]
Switches sind mit Vorsicht zu genießen. Oft sind diese ein Zeichen von unschönem Code. Sicherlich ist das nicht immer so und bekannterweise bestätigen Ausnahmen die Regel. :wink:

Dennoch sehe ich das auch so, dass Klassen wie auch Methoden klein sein sollten. 15 Zeilen für eine Methode finde ich schön lang.

Das das nicht immer funktioniert ist auch Maki klar. Dennoch kann man eine Kennzahl festmachen, die schlechten Code identifizierbar macht. Ein switch in einer Methode mit 200 Zeilen ist für mich schlechter Code. Man muss dann punktuell entscheiden, ob sich das verbessern lässt oder ob es so bleiben kann. Dennoch ist so ein Stück Code schlecht oder unschön.

*** Edit ***

[QUOTE=SlaterB;115248]… da kann man nicht sinnvoll mal eben an der Stelle mit Variablen listeners, modifiers, mostRecentEventTime, die zweite Hälfte mit der Schleife abtrennen,
eine Methode mit entsprechenden Parametern, die sonst niemand braucht wäre auch (Achtung :wink: ) Schwachsinn, einfach nur linear aufgetrennt in zwei Hälften[/QUOTE]
Natürlich kann man auch den unteren Bereich in eine schön benamte Methode extrahieren. Dann kann man sich sogar den Inline-Kommentar an dieser Stelle sparen. Dein Code-Stück ist ein schönes Beispiel dafür, wie man es nicht machen sollte. Ich habe erst nicht verstanden, was die Methode tun soll. Das würde kein Review überleben. :slight_smile:

Vorab: Schoen das wir wieder reden :slight_smile:

[quote=mymaksimus]stell dir vor (auch wenn folgendes für ein allgemein schlechtes design sprechen würde…)
du hast ein switch mit 50 cases, jeweils 2 zeilen code unter jedem case + ein break, macht allein 200 zeilen
für diesen switch block… und das kannst du nicht wirklich aufsplitten ^^

edit:
ach… es galt bei dir 10 - 15 zeilen als lang? okay, nimm 5 cases[/quote]
Ja, switch/case, ist ein Konstrukt welches immer zu unschoenen Methoden fuehrt, auch 5 cases haben diese Eigenschaft.
try/catch ist ein anderes Konstrukt was selten sehr kurze Methoden zulaesst.
Gibt bestimmt nochmehr Beispiele, aber: Das ist nicht die Regel, switch/case nimmt man, aber sicherlich nicht sehr haeufig.

[quote=SlaterB;115248]was nebenbei manchmal nicht gut geht wenn mit mehreren lokalen Variablen hantiert wird, es gibt nicht immer nur Simpelcode,
und neue Klassen mit 5 Instanzattributen zu erstellen wäre komplexer als eine Methode mit 5 lokalen Variablen, und mehr Code obendrein
[/quote]
Ich werde jetzt wohl verrueckt wirken, aber: Lokale Variablen blaehen den Code auf!
Deklaration, Belegung/ggf Initialisierung/, Verwendung → Mindestens 3 Zeilen im Regelfall.
Methoden zB. haben den Vorteil dass sie kuerzer sind als lokale Variablen in der Verwendung.

Neue Klassen mit 5 Attributen, zB. als Parameter Obejkt wenn sie keine Logik enthalten, oder als „echte“ Klassen, helfen oft den Code in dem sie verwendet werden kuerzer und klarer zu machen.

[quote=SlaterB;115248]da kann man nicht sinnvoll mal eben an der Stelle mit Variablen listeners, modifiers, mostRecentEventTime, die zweite Hälfte mit der Schleife abtrennen,
eine Methode mit entsprechenden Parametern, die sonst niemand braucht wäre auch (Achtung ) Schwachsinn, einfach nur linear aufgetrennt in zwei Hälften[/quote]
Sehe ich ganz anders.
listeners kommt aus der Methode einer Instanzvariable, braucht man nichtmal ein Paramter fuer.
An mostRecentEventTime kommt man auch nur mit der statischen Methode EventQueue.getMostRecentEventTime().

Hier mal ein sicherlich laecherlicher Versuch das Beispiel zu refakurieren;

protected void fireActionEvent() {
        if (!firingActionEvent) {
            setFlagToPreventInfiteLoop();
            
            notifyListeners(getModifiers(EventQueue.getCurrentEvent()));
     
            unsetFlagToPreventInfiteLoop();
        }
    }```
Hab die Implementierungen der extrahierten privaten Methoden weggelassen,, natuerlich ;)
Nebenbei, keine Garantie auf Korrektheit.

IMHO, Dreckiger Code, temp. Variablen werden frueh deklariert und spaet genutzt, Kommentare wie diese "stinken"(einmal die Javadoc zitiert, "schlecht" kommunizierenden Code versucht zu erklaeren), zuviele Einreuckungen (if -> for -> if) 

"Extract Method" ist das meistgenutzte Refactoring, muss im Schlaf gehen, ermoeglicht viele Alternativen zur (Um-)Gestaltung bereits geschriebenen Codes, danach werden Dinge wie Cohaesion/Kopplung oft besser erkennbar.
Nebenbei, das Gegenstueck zu extract Method ist inline Method, Refactoring ist eben keine Einbahnstrasse, dasselbe gilt fuer extract Class/Inline Class.

Einfach mal ein bisschen mit dem Code spielen, oft sieht man danach klarer was das Design noch hergeben koennte.
Aber ohne Tests ist ein Spiel mit dem Feuer.

*** Edit ***

Nachtrag:
Ok, hier noch ein Vorschlag, aber keine Garantie, alles nur im Texteditor ;)

protected void fireActionEvent() {
if (!firingActionEvent) {
setFlagToPreventInfiteLoop();
notifyListeners();
unsetFlagToPreventInfiteLoop();
}
}

private void notifyListeners() {
final Object[] listeners = listenerList.getListenerList();
for ( int i = listeners.length-2; i>=0; i-=2 ) {
notifyIfActionListener(listeners, i);
}
}

private void notifyIfActionListener(Object[] listeners, int index) {
if ( isActionListener(listeners[index])) {
// Lazily create the event:
if ( e == null )
e = createActionEvent();

                    notifyListener(listeners[index+1], );
        }

}

private ActionEvent createActionEvent(long eventTime, int modifiers) {
return new ActionEvent(this,
ActionEvent.ACTION_PERFORMED,
getActionCommand(),
EventQueue.getMostRecentEventTime(),
getModifiers(EventQueue.getCurrentEvent()));
}

private boolean isActionListener(Object listener) {
return listener == ActionListener.class;
}

private void notifyListener(Object listener, ActionEvent e) {
listener.actionPerformed(e);
}

private int getModifiers(AWTEvent event) {
if (event instanceof InputEvent)
return ((InputEvent)currentEvent).getModifiers();
if (event instanceof ActionEvent)
return ((ActionEvent)currentEvent).getModifiers();

return 0;

}

49 Zeilen anstatt 30, mit Leerzeilen (6), man koennte noch quetschen aber wozu, vieles sind Namen (Methoden), kein komplexer Code mal abgesehen von der index Arithmetik, kaum temp. Variablen (keine Ahnung wie teuer so ein ActionEvent ist und warum lazy init)..

da auch Threads nicht zu lang werden dürfen vom anderen abgespalten :wink:

das API-Beispiel zu verteidigen ist in der Tat sportlich,
aber die firingActionEvent-Abspaltung ist offensichtlich unabhängig vom restlichen Code, vom Holen der Variablen und Ausführen der Schleife,

ein paar Zeilen gespart, aber die Hauptarbeit ist nun in die notifyListeners-Methode verschoben,
in diesem Fall kann diese auch kurz werden: wenn auf das Lazy verzichtet oder ein zweiter Schleifendurchlauf davorgeschoben wird (in eigener Methode),
dann nur ein Parameter, das ActionEvent, für die Schleife vorab zusammenzustellen

aber ist ja nicht immer so (außer extra dahin konstruiert),
man hole allein drei lokale Variablen, jeweils Prüfung mit Fehlermeldung und noch lokale Umwandlung, schon je nach Zählung 12 Zeilen rum und noch gar nichts damit angefangen, nur evil?

[quote=maki]Ich werde jetzt wohl verrueckt wirken, aber: Lokale Variablen blaehen den Code auf!
Deklaration, Belegung/ggf Initialisierung/, Verwendung → Mindestens 3 Zeilen im Regelfall.[/quote]
ach ja, Java kommt neuerdings ganz ohne lokale Variablen aus…, wie auch ohne switch, ohne null & Co…


alle API-Beispiele wie aus GridLayout mal etwas was einiges berechnet:
[spoiler]``` public Dimension preferredLayoutSize(Container parent) {
synchronized (parent.getTreeLock()) {
Insets insets = parent.getInsets();
int ncomponents = parent.getComponentCount();
int nrows = rows;
int ncols = cols;

    if (nrows > 0) {
        ncols = (ncomponents + nrows - 1) / nrows;
    } else {
        nrows = (ncomponents + ncols - 1) / ncols;
    }
    int w = 0;
    int h = 0;
    for (int i = 0 ; i < ncomponents ; i++) {
        Component comp = parent.getComponent(i);
        Dimension d = comp.getPreferredSize();
        if (w < d.width) {
            w = d.width;
        }
        if (h < d.height) {
            h = d.height;
        }
    }
    return new Dimension(insets.left + insets.right + ncols*w + (ncols-1)*hgap,
                         insets.top + insets.bottom + nrows*h + (nrows-1)*vgap);
  }
}
kann man natürlich immer umwandeln, für jedes synchronized eine eigene Methode, jedes evt. try/catch eine eigene Schicht..,
für Berechnung von ncols und von nrows getrennt einzelne Methoden, supi..

gibt es eigentlich irgendwo ein öffentliches umfangreiches Projekt welches sich genau an diese Regeln hält?
https://github.com/trending?l=java
entlanggeschaut scheinen alle wie SmartTabLayout Methoden wie 
[spoiler]```public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
            int tabStripChildCount = mTabStrip.getChildCount();
            if ((tabStripChildCount == 0) || (position < 0) || (position >= tabStripChildCount)) {
                return;
            }

            mTabStrip.onViewPagerPageChanged(position, positionOffset);

            View selectedTitle = mTabStrip.getChildAt(position);
            int extraOffset = (selectedTitle != null)
                    ? (int) (positionOffset * selectedTitle.getWidth())
                    : 0;

            if (0f < positionOffset && positionOffset < 1f
                    && mTabStrip.isIndicatorAlwaysInCenter()) {
                int current = mTabStrip.getChildWidthAt(position) / 2;
                int next = mTabStrip.getChildWidthAt(position + 1) / 2;
                extraOffset = Math.round(positionOffset * (current + next));
            }

            scrollToTab(position, extraOffset);

            if (mViewPagerPageChangeListener != null) {
                mViewPagerPageChangeListener.onPageScrolled(position, positionOffset,
                        positionOffsetPixels);
            }
        }```[/spoiler]
zu haben,
erkennbar weiteres Auftrennen möglich, ist immer möglich, aber nötig?

die Scala-API habe ich noch durchforstet und vorerst nichts langes gefunden ;)
in Swing noch viel von Java genutzt? BigDecimal auch?

wenn dann reale Projekte dran kommen sieht es wieder düsterer aus..:
https://github.com/CreativeCodingLab/corpusbrowser/blob/master/src/main/scala/gui/ColocationPanel.scala
https://github.com/techaddict/bignum/blob/master/src/main/scala/bignum/BigInt2.scala

*** Edit ***

unter Separation of concerns verstand ich bisher eigentlich immer, 
dass eine Methode nicht gleichzeitig aus der DB Daten laden, mit User-Nachfragen verbessern und fürs TableModel sortieren soll,

aber das heißt wohl stattdessen dass Schleifenkopf und Schleifeninhalt jeder Schleife in Java in verschiedene Methoden gehören?..
da sind einige Lehrbücher upzudaten

Klar ist es nötig und notwendig lesbaren Code zu schreiben, findest du nicht? Deine Beispiele kann man sauberer und schöner umsetzen. Maki hat es in seinem ersten (unvollständigen) Beispiel gut gezeigt. Oder findest du den Code dann nicht lesbarer?

Wartbarer Code muss immer lesbar sein. Wenn ich immer erst eine Zeit brauche, um Code zu verstehen, ist dieser in meinen Augen nicht gut - fachliche Komplexität meine ich damit übrigens nicht.