लेकिन ड्रा () विधि बहुत ज्यादा निर्भर नहीं है कि उपयोगकर्ता इंटरफ़ेस क्या है?
व्यावहारिक रूप से, आपके सिस्टम में कुछ कोड को यह जानना आवश्यक है कि किसी चीज़ को कैसे आकर्षित किया जाए, Rectangle
यदि वह उपयोगकर्ता-अंत की आवश्यकता है। और यह कुछ बिंदुओं पर उबलने वाला है, जो वास्तव में निम्न स्तर की चीजें जैसे कि पिक्सेल को व्यवस्थित करना या कंसोल में कुछ प्रदर्शित करना है।
एक युग्मन दृष्टिकोण से मेरे लिए सवाल यह है कि इस प्रकार की जानकारी पर क्या / क्या निर्भर करना चाहिए, और किस हद तक विस्तार (कितना सार, उदा)?
एट्रिब्यूटिंग ड्रॉइंग / रेंडरिंग कैपेबिलिटीज
क्योंकि यदि उच्च-स्तरीय ड्राइंग कोड केवल कुछ बहुत सार पर निर्भर करता है, तो वह एब्सट्रैक्शन उन सभी प्लेटफार्मों पर काम करने में सक्षम हो सकता है (जो ठोस कार्यान्वयन के प्रतिस्थापन के माध्यम से) आप लक्ष्य करने का इरादा रखते हैं। एक आकस्मिक उदाहरण के रूप में, कुछ बहुत ही अमूर्त IDrawer
इंटरफ़ेस कंसोल और GUI API दोनों में प्लॉट शेप जैसी चीजों को करने में सक्षम हो सकते हैं (कंसोल कार्यान्वयन ASCII कला के साथ कुछ 80xN "छवि" जैसे कंसोल का इलाज कर सकता है)। बेशक यह एक विपरीत उदाहरण है क्योंकि आमतौर पर आप जो करना चाहते हैं वह एक इमेज / फ्रेम बफर की तरह कंसोल आउटपुट का इलाज करता है; आमतौर पर अधिकांश उपयोगकर्ता-एंड को कॉनसोल में अधिक टेक्स्ट-आधारित इंटरैक्शन के लिए कॉल की आवश्यकता होती है।
एक और विचार एक स्थिर अमूर्त डिजाइन करना कितना आसान है? क्योंकि यह आसान हो सकता है यदि आप सभी को लक्षित कर रहे हैं आधुनिक जीयूआई एपीआई मूल आकार-ड्राइंग क्षमताओं को दूर करने के लिए जैसे कि लाइनों, आयतों, रास्तों, पाठ, इस तरह की चीजों की साजिश रचने (आदिमता के एक सीमित सेट के बस सरल 2 डी रेखांकन) , एक अमूर्त इंटरफ़ेस के साथ, जो कि कम लागत के साथ विभिन्न उपप्रकारों के माध्यम से उन सभी के लिए आसानी से लागू किया जा सकता है। यदि आप इस तरह के अमूर्त को प्रभावी ढंग से डिजाइन कर सकते हैं और इसे सभी लक्षित प्लेटफार्मों पर लागू कर सकते हैं, तो मैं कहूंगा कि यह बहुत कम बुराई है, अगर एक बुराई भी है, तो एक आकृति या जीयूआई नियंत्रण के लिए या जो कुछ भी जानना है कि इस तरह का उपयोग करके खुद को कैसे आकर्षित करना है अमूर्त।
लेकिन कहते हैं कि आप एक Playstation पोर्टेबल, iPhone, एक XBox एक, और शक्तिशाली गेमिंग पीसी के बीच भिन्न होने वाले गैरी विवरण को दूर करने की कोशिश कर रहे हैं, जबकि आपकी जरूरतों को हर एक पर सबसे अत्याधुनिक 3 डी प्रतिपादन / छायांकन तकनीकों का उपयोग करना है। । उस मामले में जब एक अंतर्निहित इंटरफ़ेस के साथ आने के लिए रेंडरिंग डिटेल्स को अमूर्त करने की कोशिश की जाती है, जब अंतर्निहित हार्डवेयर क्षमताएं और API अलग-अलग होते हैं, इसलिए बेतहाशा समय के डिजाइन और फिर से डिजाइन करने के परिणामस्वरूप लगभग निश्चित हो जाता है, अप्रत्याशित डिजाइन परिवर्तनों की पुनरावृत्ति की एक उच्च संभावना। खोजों, और इसी तरह एक न्यूनतम-आम भाजक समाधान जो अंतर्निहित हार्डवेयर की पूर्ण विशिष्टता और शक्ति का दोहन करने में विफल रहता है।
डिपेंडेंसी फ्लो टुवर्ड्स स्टेबल बनाना, "इजी" डिज़ाइन्स
मेरे क्षेत्र में मैं उस आखिरी परिदृश्य में हूं। हम मूल रूप से अलग-अलग अंतर्निहित क्षमताओं और एपीआई के साथ बहुत सारे हार्डवेयर को लक्षित करते हैं, और उन सभी पर शासन करने के लिए एक रेंडरिंग / ड्राइंग एब्सट्रैक्शन के साथ आने की कोशिश करते हैं, यह सीमावर्ती निराशाजनक है (हम विश्व प्रसिद्ध हो सकते हैं बस प्रभावी रूप से कर रहे हैं क्योंकि यह एक गेम होगा उद्योग में परिवर्तक)। तो अंत में मैं मेरे मामले में चाहते हैं अलंकारिक की तरह है Shape
या Model
या Particle Emitter
कि जानता है कि कैसे खुद को आकर्षित करने के लिए, भले ही वह व्यक्त कर रहा है कि सबसे अमूर्त तरह से संभव उच्चतम स्तर के में ड्राइंग और ...
... क्योंकि वे सार सही ढंग से डिजाइन करने के लिए बहुत कठिन हैं, और जब एक डिजाइन सही होना मुश्किल है, और सब कुछ इस पर निर्भर करता है, तो यह सबसे महंगा केंद्रीय डिजाइन के लिए एक नुस्खा है जो तरंग को बदलता है और इसके आधार पर सब कुछ तोड़ देता है। तो आखिरी चीज जो आप चाहते हैं वह आपके सिस्टम में निर्भरता के लिए है ताकि अमूर्त डिजाइनों की ओर प्रवाह करना मुश्किल हो जाए सही (बहुत ही कठोर बिना घुसपैठ के बदलावों को स्थिर करना)।
मुश्किल पर निर्भर करता है आसान, आसान पर नहीं निर्भर करता है मुश्किल
इसलिए हम इसके बजाय जो निर्भर करते हैं, वह उन चीजों के प्रति निर्भरता को बढ़ाता है, जिन्हें डिजाइन करना आसान है। एक अमूर्त "मॉडल" डिजाइन करना बहुत आसान है, जो सिर्फ पॉलीगॉन और सामग्री जैसी चीजों को संग्रहीत करने पर केंद्रित है और उस डिजाइन को सही से प्राप्त करने के लिए एक सार "रेंडरर" डिजाइन करना है, जिसे प्रभावी ढंग से लागू किया जा सकता है (सेवा योग्य ड्राइंग के लिए) एक पीसी से पीएसपी के रूप में हार्डवेयर के लिए समान रूप से अनुरोध करता है।
इसलिए हम उन चीजों से दूर निर्भरता को उल्टा कर देते हैं जिन्हें डिजाइन करना मुश्किल है। अमूर्त मॉडल बनाने के बजाय एक सार रेंडरर डिज़ाइन के लिए खुद को आकर्षित करना जानते हैं, जो कि वे सभी पर निर्भर करते हैं (और उनके कार्यान्वयन में टूट जाते हैं यदि वह डिज़ाइन बदलता है), तो हमारे पास एक अमूर्त रेंडरर है जो हमारे दृश्य में प्रत्येक सार वस्तु को आकर्षित करना जानता है ( मॉडल, कण उत्सर्जक, आदि), और इसलिए हम पीसी के लिए एक OpenGL रेंडरर उपप्रकार लागू कर सकते हैं जैसे RendererGl
, PSPs के RendererPsp
लिए एक और, मोबाइल फोन के लिए एक और, आदि उस मामले में निर्भरता स्थिर डिजाइन की ओर बह रही है, सही होने के लिए आसान है, आदि। रेंडरर से हमारे दृश्य में विभिन्न प्रकार की संस्थाओं (मॉडल, कण, बनावट आदि) के लिए, अन्य तरीके से नहीं।
- मैं "स्थिरता / अस्थिरता" का उपयोग अंकल बॉब के अभिवाही / अपवाही कपलिंग मेट्रिक से थोड़े अलग अर्थों में कर रहा हूं जो कि परिवर्तन की कठिनाई को अधिक से अधिक माप रहा है जहां तक मैं समझ सकता हूं। मैं "परिवर्तन की आवश्यकता की संभावना" के बारे में अधिक बात कर रहा हूं, हालांकि उसकी स्थिरता मीट्रिक वहां उपयोगी है। जब "परिवर्तन की संभावना" "परिवर्तन में आसानी" के लिए आनुपातिक होती है (उदा: परिवर्तन की आवश्यकता के लिए सबसे अधिक संभावना अंकल बॉब की मैट्रिक से अस्थिरता और साहसी कपलिंग है), तो इस तरह के किसी भी संभावित परिवर्तन सस्ते और गैर-घुसपैठ करने के लिए होते हैं , किसी भी केंद्रीय डिजाइन को छूने के बिना केवल एक कार्यान्वयन की आवश्यकता होती है।
यदि आप अपने आप को अपने कोडबेस के केंद्रीय स्तर पर कुछ अलग करने की कोशिश कर रहे हैं और यह सिर्फ दीवारों के खिलाफ सिर पीटने और लगातार हर महीने / साल में लगातार बदलाव करने के बजाय 8,000 फ़ाइलों को अपडेट करने की आवश्यकता है, तो इसे डिजाइन करना बहुत मुश्किल है क्योंकि यह है उस पर निर्भर सब कुछ तोड़कर, मेरा नंबर एक सुझाव निर्भरता पर विचार करने पर है। देखें कि क्या आप कोड को इस तरह से लिख सकते हैं कि जिस चीज़ को डिज़ाइन करना इतना कठिन है, वह सब कुछ पर निर्भर करता है जो कि डिज़ाइन करना आसान है, न कि उन चीज़ों के बारे में जिन्हें डिज़ाइन करना बहुत आसान है। ध्यान दें कि मैं डिज़ाइन (विशेष रूप से इंटरफ़ेस डिज़ाइन) के बारे में बात कर रहा हूं और कार्यान्वयन नहीं: कभी-कभी चीजों को डिजाइन करना आसान होता है और लागू करने में मुश्किल होती है, और कभी-कभी चीजों को डिजाइन करना मुश्किल होता है लेकिन लागू करना आसान होता है। निर्भरताएं डिजाइन की ओर प्रवाहित होती हैं, इसलिए ध्यान केवल इस बात पर होना चाहिए कि जिस दिशा में निर्भरता प्रवाहित होती है उसका निर्धारण करने के लिए किसी चीज को डिजाइन करना कितना कठिन है।
एकल जिम्मेदारी सिद्धांत
मेरे लिए एसआरपी इतना दिलचस्प नहीं है आमतौर पर (हालांकि संदर्भ के आधार पर)। मेरा मतलब है कि उन चीजों को डिजाइन करने में एक सख्त संतुलन वाला कार्य है जो उद्देश्य और बनाए रखने में स्पष्ट हैं, लेकिन आपकी Shape
वस्तुओं को अधिक विस्तृत जानकारी का खुलासा करना पड़ सकता है यदि वे नहीं जानते कि कैसे खुद को आकर्षित करना है, उदाहरण के लिए, और बहुत सार्थक चीजें नहीं हो सकती हैं। एक विशेष उपयोग के संदर्भ में एक आकृति के साथ निर्माण करें और इसे ड्रा करें। वहाँ व्यापार के बारे में सब कुछ के साथ है, और यह एसआरपी से संबंधित नहीं है कि चीजों को कैसे कुछ संदर्भों में मेरे अनुभव में इस तरह के रखरखाव दुःस्वप्न बनने में सक्षम बनाने के बारे में जागरूक कर सकता है।
यह युग्मन और दिशा में निर्भर करता है जिसमें निर्भरता आपके सिस्टम में प्रवाहित होती है। यदि आप एक सार प्रतिपादन इंटरफ़ेस को पोर्ट करने की कोशिश कर रहे हैं जो सब कुछ निर्भर करता है (क्योंकि वे इसे खुद को आकर्षित करने के लिए उपयोग कर रहे हैं) एक नया लक्ष्य एपीआई / हार्डवेयर और महसूस करने के लिए आपको इसे प्रभावी ढंग से काम करने के लिए इसके डिज़ाइन को बदलना होगा, फिर यह एक बहुत महंगा परिवर्तन है जिसके लिए आपके सिस्टम में हर चीज के कार्यान्वयन को बदलने की आवश्यकता होती है जो जानता है कि खुद को कैसे आकर्षित किया जाए। और यह सबसे व्यावहारिक रखरखाव का मुद्दा है, मैं चीजों से परिचित हूं कि कैसे खुद को आकर्षित करना है अगर यह निर्भरता की एक नाव लोड करने के लिए अनुवाद करता है जो अमूर्त की ओर बहती है जो सही ढंग से डिजाइन करना बहुत मुश्किल है।
डेवलपर गर्व
मैं इस एक बिंदु का उल्लेख करता हूं, क्योंकि मेरे अनुभव में, डिजाइन करने में आसान चीजों के प्रति निर्भरता की दिशा को प्रवाहित करने के लिए यह सबसे बड़ी बाधा है। डेवलपर्स के लिए यहां थोड़ा महत्वाकांक्षी होना बहुत आसान है और कहते हैं, "मैं उन सभी पर शासन करने के लिए क्रॉस-प्लेटफ़ॉर्म रेंडरिंग एब्सट्रैक्शन डिज़ाइन कर रहा हूं, मैं यह हल करने वाला हूं कि अन्य डेवलपर्स पोर्टिंग में कितने महीने बिताते हैं, और मुझे मिलने वाला है यह सही है और यह हर एक मंच पर जादू की तरह काम करने वाला है जिसका हम हर एक पर अत्याधुनिक रेंडरिंग तकनीकों का समर्थन और उपयोग करते हैं; मैंने पहले ही इसे अपने दिमाग में शामिल कर लिया था। "जिस मामले में वे व्यावहारिक समाधान का विरोध करते हैं, जो कि ऐसा करने से बचना है और बस निर्भरता की दिशा को पलटना है और अनुवाद करना है कि क्या महंगा हो सकता है और केंद्रीय डिजाइन परिवर्तनों को लागू करने के लिए बस सस्ते और स्थानीय आवर्ती परिवर्तनों को लागू करना है। डेवलपर्स में "सफेद झंडा" वृत्ति के कुछ प्रकार होने की जरूरत है, जब कुछ ऐसा अमूर्त स्तर के लिए डिजाइन करना बहुत मुश्किल है और अपनी पूरी रणनीति पर पुनर्विचार करें, अन्यथा वे बहुत दुःख और दर्द में हैं। मैं इस तरह की महत्वाकांक्षाओं और लड़ने की भावना को डिजाइन करने के लिए एक आसान चीज के अत्याधुनिक कार्यान्वयन के लिए डिज़ाइन करने के लिए सुझाव दूंगा कि इस तरह की विश्व-विजेता महत्वाकांक्षाओं को इंटरफ़ेस डिजाइन स्तर पर ले जाया जाए।