मेरा वर्तमान एप्लिकेशन उपयोगकर्ताओं को कस्टम स्क्रीन के सेट के माध्यम से कस्टम वेब फ़ॉर्म को परिभाषित करने की अनुमति देता है। यह अनिवार्य रूप से एक ईएवी प्रकार का आवेदन है। इस प्रकार, मैं किसी दिए गए पृष्ठ को प्रस्तुत करने के लिए HTML या ASP.NET मार्कअप को हार्ड कोड नहीं कर सकता। इसके बजाए, यूआई सेवा परत से फॉर्म ऑब्जेक्ट का एक उदाहरण अनुरोध करता है, जो बदले में कई आरडीएमबीएस टेबल का उपयोग करके एक बनाता है। फार्म आप इस तरह के एक संदर्भ में देखने की अपेक्षा करेंगे वर्गों की तरह शामिल हैं: Form
=>IEnumerable<FormSections>
=>IEnumerable<FormFields>
क्या यह आईओसी के लिए एक सामान्य उपयोग मामला है?
यहाँ सेवा परत की तरह लग रहा है:
public class MyFormService: IFormService{
public Form OpenForm(int formId){
//construct and return a concrete implementation of Form
}
}
सब कुछ (कुछ समय के लिए) ठाठ से काम करता है । यूआई किसी भी रूप में कोई भी बुद्धिमान नहीं है कि किसी भी रूप में कौन से अनुभाग/फ़ील्ड मौजूद हैं: यह खुशी से फॉर्म ऑब्जेक्ट को एक कार्यात्मक एएसपी.नेट पृष्ठ में प्राप्त करता है।
कुछ हफ्ते बाद, मुझे व्यवसाय से एक नई आवश्यकता मिलती है: जब किसी फॉर्म के गैर-संपादन योग्य (यानी केवल पढ़ने के लिए) संस्करण देखते हैं, तो कुछ फ़ील्ड मान एक साथ विलय किए जाने चाहिए और अन्य प्रदूषित/गणना वाले फ़ील्ड होना चाहिए जोड़ा। कोई समस्या नहीं मैं कहता हूं। सीधे शब्दों में, ताकि उसके तरीकों को और अधिक स्पष्ट कर रहे हैं मेरी सेवा वर्ग में संशोधन:
public class MyFormService: IFormService{
public Form OpenFormForEditing(int formId){
//construct and return a concrete implementation of Form
}
public Form OpenFormForViewing(int formId){
//construct and a concrete implementation of Form
//apply additional transformations to the form
}
}
फिर सब कुछ अच्छा काम करता है और शेष बल को बहाल कर दिया गया। यूआई फॉर्म में क्या है, और हमारे चिंताओं को अलग करने के लिए अज्ञेयवादी है। कुछ ही हफ्ते बाद, व्यवसाय एक नई आवश्यकता बताता है: कुछ परिदृश्यों में, हमें उपरोक्त संदर्भित फॉर्म ट्रांसफॉर्मेशन के केवल कुछ लागू करना चाहिए।
इस बिंदु पर, ऐसा लगता है कि "स्पष्ट विधि" दृष्टिकोण एक मृत अंत तक पहुंच गया है, जब तक कि मैं विधियों के विस्फोट (OpenFormViewingScenario1, OpenFormViewingScenario2, आदि) के साथ समाप्त नहीं करना चाहता। इसके बजाय, मैं अविवेक के एक अन्य स्तर पर परिचय: सतह पर
public interface IFormViewCreator{
void CreateView(Form form);
}
public class MyFormService: IFormService{
public Form OpenFormForEditing(int formId){
//construct and return a concrete implementation of Form
}
public Form OpenFormForViewing(int formId, IFormViewCreator formViewCreator){
//construct a concrete implementation of Form
//apply transformations to the dynamic field list
return formViewCreator.CreateView(form);
}
}
, इस स्वीकार्य दृष्टिकोण की तरह लगता है और अभी तक वहाँ एक निश्चित गंध है। अर्थात्, यूआई, जो OpenFormForViewing के कार्यान्वयन विवरण के बारे में अज्ञानी आनंद में रह रहा था, के पास IFormViewCreator का एक उदाहरण होना चाहिए और उसका निर्माण होना चाहिए।
- मेरे सवालों का दुगना कर रहे हैं: वहाँ composability मैं के बाद कर रहा हूँ प्राप्त करने के लिए एक बेहतर तरीका है? (शायद 0oकंक्रीट IFormViewCreator बनाने के लिए एक आईओसी कंटेनर या घर लुढ़का कारखाने का उपयोग कर द्वारा?
- क्या मैंने मूल रूप से अमूर्तता को खराब कर दिया था?
+1 के साथ भी किया जा सकता है। – Lucero
मैं गंध के बारे में आपसे सहमत हूं। ऐसा लगता है कि यूआई को IFormViewCreator के बारे में पता नहीं होना चाहिए। आपके लिए एक सवाल: क्या यूआई के पास पैरामीटर का ज्ञान है जो आपको "स्वाद" को वापस करने के लिए निर्देशित करना चाहिए? यूआई को किसी ऑब्जेक्ट में पास करने के लिए और अधिक समझ हो सकती है जो कि विभिन्न मानों के लिए एक कंटेनर के रूप में कार्य करता है जो निर्धारित करता है कि कौन से परिवर्तन लागू होते हैं। आपकी OpenFormForViewing() विधि फ़ैक्टरी क्लास को अग्रेषित करने के लिए ज़िम्मेदार होगी, या स्पष्ट रूप से यह पता लगाने के लिए कि "स्वाद" वापस लौटने के लिए जिम्मेदार होगा। एक अच्छी प्रतिक्रिया के लिए –