Tôi đang làm việc trên một thiết kế, nhưng tiếp tục đạt được một rào cản. Tôi có một lớp cụ thể (ModelDef) về cơ bản là chủ sở hữu của một cây nút phức được xây dựng bằng cách phân tích cú pháp lược đồ XML (nghĩ DOM). Tôi muốn tuân theo các nguyên tắc thiết kế tốt (RẮN) và đảm bảo rằng hệ thống kết quả có thể dễ dàng kiểm tra. Tôi có mọi ý định sử dụng DI để chuyển các phụ thuộc vào hàm tạo của ModelDef (để chúng có thể dễ dàng hoán đổi, nếu cần, trong khi thử nghiệm).
Tuy nhiên, điều tôi đang vật lộn với việc tạo ra cây nút. Cây này sẽ được tạo thành hoàn toàn từ các đối tượng "giá trị" đơn giản mà không cần phải được kiểm tra độc lập. (Tuy nhiên, tôi vẫn có thể chuyển một Nhà máy Trừu tượng vào ModelDef để hỗ trợ việc tạo các đối tượng này.)
Nhưng tôi tiếp tục đọc rằng một nhà xây dựng không nên làm bất kỳ công việc thực tế nào (ví dụ Flaw: Con constructor does Real Work ). Điều này có ý nghĩa hoàn hảo với tôi nếu "công việc thực tế" có nghĩa là xây dựng các đối tượng phụ thuộc nặng nề mà sau này người ta có thể muốn lấy ra để thử nghiệm. (Chúng nên được chuyển qua DI.)
Nhưng những gì về các đối tượng giá trị trọng lượng nhẹ như cây nút này? Cây phải được tạo ra ở đâu đó, phải không? Tại sao không thông qua hàm tạo của ModelDef (sử dụng phương thức buildNodeTree ())?
Tôi thực sự không muốn tạo cây nút bên ngoài ModelDef và sau đó chuyển nó vào (thông qua hàm tạo DI), bởi vì việc tạo cây nút bằng cách phân tích lược đồ đòi hỏi một lượng mã phức tạp đáng kể - mã cần được kiểm tra kỹ lưỡng . Tôi không muốn chuyển mã thành "keo" mã (tương đối tầm thường và có thể sẽ không được kiểm tra trực tiếp).
Tôi đã nghĩ đến việc đặt mã để tạo cây nút trong một đối tượng "trình xây dựng" riêng biệt, nhưng ngần ngại gọi nó là "trình xây dựng", vì nó không thực sự khớp với Mô hình Builder (dường như quan tâm nhiều hơn đến việc loại bỏ kính viễn vọng nhà xây dựng). Nhưng ngay cả khi tôi gọi nó là một cái gì đó khác (ví dụ: NodeTreeConstructor), nó vẫn cảm thấy giống như một chút hack chỉ để tránh việc nhà xây dựng ModelDef xây dựng cây nút. Nó phải được xây dựng ở đâu đó; Tại sao không phải là đối tượng sẽ sở hữu nó?