के बारे में कितना सोचो चलाने आप से निपटने में सक्षम हैं और आप किसके साथ काम कर रहे हैं।यह भी समझें कि पिछले कुछ वर्षों में आपने विशिष्ट ज्ञानआर्केड साइट चलाया है। आपने अपने क्षेत्र में पेशा हासिल किया है। अपनी खुद की स्थिति और परिसंपत्तियों को कभी कम मत समझें, यह वह आधार है जिसका आप संचालन कर रहे हैं और आप इसमें परिवर्तन पेश करेंगे। इसमें आपकी साइट का उपयोगकर्ताबेस शामिल है।
यह कई सुविधाओं जोड़ा था, यह बिंदु है जहां प्रक्रियात्मक प्रोग्रामिंग अभी जिस तरह जटिल और नई सुविधाओं को जोड़ने या साधारण डिजाइन संशोधनों बहुत मुश्किल हो सकता है बनाने लग रहा है करने के लिए मिला है।
यदि सिस्टम बढ़ते हैं, तो वे अधिक से अधिक जटिल हो जाते हैं। यह केवल प्रक्रियात्मक प्रोग्रामिंग के लिए विशिष्ट नहीं है, यह तथ्य की बात है। चूंकि आप अब कई सालों से साइट चला रहे हैं, आप जानते हैं कि चीजें कैसे बदलीं, खासकर इस क्षेत्र में कि उपयोगकर्ता आपकी साइट के साथ कैसे इंटरफेस करता है।
इसलिए मैं करने का निर्णय लिया कोशिश और वही सुविधाएँ साथ, लेकिन एक OOP प्रारूप में जमीन से साइट पुनःकूटित।
ऐसा कहा जाता है कि पुनः उपयोग करने योग्य सॉफ़्टवेयर बनाने के लिए ओओपी तकनीकों का उपयोग करना संभव हो सकता है, इसका कोई सबूत नहीं है (और नहीं हो सकता)।
लेकिन वाणिज्यिक सॉफ्टवेयर विकास में केवल कुछ ही उदाहरण हैं जहां पूरे आवेदन को स्क्रैच से पुनः लिखना एक सफलता थी। बहुत कम। वाणिज्यिक सॉफ्टवेयर विकास के नियम आपके विशिष्ट मामले में लागू नहीं हो सकते हैं, इसलिए बस कह रहे हैं।
साइट को रिकोड करने से पहले दो बार सोचें। केवल इसे प्राप्त करने के लिए बहुत सारे काम करना कुछ हद तक फलहीन है और निराशाजनक हो सकता है। इसके बजाए शायद अधिक विशेष रूप से देखें कि आपके वर्तमान डिज़ाइन में से कौन सी सबसे बड़ी समस्या है जिसे आप बदलना पसंद करेंगे।
यह पीएचपी साथ प्रक्रियात्मक मिश्रण और वस्तु उन्मुख शैली, आप (कोड विरासत कोड के एक सामान्य परिभाषा है w/स्वचालित परीक्षण ओ) विरासत कोड है जब जो विशेष रूप से उपयोगी हो सकता है संभव है।
मुद्दा रहा है वर्गों उठा रहा है,
मुझे लगता है कि अलग तरीके से व्यक्त करने की कोशिश: क्या के लिए के लिए कक्षाओं बारे में?
शुरुआत हमेशा सबसे कठिन कदम है। आप निर्णय लेने के लिए तैयार स्थिति में हैं, लेकिन आप भविष्य में नहीं देख सकते हैं। सबसे जोखिम भरा हिस्सा को खत्म करके जोखिम को कम करें। आपने शायद अपने फैसले को आधार देने के लिए कुछ प्रतिक्रिया प्राप्त करने के लिए यहां एक प्रश्न पूछना शुरू कर दिया है, लेकिन इससे शायद बोझ कम नहीं होगा और इससे भ्रम पैदा हो सकता है।हालांकि, शिक्षित होना अक्सर एक अच्छी बात है।
मैं कर रहा हूँ अनिश्चित कि क्या मैं जैसे उपयोगकर्ता समारोह में या यदि उपयोगकर्ता वर्ग बस/अद्यतन/शो उपयोगकर्ता विवरण जोड़ने के लिए होना चाहिए लॉग के साथ एक उपयोगकर्ता वर्ग के रूप में कक्षाओं के लिए काम करता है बनाने के लिए कोशिश कर रहा होना चाहिए और एक वर्ग वर्ग में लॉग में हिस्सा बेहतर होगा?
यह आपके आवेदन की प्रकृति और उपयोगकर्ता की प्रकृति पर निर्भर करता है। शायद आपकी अधिकांश स्क्रिप्ट को केवल यह जानना होगा कि कोई उपयोगकर्ता कंक्रीट या अज्ञात है (अज्ञात उपयोगकर्ता लॉग इन नहीं हुआ है), यह आईडी, नाम या उपनाम है।
आवेदन उस उपयोगकर्ता को किसी उपभोग करने वाले घटक को प्रदान करना चाहिए, इसलिए प्रत्येक कमांड/स्क्रिप्ट को उपयोगकर्ताओं की जानकारी प्राप्त करने और उपयोगकर्ताओं को संभालने (जैसे लॉग इन करने) को संभालने की आवश्यकता नहीं है, बी) यह सत्यापित करना कि घटक के लिए मान्य है या नहीं उपयोगकर्ता (अभिगम नियंत्रण)। इसे कहीं और रखा जाना चाहिए, उदा। application controllerPofEAA में।
आपकी प्रत्येक स्क्रिप्ट/कमांड जिनमें एप्लिकेशन नियंत्रक ऑब्जेक्ट है, उपयोगकर्ता के लिए पूछ सकता है और केवल उपयोगकर्ता से बातचीत कर सकता है।
हालांकि यह तकनीकी रूप से बोल रहा है। अपने आप को अनिश्चित होने के तथ्य से निपटें, उस जानकारी के साथ काम करें। अपनी ठोस समस्या को बेहतर बनाने की कोशिश करें, इसे हल करने के एक विशिष्ट तरीके के लिए पेशेवरों और विपक्षों को सूचीबद्ध करें, कोड शुरू करने से पहले कंक्रीट कोड से दूर हो जाएं। फिर पेशेवरों और विपक्ष की तुलना करें। चीजों को और अधिक सरल और कम जटिल बनाने की कोशिश करें।
संभवतः सरल शब्दों में लिखना कोड लिखने के बजाय क्या हो रहा है।
आपका कोड, काफी नंगे है, इसलिए यह मुश्किल है इसके बारे में बहुत कुछ कहना - विशेष रूप से मुझे नहीं पता कि आपकी आर्केड साइट क्या है (और आप किस श्रेणी के बारे में लिखते हैं)। यह शायद एक उदाहरण के लिए अभी भी अच्छा है। आपकी कक्षाओं में क्या देखा जा सकता है कि आप एक दूसरे के साथ सबकुछ मजबूत रूप से एकीकृत करते हैं।
उदाहरण के लिए आप डीबी से शुरू करते हैं। यह आम है, क्योंकि डीबी किसी भी आवेदन के लिए एक केंद्रीय घटक है। आवेदन करने के लिए आवेदन डीबी की जरूरत है। हालांकि आप चीजों को कम से कम जोड़ना चाहते हैं ताकि आपके सभी आदेश कुछ अन्य डीबी या एक नई उपयोगकर्ता ऑब्जेक्ट के साथ चल सकें जो आपके शेष एप्लिकेशन की डेटा ऑब्जेक्ट्स की तुलना में कुछ अन्य डीबी से जुड़ा हुआ है।
चूंकि उपयोगकर्ता प्रत्येक एप्लिकेशन में ऐसा केंद्रीय विषय है, तो इसका एक बहुत ही सरल इंटरफ़ेस होना चाहिए। प्रमाणीकरण के बारे में सभी महिमा विवरण, के उपयोगकर्ताओं के गुण आदि पुन: प्राप्त करने, अन्य वर्ग/घटक में सौंप दिया जाना चाहिए ताकि आप कार्यान्वयन जहाँ उपयोगकर्ताओं को जमा हो जाती है बदल सकते हैं और वे कैसे प्रमाणित:
के रूप में इस उदाहरण से पता चलता है , जब आपको आवश्यकता हो तो आप कार्यक्षमता जोड़ सकते हैं। जैसे जब तक आपके एप्लिकेशन को वास्तव में उपयोगकर्ताओं में लॉग इन करने की आवश्यकता नहीं है, तब तक क्यों परवाह है कि यह अब कैसे लिखा गया है?जो कुछ भी यह अब या भविष्य में आवश्यकता होगी (वस्तुओं The Clean Code Talks — Inheritance, Polymorphism, & Testing में की दो बवासीर देखें) -
एक कारखाने कि आवेदन वस्तु के लिए उपयोगकर्ता का निर्माण कर रहा है बनाएँ। यदि आपको प्रमाणीकरण की आवश्यकता है, तो इसे सत्र ऑब्जेक्ट या उपयोगकर्ता ऑब्जेक्ट इंटरफ़ेस में जोड़ें।
प्रमाणीकरण स्वयं को किसी भी तरह की कक्षा में लागू किया जाएगा, Authenticator
। इसलिए आप बाद में अपने इंटरफेस की समीक्षा भी कर सकते हैं, सत्र से उपयोगकर्ता या प्रमाणीकरण से प्रमाणीकरण के आमंत्रण को स्थानांतरित करके। केवल आपके आदेशों का एक अंश इन विशिष्ट कार्यों से निपटने की आवश्यकता होगी और चूंकि सभी नए कोड स्वचालित परीक्षणों के तहत हैं, क्योंकि आप ओओपी से फिर से लिखना और लाभ लेना चाहते हैं, आपने यह सुनिश्चित किया है कि सभी जगहें ढकी हुई हैं और ठीक से फिर से परिचालित हैं।
अनुरोध चरों तक पहुंचने के लिए भी सही है। यदि आप ओओपी के लाभों का उपयोग करना चाहते हैं - जो संकेत के साथ अत्यधिक जुड़ा हुआ है (और संकेत की प्रत्येक परत एक मूल्य के साथ आता है) - आपको सबसे पहले अपने बेस क्लास विशिष्ट डेटा पर काम करना चाहिए, न कि किसी भी डेटा (जैसे ग्लोबल्स और सुपरग्लोबल्स, मैंने आपके उदाहरण कोड में $_POST
देखा है)।
तो एक अनुरोध पर संचालित करने के लिए अपने नए कोड को सक्षम और एक प्रतिक्रिया देने के (इनपुट - प्रसंस्करण - आउटपुट):
$request = new Request($_SERVER, $_GET, $_POST, $_COOKIE, $_FILES, $_ENV);
$response = new Response;
उदाहरण BankAccount - Sample application used for PHPUnit training
अब इस नीचे सब कुछ से लिया Request
और Response
ऑब्जेक्ट पर प्रक्रिया कर सकते हैं - प्रक्रिया इनपुट करें और इसे आउटपुट में चालू करें। डोमेन कमांड (आपकी स्क्रिप्ट/आदेश जो आइटम करते हैं) को HTTP अनुरोध से इनपुट निकालने के बारे में अब देखभाल करने की आवश्यकता नहीं है जैसे $_POST
या $_GET
वे इसे Request
से सीधे ले जा सकते हैं - या यदि आप एक वर्ग लिखते हैं इसके स्वयं के आदेश - यह और भी अनुरूप हो सकता है। और कुछ आदेश स्वयं के अनुरोधों और प्रतिक्रियाओं पर काम कर सकते हैं।
अगला बड़ा विषय उपयोगकर्ता-इंटरफ़ेस है। आप लिखते हैं आप चाहते हैं:
मैं कोशिश करते हैं और एक ही सुविधाओं के साथ, लेकिन एक OOP प्रारूप में जमीन से साइट पुनःकूटित करना तय कर लिया है।
मैंने पहले से ही लिखा है कि ऐसा करना फलहीन हो सकता है। ओओपी कोड का लाभ उठाने का मतलब यह होगा कि अगली बार जब आप अपना कोड बदलते हैं, तो भी आप घटकों का पुनः उपयोग कर सकते हैं। जैसे-जैसे सॉफ़्टवेयर लगातार बदलता है, इस बार अब अगली बार है। तो आप पहले से ही मौजूदा कोड का पुनः उपयोग करना चाहते हैं। मुझे लगता है कि आपके मौजूदा कोड का एक हिस्सा आउटपुट तर्क है। तो मौजूदा आउटपुट तर्क को उपरोक्त अनुकरणीय Request
और Response
के साथ इंटरफेस करने की आवश्यकता है।
मुझे यकीन है कि आप वेबसाइटों से प्यार करते हैं। आप उन्हें सिर्फ काम करने और महान दिखने के लिए प्यार करते हैं। आपने वर्षों में अपनी साइट बनाई है और यहां तक कि सब कुछ ऐसा नहीं है जैसा आप चाहते हैं, आप इसे छोड़ना नहीं चाहते हैं। तो यह आपके पुन: लिखने के लिए महत्वपूर्ण है कि आप सबकुछ नष्ट नहीं करते हैं लेकिन आप अब से भविष्य में अपने कामकाजी फॉर्म को संरक्षित कर सकते हैं (साथ ही Preserve a Working Application; last point of the list देखें)।
वेबपैस में दृश्य इतना महत्वपूर्ण हिस्सा है। यदि आप दृश्य को खो देते हैं, तो आपकी साइट इसकी पहचान खो देगी।यदि आप इसमें बहुत अधिक परिवर्तन करते हैं, तो आपकी साइट उन उपयोगकर्ताओं को खो देगी जो आज इसका उपयोग करने में सहज हैं।
आप इसे तोड़ने, तो
- आप भी नोटिस करेंगे?
- क्या आप इसे ठीक कर सकते हैं?
दूसरी ओर आप अपने आवेदन कोड (सुविधाएं, कार्यक्षमता) चाहते हैं नहीं होने के लिए कि कसकर यह किसी भी अब करने के लिए बाध्य अपने कोड पुनर्लेखन में एक लाभ है।
.---------. .-------------.
| website | ---> [interface in ] ---> | application |
| user | <--- [interface out] <--- | |
`---------´ `-------------´
के रूप में इस स्कीमा से पता चलता है, आपके आवेदन अधिक जो कुछ बातचीत करने के लिए की तरह लग रहा स्वतंत्र बनाने के लिए (कोई वेबसाइट, (स्मार्टफोन) जीयूआई या हो सकता है: आप अपने आवेदन को फिर से लिखने के लिए चाहते हैं के रूप में, के एक नजर डालें टिकट प्रणाली), आवेदन कोड प्रतिस्थापित करने योग्य होना चाहिए। आप नए एप्लिकेशन कोड में प्रत्येक प्रकार के उपयोगकर्ता-इंटरफ़ेस के लिए उदाहरण के लिए उपयोगकर्ता गेम प्राप्त करने के लिए तर्क को कोड नहीं करना चाहते हैं, लेकिन आपने पुराने एप्लिकेशन कोड में किया था।
User
ऑब्जेक्ट को यहां एक उदाहरण के रूप में लेना। यह कैसे प्रमाणित करता है और कहां संग्रहीत किया जाता है, ऐसा कुछ नहीं होना चाहिए जो आपके नए एप्लिकेशन कमांड कोड के बारे में चिंतित हैं। अगर आदेश की आवश्यकता है तो यह सिर्फ वहां है। वैश्विक रूप से नहीं, लेकिन विशेष रूप से यदि आदेश इसके लिए पूछता है।
जहां पंजीकरण और खोए गए पासवर्ड प्रक्रियाएं आपके मौजूदा एप्लिकेशन का हिस्सा हैं और मौजूद हैं।
अब आपको पुराने और नए कोड को एक साथ लाने की आवश्यकता है।
तो आप शायद HTTP अनुरोधों और HTTP प्रतिक्रिया के लिए एक इंटरफेस से शुरू करेंगे। दृश्य इंटरफ़ेस आउट के साथ आता है। आप उस इंटरफेस के माध्यम से दृश्य के लिए सभी आवश्यक डेटा असाइन/पास करते हैं, आपका आवेदन अब दृश्य को नहीं जानता है। आप अपने नए एप्लिकेशन कोड के भीतर किसी भी सीएसएस, जावास्क्रिप्ट या एचटीएमएल कोड से निपट नहीं सकते हैं। आउटपुट के लिए यह सिर्फ चीनी है। आपके एप्लिकेशन को सादा पाठ में कंसोल/टेलनेट के माध्यम से या रिमोट एक्सएमएलआरपीसी सेवा के रूप में इंटरफेस करना चाहिए, AJAX एंडपॉइंट - जो भी हो।
तो आप शायद अपने व्यू कोड को सामान्यीकृत कर सकते हैं और इसमें चर इंजेक्ट कर सकते हैं। एक दृश्य परत लिखने के लिए एक PHP फ़ाइल सहित सरल हो सकता है। यह उन चर पर चल रहा है जो इसके दायरे में उपलब्ध हैं। यह "सहायक" कार्यों (टेम्पलेट मैक्रोज़) का उपयोग कर सकता है जो इसके दायरे में उपलब्ध हैं। यह का उपयोग मॉडल ऑब्जेक्ट्स का उपयोग कर सकता है। दृश्य के लिए अपनी भाषा लिखना भी संभव है (templating भाषा, एक डोमेन विशिष्ट भाषा (डीएसएल))।
लेकिन यह केवल तभी संभव है जब आप एक इंटरफ़ेस बनाते हैं जो एप्लिकेशन कोड को ऐसा करने की अनुमति देता है।
तो अब आप अपने आवेदन से एचटीएमएल/एचटीएमएल/सीएसएस/जेएस को अपने एडाप्टर में ले जाने के लिए क्या करना चाहते हैं। वह एडाप्टर जेनेरिक कमांड तैयार करने में सक्षम है जिसे इंटरफ़ेस में इंटरफ़ेस के माध्यम से पारित किया जा सकता है।
एप्लिकेशन केवल आदेश निष्पादित करने और इंटरफ़ेस के माध्यम से इसकी प्रतिक्रिया देने का ख्याल रखेगा। तो आपके पास अब दो डोमेन हैं: आपका एप्लिकेशन और वेबसाइट।
आप इन दो नए डोमेन बनाने शुरू कर सकते हैं और फिर अपने विरासत कोड और एक नए कोड के लिए एक इंटरफ़ेस प्रदान कर सकते हैं।
आपके पास एक दूसरे के बगल में "दो" अनुप्रयोग भी हैं। अंत में वे आपके डेटाबेस के साथ एक साथ बंधे हुए हैं (अपने कोड में अदृश्य) जो आपकी साइट का डेटा क्रम में ध्यान रखता है। और यही डेटाबेस के लिए है। अपने कोड से डेटा अलग करें, ताकि आप समय के साथ अपना कोड बदल सकें।
यदि आप फिर से कोड करना चाहते हैं, तो मौजूदा कोड और नए कोड के बीच सीमा बनाएं।
गुड लक! और मुझे उम्मीद है कि यह आपको आपके विशिष्ट मामले के लिए कुछ विकल्प दिखाएगा। यह भी ध्यान रखें कि आप अपने नियंत्रकों को डेटाबेस में बस एक और मुखौटा में नहीं बदलते हैं। शायद आपको लाइटवेट HTTP एब्स्ट्रक्शन और व्यू लेयर का उपयोग करके सबसे अच्छा लाभ मिल गया है (केवल अपनी कंक्रीट सबसे बड़ी समस्या नहीं है) क्योंकि यह हो सकता है कि आपका एप्लिकेशन केवल वेबसाइटों के लिए है।
चूंकि HTTP/PHP में के रूप में:
[Interface In] Plain Text HTTP request
[Application] Free to go
[Interface Out] Plain Text HTTP response
आप आम तौर पर इनपुट को पार्स और उत्पादन के निर्माण के लिए केवल कुछ कार्यक्षमता की जरूरत है।
इसके अतिरिक्त वसा मॉडल का उपयोग न करने का लाभ यह है कि आप अपने डेटा को तेज़ी से और अनुक्रमिक रूप से एक्सेस करते हैं, उदा। यदि आपको आउटपुट को एक बार पास करने की आवश्यकता नहीं है (buffered, एक-ब्लॉक), तो आप आउटपुट को सर्वर पर स्ट्रीम करने के लिए लाभ प्राप्त कर सकते हैं।
आपको यह तय करना चाहिए कि आपके आवेदन के लिए रिफैक्टर के लिए कौन से हिस्से महत्वपूर्ण हैं, ओओपी नहीं या नहीं। प्रक्रियात्मक की तरह, ओओपी को भी अच्छी तरह से किया जाना चाहिए। यदि आप आज प्रक्रियात्मक कोड लिखकर समस्याओं में भाग लेते हैं, तो ओओपी कोड आपकी समस्या का उत्तर नहीं दे सकता है। बेहतर प्रक्रियात्मक कोड लिखने की आवश्यकता यह हो सकती है। बस कह रहा है, किसी एप्लिकेशन को दोबारा उपयोग करना आसान नहीं है और आपको पहले वास्तविक समस्या की पहचान करनी चाहिए।
- यदि आप इसे तोड़ते हैं, तो क्या आप भी ध्यान देंगे?
- यदि आप इसे तोड़ते हैं, तो क्या आप इसे ठीक कर सकते हैं?
महत्वपूर्ण हिस्सा यह है कि आप ध्यान दे सकते हैं और आपके पास ठीक करने के लिए सब कुछ है।
अपनी वेबसाइट को परीक्षण के तहत प्राप्त करें, ताकि आप कह सकें कि यहां कोड बदलना या वास्तव में अच्छा करना है या नहीं। अगर यह प्रकाश में आता है तो यह किसी भी बदलाव को वापस करने में सक्षम हो सकता है (बेहतर)।
ऐसा करने से आप आसानी से एक नई सुविधा के बारे में निर्णय ले सकते हैं या नहीं। जब तक आपको नई सुविधाओं को पेश करने की आवश्यकता नहीं है, तब तक आप सुविधाओं को लिखने में कुछ भी बदलने की जरूरत नहीं है। और वहां तक, आप नई सुविधाओं के लिए योजना नहीं बना सकते हैं।
तो अपने आवेदन को दोबारा लिखने से पहले दो बार बेहतर सोचें। जैसा लिखा है, यह परियोजना को मार सकता है।
रूप में अच्छी तरह देखें:How to implement MVC style on my PHP/SQL/HTML/CSS code?SO Q&A
मैं कार्यों लेकिन इस उदाहरण वे हटा दिया गया सरल करने के लिए कोडित है। – Dan