Saya menggunakan perpustakaan pihak ketiga. Mereka memberi saya POJO yang, untuk maksud dan tujuan kami, mungkin dilaksanakan seperti ini:
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.
}
Untuk banyak alasan, termasuk tetapi tidak terbatas pada merangkum API mereka dan memfasilitasi pengujian unit, saya ingin membungkus data mereka. Tetapi saya tidak ingin kelas inti saya bergantung pada data mereka (sekali lagi, untuk alasan pengujian)! Jadi sekarang saya punya sesuatu seperti ini:
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;
}
}
Dan kemudian ini:
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();
);
}
}
Kelas adaptor ini digabungkan dengan beberapa kelas lain yang HARUS tahu tentang API pihak ketiga, membatasi pervasiveness melalui seluruh sistem saya. Namun ... solusi ini adalah KOTOR! Dalam Kode Bersih, halaman 40:
Lebih dari tiga argumen (polyadic) membutuhkan pembenaran yang sangat khusus - dan karenanya tidak seharusnya digunakan.
Hal-hal yang saya pertimbangkan:
- Membuat objek pabrik daripada metode pembantu statis
- Tidak memecahkan masalah memiliki argumen bajillion
- Membuat subkelas DataTypeOne dan DataTypeTwo yang memiliki konstruktor dependen
- Masih memiliki konstruktor yang dilindungi polyadic
- Buat implementasi yang sepenuhnya terpisah yang sesuai dengan antarmuka yang sama
- Banyak dari ide-ide di atas secara bersamaan
Bagaimana seharusnya situasi ini ditangani?
Perhatikan ini bukan situasi lapisan anti korupsi . Tidak ada yang salah dengan API mereka. Masalahnya adalah:
- Saya tidak ingin memiliki struktur data MY
import com.third.party.library.SomeDataStructure;
- Saya tidak bisa membuat struktur data mereka dalam kasus pengujian saya
- Solusi saya saat ini menghasilkan jumlah argumen yang sangat tinggi. Saya ingin menjaga agar jumlah argumen tetap rendah, TANPA meneruskan struktur data mereka.
- Pertanyaan itu adalah " apa itu lapisan anti korupsi?". Pertanyaan saya adalah " bagaimana saya bisa menggunakan pola, pola apa saja, untuk menyelesaikan skenario ini?"
Saya juga tidak meminta kode (jika tidak pertanyaan ini ada di SO), hanya cukup meminta jawaban untuk memungkinkan saya menulis kode secara efektif (yang tidak disediakan pertanyaan itu).
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.