divergent change

Mariexshhx

Bekanntes Mitglied
hey, hat jemand vielleicht ein Beispiel für einen divergent Change (Code Smell). Ich weiß, dass man bei einem divergent Change für eine Änderung mehrere Dinge in einer Klasse ändern muss ? Gibt es irgendwie ein Beispiel was das verdeutlicht?
 
Y

yfons123

Gast
du hast deine klasse von der implementierung abhängig gemacht oder du hast duplikate die das gleiche tun
zb
Java:
class Character{
    public void Move() 10 pixel * spieler geschwindigkeit
}
class Camera {
    public void Move() 10 pixel * camera geschwindigkeit
}
und das ganze wurde so gewählt dass die kamera und der character immer synchron zueinander sind, jetzt willst du aber dass dein spieler 5 pixel geht, dann musst du obwohl es komplett unabhängig davon ist die camera klasse auch ändern damit sie wieder synchron sind


dh eine änderung bei einem "low level" modul hat effekt auf ein top level modul zb du hast
Code:
class Drawer{
List<Shapes> shapes;
    public void Draw(){
        foreach shape in shapes
        {
            if(shape instanceof würfel){
                shape.drawWürfel();
            }
            else if(shape instanceof dreieck){
                shape.drawDreieck();
            }
        }
    }
}
und die klasse würfel und dreieck

so und jetzt willst ud einen kreis hinzufügen... dann musst du den drawer der ein höheres "modul" ist auch ändern weil der auf das shape dreieck nicht klarkommt
besser wäre es wenn alle schnittstellen in der klasse shape drin wären, somit kannst du nach lust und laune klassen dazu tun ohne den Drawer überhaupt anfassen zu müssen zb die shape klasse
Code:
public abstract class Shape{
    public void draw();
}
weil deinem drawer muss es egal sein obs ein kreis oder rechteck ist oder sonst was... hauptsache es ist ein shape

dadurch dass der drawer nun in verbindung mit dem Shape steht und komplett ungebunden an den würfel oder kreis ist kannst du den würfel oder kreis nach lust und laune verändern udn weist immer dass der drawer immer noch funktioniert solange deine "low level module" die versprechen des shapes also die abstrakte methode einhalten
 

KonradN

Super-Moderator
Mitarbeiter
Das was Du da beschreibst sind aber keine Divergent Changes.

Dein erstes Beispiel ist ein Beispiel für den "gegenteiligen" Code Smell: Den Shotgun Surgery.

Siehe dazu z.B. https://refactoring.guru/smells/divergent-change

Die mehreren Änderungen in einer Klasse kann man aber auch schnell bekommen. Du brauchst halt nur etwas konstruieren, wo in einer Klasse ein Verhalten doppelt kommt. Ein Beispiel wäre etwas wie:
Eine Klasse berechnet Gehälter. Ein Angestellter mit Personalverantwortung bekommt aber das doppelte.
Nun berechnet die Klasse in einer Methode das Urlaubsgeld das dieses "Verhalten" implementiert. Und dann das Monatsgehalt - das dieses "Verhalten" auch hat. Eine Veränderung (Der Faktor ändert sich nun auf den Faktor 1,7 bei Anzahl geführter Arbeitskräfte <5 und sonst 2,3) dann muss dies an zwei Stelle in einer Klasse verändert werden.
 

Ähnliche Java Themen


Oben