लगता है कि मैं इस "डेमेटर के कानून" चीज़ पर पढ़ रहा हूं, और यह (और सामान्य रूप से शुद्ध "रैपर" वर्ग) विरोधी पैटर्न होने लगते हैं। कहा तरीकोंरैपर/डेमेटर का कानून एक विरोधी पैटर्न
class ScreenSpaceEffects1 {
private FluidSimulator _fluidDynamics;
public FluidSimulator getFluidSimulator() { return _fluidDynamics; }
}
class ScreenSpaceEffects2 {
private FluidSimulator _fluidDynamics;
public void resetFluidSimulation() { _fluidDynamics.reset(); }
}
और तरीकों कॉल करने के लिए:
callingMethod() {
effects1.getFluidSimulator().reset(); // Version 1
effects2.resetFluidSimulation(); // Version 2
}
पहले लाल पर, संस्करण 2 लगता है
class FluidSimulator {
void reset() { /* ... */ }
}
अब अन्य वर्ग की दो अलग-अलग कार्यान्वयन पर विचार करें: एक कार्यान्वयन वर्ग पर विचार करें थोड़ा आसान, और "डेमेटर के नियम" का पालन करता है, फू के कार्यान्वयन इत्यादि को छुपाता है, लेकिन यह FluidSimulator में ScreenSpaceEffects में कोई भी परिवर्तन करता है। उदाहरण के लिए, अगर एक पैरामीटर रीसेट करने के लिए जोड़ा है, तो हमने:
class FluidSimulator {
void reset(bool recreateRenderTargets) { /* ... */ }
}
class ScreenSpaceEffects1 {
private FluidSimulator _fluidDynamics;
public FluidSimulator getFluidSimulator() { return _fluidDynamics; }
}
class ScreenSpaceEffects2 {
private FluidSimulator _fluidDynamics;
public void resetFluidSimulation(bool recreateRenderTargets) { _fluidDynamics.reset(recreateRenderTargets); }
}
callingMethod() {
effects1.getFluidSimulator().reset(false); // Version 1
effects2.resetFluidSimulation(false); // Version 2
}
दोनों संस्करणों में, callingMethod को बदलने की आवश्यकता है, लेकिन संस्करण 2 में, ScreenSpaceEffects भी की जरूरत है परिवर्तित करने की। क्या कोई रैपर/मुखौटा (एडाप्टर के अपवाद के साथ या बाहरी एपीआई लपेटने या आंतरिक को उजागर करने के लाभ के साथ) का लाभ समझा सकता है।
संपादित करें: कई वास्तविक उदाहरणों में से एक जिसके लिए मैं एक छोटे उदाहरण के बजाय इसमें भाग गया।
क्या आपका मतलब है "संस्करण 2 थोड़ा सा आसान लगता है"? –
हाँ, क्षमा करें, –
बदल जाएगा संस्करण 1 डेमेटर के नियम का पालन नहीं करता है। गलत टाइप? – Corwin