2015-01-02 16 views
9

Ich verwende Javas Rectangle Klasse in einem Programm.Beschränken Sie das Rechteck innerhalb des Rechtecks ​​

Ich habe zwei Rectangle Objekte:

Rectangle big = new Rectangle(...); 
Rectangle small = new Rectangle(...); 

Die spezifischen Größen der Rechtecke sind nicht wichtig. Jedoch ist big immer größer als small (in sowohl Breite und Höhe).

Normalerweise ist small vollständig in big enthalten. Ich kann Rectangle#contains verwenden, um dies zu überprüfen. Wenn dies jedoch nicht der Fall ist, möchte ich verschiebensmall vollständig in big enthalten sein. Die Abmessungen von keinem Rechteck sollten sich ändern.

Zum Beispiel:

Rectangles Example

Ich kenne vier conditionals mit Math.max verwenden könnte und Math.min, aber gibt es eine elegantere Möglichkeit, dies zu tun?

+0

Es gibt vier Bedingungen, die Sie überprüfen, so dass ich bin mir nicht sicher, Sie können Ohne einen "Haufen von Bedingungen" wegkommen ... –

+0

Richtig ... aber ich suchte nach einem eleganten Single-Line-Ausdruck, vielleicht mit der 'Rectangle'-Klasse. Vielleicht ist es nicht möglich. – baum

+1

Ein ternärer Ausdruck wäre "ein bisschen" sauberer oder kürzer. – issathink

Antwort

2

Sie könnten es nur mit Math.max und Math.min tun. Versuchen Sie etwas wie folgt:

Sie müssten jedoch Lesbarkeit berücksichtigen.

+0

hmm, das habe ich befürchtet. Ich dachte, ich könnte vielleicht eine Umkehrung der Kreuzung benutzen ... vielleicht nicht. – baum

+0

Es ist kompakter, aber nicht das, was man "elegant" nennen würde. –

+0

Ja, ich würde persönlich einfach mit den Standard-Vierfach-Ifs gehen, da das immer für die Überprüfung von Grenzen verwendet wird, also sollte ein Programmierer, der es pflegen muss, es schnell erkennen . – Ghostkeeper

2

Sie brauchen ein stärkeres Design. Wenn Sie die Klasse Rectangle erweitern, können Sie genau die Funktionalität hinzufügen, nach der Sie suchen. Anscheinend ist der „große Rechteck“ als Behälter handeln sollte, das kleinere Rechteck enthält:

class BigRectangle extends Rectangle { 
    //reference to or list of rectangle(s) here 

    private boolean isAlignedWith(Rectangle rect) { 
     return /* bounds logic */; 
    } 

    private void align(Rectangle rect) { 
     //move rectangle to proper position 
    } 

    public void add(Rectangle rect) { 
     if(!isAlignedWith(rect)) { 
      align(rect); 
     } 

     //store in reference or add to list 
    } 
} 

Nun können Sie einfach das kleinere Rechteck auf der einen größeren hinzuzufügen:

Rectangle smallRectangle = new Rectangle(); 
BigRectangle bigRectangle = new BigRectangle(); 
bigRectangle.add(smallRectangle); //automatically aligns if needed 

Sie sind jetzt Verstecke die (benötigte) Logik und halte deine zentrale Codeeinheit sauber. Das ist meiner Meinung nach der eleganteste Weg, damit umzugehen. (ich schaffen würde wahrscheinlich auch eine Schnittstelle RectangleContainer oder ShapeContainer, mit BigRectangle dass implementieren. Die Schnittstelle eine Methode add(Rectangle) oder add(SmallShape) enthalten würde)

Verwandte Themen