2009-03-10 37 views
7

Tôi đang làm việc với một số mã để thêm nút con vào cha mẹ của nó trong hàm tạo của con. Mã này trông giống như sau:Thực hành tốt nhất: Thêm nút con vào cha mẹ trong hàm tạo con hay không?

Class:

class Node1 { 
    public Node1(Node1 parent, String name) { 
    if(parent != null) { 
     parent.add(this); 
    } 
    this.parent = parent; 
    } 

    private void add(Node1 child) { 
    children.add(child); 
    } 
} 

Cách sử dụng:

Node1 parent = new Node1(null, "parent"); 
Node1 child1 = new Node1(parent, "child1"); 
Node1 child2 = new Node1(parent, "child2"); 

Bằng cách thực hiện nó theo cách này người sử dụng của lớp Node1 không nhất thiết phải thêm một cách rõ ràng các nút con (ít mã hơn) cho nó là cha mẹ và bạn đã đảm bảo một nút con có một phụ huynh.

Cá nhân tôi sẽ không viết nó như thế này, nhưng nhiều hơn như sau:

class Node2 { 
    public Node2(String name) { 
    } 

    public void add(Node2 child) { 
    children.add(child); 
    child.setParent(this); 
    } 
} 

Node2 parent = new Node2("parent"); 
Node2 child1 = new Node2("child1"); 
parent.add(child1); 
Node2 child2 = new Node2("child2"); 
parent.add(child2); 

Vì vậy, câu hỏi của tôi là, đây là một ý tưởng tốt để thực hiện nó như thể hiện trong lớp Node1 hoặc là có bất kỳ phản đối để làm điều đó theo cách đó? Hay không có lý lẽ nào về lý do tại sao người ta lại giỏi hơn người kia?

Trả lời

11

Cá nhân tôi không thích ví dụ đầu tiên vì bạn đang thêm một Nút chưa được "sẵn sàng" (do hàm tạo không hoàn thành việc thực thi). Trong hầu hết các trường hợp, nó sẽ hoạt động tốt, nhưng trong trường hợp cực đoan, bạn có thể có các lỗi khá khó tìm.

+0

+1: Khá nhiều những gì tôi sẽ nói. –

+0

Đây là một điểm tốt, tốt hơn là không sử dụng điều này trong một hàm tạo. –

1

Tôi nghĩ cả hai triển khai đều ổn.

Câu hỏi đặt ra là bạn sẽ sử dụng lớp này như thế nào: trước tiên bạn sẽ tạo danh sách các nút và sau đó bắt đầu thêm mối quan hệ của họ hoặc bạn sẽ làm điều đó theo cách có trật tự như trong ví dụ của bạn?

Giải pháp thứ hai mang lại sự linh hoạt hơn, nếu bạn muốn sử dụng Node1 làm siêu lớp, bạn không bị ràng buộc với chữ ký hàm tạo.

2

Tôi sẽ sử dụng trường hợp thứ hai vì sau đó tôi sẽ có thể thêm trẻ em sau nhưng không chỉ trong trình tạo.

0

Nếu bạn lấy được Node từ lớp TreeNode thì bạn sẽ tự động nhận được bản triển khai thứ 2 của bạn. Bạn có thể thêm treenode "tùy chỉnh" của mình vào lớp Treeview thông thường.

1

Tôi không thích trường hợp đầu tiên - đối tượng cha mẹ được sửa đổi kỳ diệu chỉ bằng cách được chuyển vào - bạn phải đọc mã hoặc tài liệu để nhận ra điều này đang xảy ra. Chỉ cần chuyển vào phụ huynh chỉ ngụ ý rằng đứa trẻ biết cha mẹ - không phải là đứa trẻ cũng được thêm vào danh sách nội bộ của cha mẹ.

Ví dụ thứ hai tốt hơn. Bạn cũng có thể trả lại con từ 'thêm' hoạt động để cho phép hoạt động chaining như:

Node2 child = parent.add(new Node2()); 
1

tôi thấy không có lý do tại sao không kết hợp hai cách tiếp cận để thuận tiện:

class Node1 { 
    public Node1(String name, Node1 parent = null) { 
    this.name = name; 
    // etc., do initialization 

    if(parent != null) 
     parent.add(this); 
    } 

    private void add(Node1 child) { 
    child.setParent(this); 
    children.add(child); 
    } 
} 

Lưu ý rằng setParent () hoặc là ném một ngoại lệ khi đứa trẻ đã có bộ cha mẹ của nó, hoặc xóa chính nó khỏi danh sách con của cha mẹ trước đây.

0

Thứ nhất cái xấu trong mẫu đầu tiên của bạn là: if (mẹ = null) { việc kiểm tra này là cần thiết bởi vì bạn cần phải có một cơ hội để tạo ra gốc rễ của cây, nhưng hai nhà nước tham số trông xấu xí.

Ngoài ra, mẫu đầu tiên của bạn không tốt vì thực hiện các hành động ngầm định (thêm trẻ vào cha mẹ đã qua).

0

Tôi chỉ muốn thực hiện # 1 khi cần thiết phải có nút cha với nút con. Trong trường hợp này, hoàn toàn có thể cho mã máy khách bỏ qua cuộc gọi đến Node1.add (con Node1) dẫn đến các lỗi sau này.

Tôi muốn thực hiện # 2 cách khác bởi vì nó là rõ ràng hơn để có một cách sử dụng như

Node1 parent = new Node1(); 
Node1 child = new Node1(); 
parent.add(child); 
Các vấn đề liên quan