2016-07-29 39 views
0

Wenn ich eine Arraylist von Objekten haben dann auf einem Mitglied der Arraylist jedes Mal wenn ich brauche ich es so tun müssen, jede Methode aufrufen:Gesetz von Demeter Erhaltung mit Arraylisten

list.get(i).doSomething(); 

Das ist wie verdächtig aussieht ein Gesetz der Demeter-Verletzung. Ich sehe keinen Weg, dies zu umgehen. Ist das in Ordnung oder sollte ich überdenken, wie ich solche Dinge mache? Ist die ArrayList ein Objekt, das das Demeter-Gesetz ignoriert?

+0

Können Sie erklären, wie Sie ein Demeter-Gesetz sehen? – Matthew

+0

Vielleicht beschreiben Sie mehr von dem, was Sie tun möchten? Ich sehe hier kein Problem, es ist nicht so, als würdest du 10 Getter hintereinander rufen. – Tunaki

+0

Ich weiß, das ist keine große Verletzung, aber es scheint immer noch wie ein Code-Geruch. Es ist eine LoD-Verletzung, da ich ein Objekt aus der ArrayList abruft und dann eine Methode für das abgerufene Objekt aufruft. Technisch sollte ich etwas wie list.callSomethingOn (i) tun, um das Demeter-Gesetz zu bewahren, aber das scheint auch falsch zu sein – kabeersvohra

Antwort

1

Es ist keine Verletzung.

Wenn Sie eine Klasse hatte

Class A { 
    private B b1, b2, b3; 

    ... 

    private void method() { 
     b1.doSomething(); 
     b2.doSomething(); 
     b3.doSomething(); 
    } 
} 

gibt es keine Verletzung. Wenn wir die Instanz von B in eine List<B> sammeln erhalten Sie

Class A { 
    private List<B> listOfB; 

    ... 

    private void method() { 
     listOfB.forEach(B::doSomething); 
    } 
} 

eine List<B> Mit den Instanzen von B ergibt keine engere Kopplung zwischen A und B zu halten.

1

Ich sehe hier keine Verletzung.

Das Gesetz des Demeter, in Konzept schlägt vor, dass ein Unternehmen nur von seinen Nachbarn kennt, nicht fremd, so dass, wenn A etwas von C muss, soll es zu B um es zu bekommen und nicht mehr weiter reden.

Ich würde nicht genau eine List einen "Nachbarn" anrufen, um dieses Konzept zu übernehmen. Es ist ein Objekt, das eine Datenstruktur manipuliert, die Sie in Ihrem gesamten Programm verwenden können. Daher würde die Object, die Ihre Liste enthält, als die B zu Ihrer A betrachtet werden.

Wenn List eine tatsächliche Entität war, die in Ihrem Programm definiert ist, könnten Sie in diesem Fall Recht haben. Es würde mehr Sinn machen, wenn Ihre List eine Methode hat, die Ihre Object anfordert, einige Logik auszuführen (wie Sie in einem Kommentar, list.callSomethingOn(i), sagten).

Wenn diese bestimmte Instanz List zu Ihrem Programm Logik ist von zentraler Bedeutung, und Sie sind unnachgiebig das Gesetz erfüllt, könnten Sie einen „Decorator“ für die List verwenden, die mit den enthaltenen arbeiten weitere Methoden ergänzen Object s