Tôi sử dụng thư viện của bên thứ ba. Họ truyền cho tôi một POJO mà, với ý định và mục đích của chúng tôi, có lẽ được triển khai như thế này:
public class OurData {
private String foo;
private String bar;
private String baz;
private String quux;
// A lot more than this
// IMPORTANT: NOTE THAT THIS IS A PACKAGE PRIVATE CONSTRUCTOR
OurData(/* I don't know what they do */) {
// some stuff
}
public String getFoo() {
return foo;
}
// etc.
}
Vì nhiều lý do, bao gồm nhưng không giới hạn trong việc đóng gói API của họ và tạo điều kiện cho thử nghiệm đơn vị, tôi muốn bọc dữ liệu của họ. Nhưng tôi không muốn các lớp cốt lõi của mình phụ thuộc vào dữ liệu của họ (một lần nữa, vì lý do kiểm tra)! Vì vậy, ngay bây giờ tôi có một cái gì đó như thế này:
public class DataTypeOne implements DataInterface {
private String foo;
private int bar;
private double baz;
public DataTypeOne(String foo, int bar, double baz) {
this.foo = foo;
this.bar = bar;
this.baz = baz;
}
}
public class DataTypeTwo implements DataInterface {
private String foo;
private int bar;
private double baz;
public DataTypeOne(String foo, int bar, double baz, String quux) {
this.foo = foo;
this.bar = bar;
this.baz = baz;
this.quux = quux;
}
}
Và sau đó:
public class ThirdPartyAdapter {
public static makeMyData(OurData data) {
if(data.getQuux() == null) {
return new DataTypeOne(
data.getFoo(),
Integer.parseInt(data.getBar()),
Double.parseDouble(data.getBaz()),
);
} else {
return new DataTypeTwo(
data.getFoo(),
Integer.parseInt(data.getBar()),
Double.parseDouble(data.getBaz()),
data.getQuux();
);
}
}
Lớp bộ điều hợp này được kết hợp với một vài lớp khác PHẢI biết về API của bên thứ ba, hạn chế tính phổ biến của nó thông qua phần còn lại của hệ thống của tôi. Tuy nhiên ... giải pháp này là GROSS! Trong Clean Code, trang 40:
Hơn ba đối số (đa âm) đòi hỏi sự biện minh rất đặc biệt - và sau đó không nên sử dụng.
Những điều tôi đã xem xét:
- Tạo một đối tượng nhà máy chứ không phải là một phương thức trợ giúp tĩnh
- Không giải quyết được vấn đề có một cuộc tranh cãi bajillion
- Tạo một lớp con của DataTypeOne và DataTypeTwo có hàm tạo phụ thuộc
- Vẫn có một hàm tạo được bảo vệ đa âm
- Tạo các triển khai hoàn toàn riêng biệt phù hợp với cùng một giao diện
- Nhiều ý tưởng trên cùng một lúc
Tình huống này nên được xử lý như thế nào?
Lưu ý đây không phải là một tình huống chống tham nhũng . Không có gì sai với API của họ. Các vấn đề là:
- Tôi không muốn cấu trúc dữ liệu của tôi có
import com.third.party.library.SomeDataStructure;
- Tôi không thể xây dựng cấu trúc dữ liệu của họ trong các trường hợp thử nghiệm của mình
- Giải pháp hiện tại của tôi dẫn đến số lượng đối số rất cao. Tôi muốn giữ số lượng đối số thấp, KHÔNG chuyển qua cấu trúc dữ liệu của họ.
- Câu hỏi đó là " những gì một lớp chống tham nhũng là gì?". Câu hỏi của tôi là " làm thế nào tôi có thể sử dụng một mẫu, bất kỳ mẫu nào, để giải quyết tình huống này?"
Tôi cũng không yêu cầu mã (nếu không câu hỏi này sẽ có trên SO), chỉ yêu cầu đủ câu trả lời để cho phép tôi viết mã hiệu quả (câu hỏi đó không cung cấp).
The ideal number of arguments for a function is zero (niladic). Next comes one (monadic), followed closely by two (dyadic). Three arguments (triadic) should be avoided where possible. More than three (polyadic) requires very special justification — and then shouldn’t be used anyway.