ฉันใช้ห้องสมุดบุคคลที่สาม พวกเขาส่งPOJOให้ฉันซึ่งอาจนำไปใช้ในจุดประสงค์และวัตถุประสงค์ของเราเช่นนี้:
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.
}
ด้วยเหตุผลหลายประการรวมถึง แต่ไม่ จำกัด เพียงการห่อหุ้ม API และอำนวยความสะดวกในการทดสอบหน่วยฉันต้องการห่อข้อมูลของพวกเขา แต่ฉันไม่ต้องการให้คลาสหลักของฉันขึ้นอยู่กับข้อมูลของพวกเขา (อีกครั้งเพื่อเหตุผลในการทดสอบ)! ดังนั้นตอนนี้ฉันมีสิ่งนี้:
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;
}
}
แล้วนี่:
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();
);
}
}
คลาสอะแด็ปเตอร์นี้ประกอบกับคลาสอื่น ๆ ที่ต้องรู้เกี่ยวกับ API ของบุคคลที่สามซึ่งจำกัดความแพร่หลายในระบบของฉัน อย่างไรก็ตาม ... โซลูชันนี้คือ GROSS! ในรหัสที่สะอาดหน้า 40:
มากกว่าสามข้อโต้แย้ง (polyadic) ต้องมีเหตุผลพิเศษมาก - และไม่ควรใช้ต่อไป
สิ่งที่ฉันได้พิจารณา:
- การสร้างวัตถุจากโรงงานแทนที่จะเป็นวิธีผู้ช่วยคงที่
- ไม่ได้แก้ปัญหาการมีข้อโต้แย้งเป็นพันล้าน
- การสร้างคลาสย่อยของ DataTypeOne และ DataTypeTwo ที่มี Constructor ที่ต้องพึ่งพา
- ยังมีคอนสตรัคที่มีการป้องกันแบบ polyadic
- สร้างการใช้งานแยกกันอย่างสิ้นเชิงที่สอดคล้องกับอินเตอร์เฟซเดียวกัน
- หลายความคิดข้างต้นพร้อมกัน
สถานการณ์นี้ควรได้รับการจัดการอย่างไร?
โปรดทราบว่านี่ไม่ใช่สถานการณ์เลเยอร์ต่อต้านการทุจริต ไม่มีอะไรผิดปกติกับ API ของพวกเขา ปัญหาคือ:
- ฉันไม่ต้องการให้โครงสร้างข้อมูลของฉันมี
import com.third.party.library.SomeDataStructure;
- ฉันไม่สามารถสร้างโครงสร้างข้อมูลในกรณีทดสอบได้
- โซลูชันปัจจุบันของฉันส่งผลให้มีการนับอาร์กิวเมนต์สูงมาก ฉันต้องการให้การนับมีค่าน้อยโดยไม่ผ่านโครงสร้างข้อมูลของพวกเขา
- คำถามที่เป็น " สิ่งที่เป็นชั้นป้องกันการทุจริต?" คำถามของฉันคือ " วิธีการที่ฉันสามารถใช้รูปแบบรูปแบบใด ๆ ที่จะแก้สถานการณ์นี้?"
ฉันไม่ได้ขอรหัสอย่างใดอย่างหนึ่ง (มิฉะนั้นคำถามนี้จะอยู่ใน SO) เพียงแค่ขอคำตอบที่เพียงพอเพื่อให้ฉันเขียนรหัสได้อย่างมีประสิทธิภาพ (ซึ่งคำถามนั้นไม่ได้ให้)
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.