मैं थर्ड पार्टी लाइब्रेरी का उपयोग करता हूं। वे मुझे एक 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.
}
सहित कई कारणों से, लेकिन उनके एपीआई एनकैप्सुलेट करने और यूनिट परीक्षण की सुविधा तक सीमित नहीं है, मैं उनके डेटा को लपेटना चाहता हूं। लेकिन मैं नहीं चाहता कि मेरे मुख्य वर्ग उनके डेटा (फिर, परीक्षण कारणों के लिए) पर निर्भर रहें! तो अभी मेरे पास कुछ ऐसा है:
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();
);
}
}
यह एडेप्टर वर्ग अन्य कुछ वर्गों के साथ मिलकर बनता है जो MUST को थर्ड पार्टी एपीआई के बारे में जानते हैं, यह मेरे सिस्टम के बाकी हिस्सों के माध्यम से व्यापकता को सीमित करता है। हालाँकि ... यह समाधान सकल है! स्वच्छ संहिता में, पृष्ठ 40:
तीन से अधिक तर्कों (पॉलीएडिक) के लिए बहुत विशेष औचित्य की आवश्यकता होती है - और फिर वैसे भी इसका उपयोग नहीं किया जाना चाहिए।
जिन चीजों पर मैंने विचार किया है:
- स्थैतिक सहायक विधि के बजाय एक फैक्ट्री ऑब्जेक्ट बनाना
- एक bajillion तर्क होने की समस्या को हल नहीं करता है
- DataTypeOne और DataTypeTwo का एक उपवर्ग बनाना, जिसमें आश्रित कंस्ट्रक्टर हो
- अभी भी एक पॉलीएडिक संरक्षित कंस्ट्रक्टर है
- समान इंटरफ़ेस के अनुरूप पूरी तरह से अलग कार्यान्वयन बनाएं
- एक साथ उपरोक्त विचारों के कई
इस स्थिति को कैसे संभाला जाना चाहिए?
ध्यान दें कि यह भ्रष्टाचार-विरोधी परत की स्थिति नहीं है। उनके एपीआई में कुछ भी गलत नहीं है। समस्याएं हैं:
- मैं नहीं चाहता कि मेरी डेटा संरचनाएं हों
import com.third.party.library.SomeDataStructure;
- मैं अपने परीक्षण मामलों में उनकी डेटा संरचनाओं का निर्माण नहीं कर सकता
- मेरे वर्तमान समाधान में बहुत ही उच्च तर्क मायने रखता है। मैं उनके डेटा स्ट्रक्चर्स में जाने के बिना तर्क को कम रखना चाहता हूं।
- वह सवाल है " भ्रष्टाचार विरोधी परत क्या है?"। मेरा सवाल है " मैं इस परिदृश्य को हल करने के लिए किसी पैटर्न, किसी भी पैटर्न का उपयोग कैसे कर सकता हूं?"
मैं कोड के लिए नहीं कह रहा हूं, या तो (अन्यथा यह सवाल एसओ पर होगा), बस मुझे जवाब को प्रभावी ढंग से लिखने के लिए सक्षम करने के लिए पर्याप्त उत्तर के लिए पूछ रहा था (जो कि प्रश्न प्रदान नहीं करता है)।
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.