2012-12-21 42 views
7

Làm việc trong java, tôi muốn đơn giản hóa chức năng vẽ (trình tạo đa giác) mà tôi đang làm việc. Thông thường, khi bạn tạo một đa giác, bạn làm như sau:Đơn giản hóa phương pháp Java với số lượng đối số thay đổi

Polygon mypoly = new Polygon(); 
mypoly.addPoint(x1, y1); 
mypoly.addPoint(x2, y2); 
mypoly.addPoint(x3, y3); 
Draw.fillPolygon(g, mypoly, Color.blue); 

Tôi muốn sử dụng một ánh xạ hình ảnh để tự động cung cấp cho tôi các tọa độ, vì vậy tôi chỉ có thể sao chép dán chúng vào chức năng của riêng tôi.

myCommand(x1, y1, x2, y2, x3, y3); 

Mỗi trong số này sẽ đi vào lệnh đa giác ở trên cùng. Vấn đề mà tôi đang gặp phải là khi mypoly được tạo ra, làm thế nào nó sẽ biết có bao nhiêu điểm để thêm và nơi để đặt chúng?

Tôi đang cố gắng để có được myCommand để tự động thêm điểm khi tôi thêm đối số và mỗi điểm tương ứng với x, y của phương thức tạo đa giác gốc.

+1

Sử dụng [varargs] (http://docs.oracle.com/javase/1.5.0/docs/guide/language/varargs.html) . –

Trả lời

7

Có vẻ như bạn cần sử dụng mẫu builder. Trong mã giả:

PolygonBuilder pb = new PolygonBuilder(); 
pb.addPoint(1,1); 
pb.addPoint(1,2); 
// etc... 

Polygon p = pb.newPolygon(); 

vì vậy, ý tưởng là bạn cung cấp cho người xây dựng một tập hợp các điểm và nó sẽ tạo cho bạn đa giác thích hợp. Nhà xây dựng thường được thiết kế với fluent interface. Lưu ý rằng người xây dựng có thể hoạt động như một nhà máy và trả lại cho bạn các lớp con thích hợp của Polygon (hình vuông, hình tam giác, hình ngũ giác vv nếu bạn muốn).

Lưu ý rằng thay vào đó bạn có thể cung cấp một phương thức nhận số lượng đối số thay đổi, sử dụng Java varargs mechanism. ví dụ.

public void addPoints(Integer... args) { 
    // and iterate here 
} 

Bạn có thể muốn tạo đối tượng Point để xác định toạ độ x/y với nhau. Nếu không, ở trên sẽ phải kiểm tra một số chẵn các đối số và các đối số đó sẽ không được gắn với nhau.

5

Bạn có thể sử dụng varargs và tạo ra các đa giác động bằng cách sử dụng các constructor mà được mảng của xs và ys

(Mã số chưa được thử nghiệm)

public Polygon createPolygon(int... points) { 
    if (0 != points.length % 2) { 
     throw new IllegalArgumentException("Must have even number of points"); 
    } 

    int numOfPoints = points.length/2; 
    int xs = new int[numOfPoints]; 
    int ys = new int[numOfPoints]; 
    for (int i=0; i < numOfPoints;i++) { 
     xs[i] = points[i*2]; 
     yx[i] = points[i*2 + 1]; 
    } 

    return new Polygon(xs, ys, numOfPOints); 
} 

Sau đó, bạn có thể gọi phương pháp này với bất kỳ số lượng điểm

Polygon p = createPolygon(x1,y1,x2,y2,x3,y3);

+0

+1 Tất cả các câu trả lời trên trang này đều đúng về mặt kỹ thuật nhưng điều này nhận được ý kiến ​​của tôi bởi vì nó * chỉ * đề cập đến các vararg (câu trả lời hay nhất) và không làm lộn xộn mọi thứ. – Asaph

+2

Vòng lặp for có thể được đơn giản hóa bằng cách sử dụng 'for (int i = 0; i BalusC

+0

và những gì sẽ là chỉ số cho xs và ys? –

1

Tôi nghĩ bạn có thể sử dụng phương pháp nhận được gs (...)

Bạn cần một wrapper cho mỗi điểm:

class Point { 
    int x; 
    int y; 
    Point(int x, int y) { 
     this.x = x; 
     this.y = y; 
    } 
} 

Phương pháp này có thể là:

myCommand(Point ... points) 

Đối với cuộc gọi

myCommand(new Point(0,0), new Point(1,1), new Point(0,1)); 

Và đối với hòa:

Polygon mypoly = new Polygon(); 
for(Point p : points) 
    mypoly.addPoint(p.x,p.y); 
Draw.fillPolygon(g,mypoly,Color.blue); 
+0

['java.awt.Point'] (http://docs.oracle.com/javase/6/docs/api/java/awt/Point.html) đã tồn tại (kể từ 1.0). Không cần phải sáng chế lại bánh xe. – Asaph

+0

Bạn đã đúng. –

2

Để mở rộng câu trả lời của Brian Agnew, cũng có thể đáng để thêm một lớp Point mà phương thức addPoints có thể tham gia. Nó có thể giúp thêm/xóa điểm dễ dàng hơn từ đa giác của bạn.

public final class Point<X,Y>{ 
    private final X x; 
    private final Y y; 

    public Point(X x, Y y){ 
     this.x=x; 
     this.y=y; 
    } 

    public X getX(){return x;} 

    public Y getY(){return y;} 
} 

Sau đó, bạn có thể có:

public void addPoints(Point<Integer,Integer>... points){ 
    for(Point<Integer,Integer> point:points) 
     //your logic 
} 
+0

['java.awt.Point'] (http://docs.oracle.com/javase/6/docs/api/java/awt/Point.html) đã tồn tại (kể từ 1.0). Không cần phải sáng chế lại bánh xe. – Asaph

+0

Tôi thường sẽ đồng ý, nhưng đối với trường hợp này sử dụng một lớp điểm bất biến làm cho một số ý nghĩa, và mã này có thể tái sử dụng trong nhiều ứng dụng khác vì nó sử dụng Generics. –

+0

Có thể đặt tên lớp 'ImmutablePoint' để phân biệt nó và làm cho mã mô tả tốt hơn ý định? – Asaph

Các vấn đề liên quan