पेशेवर प्रोग्रामर ओओपी के लिए जाने या नहीं जाने पर निर्णय कैसे लेते हैं? यह वास्तव में मेरे लिए मददगार होगा।
मेरे लिए, दो निर्णय बिंदु हैं। पहले, कभी-कभी यह शुरुआत में स्पष्ट होगा। समान प्रकार के बहुत सारे होंगे जो सभी सामान्य तरीकों को साझा करते हैं जो उनके कार्यान्वयन विवरण में व्यापक रूप से भिन्न होते हैं। उदाहरण के लिए, मैं एक वर्कफ़्लो सिस्टम बना रहा था, और मुझे मनमाने कार्यों को लागू करने की क्षमता की आवश्यकता थी। कार्य को चलाने के लिए, मैंने एक आधार वर्ग को लागू किया, जिसे प्रत्येक कार्य एक Execute()
सार पद्धति से विरासत में मिला । इनहेरिट करने वाली कक्षाओं ने कार्यान्वयन की आपूर्ति की, लेकिन वर्कफ़्लो सिस्टम किसी भी प्रकार के कार्य को चलाने के बारे में कुछ भी जाने बिना निष्पादन शुरू कर सकता है।
हालांकि अधिकांश परियोजनाएं स्पष्ट नहीं हैं। दूसरा निर्णय बिंदु तब होता है जब परियोजना का एक सबसेट, तब-तब बयानों या स्विच-केस बयानों की एक बड़ी उलझन में विकसित हो गया है, और विशेष रूप से तब जब उन-तब के बयानों को सही ढंग से चलाने के लिए बहुत सारे सेटअप कोड की आवश्यकता होती है। मुझे लगता है कि मैं जो हासिल करने की कोशिश कर रहा हूं, उसके तर्क को खोना शुरू कर देता हूं और कोड नाजुक लगने लगता है। उस बिंदु पर, यह आमतौर पर एक संकेत है कि यह विशिष्ट कार्यान्वयन के साथ आधार कक्षाओं में कोड को फिर से भरने का समय है।
एक कार्यात्मक शैली के विपरीत ऑब्जेक्ट-ओरिएंटेड शैली पर स्विच करने का एक बड़ा हिस्सा यह है कि तब-तब बयान "रन इस एक्शन" स्टेटमेंट में परिवर्तित हो रहा है। यदि तत्कालीन वक्तव्यों के एक विशाल सेट के बजाय, आप कोड को इसकी कार्रवाई चलाने के लिए कहते हैं। वास्तव में कौन सी कार्रवाई चल रही है यह आपके द्वारा आपूर्ति किए गए कार्यान्वयन पर निर्भर करता है।
उदाहरण के लिए, यहाँ C # -स्टाइल छद्मकोड में कार्यात्मक शैली है:
if ( action == "email" ) {
callEmailFunction(userInfo);
}
else if ( action == "sms" ) {
callSmsFunction(userInfo);
}
else if ( action == "web" ) {
endpoint = "http://127.0.0.1/confirm";
confirmWeb(endpoint, userinfo);
}
...
लेकिन हो सकता है कि आप इसे फिर से लिख सकें:
interface IConfirmable {
void Confirm(UserInfo userinfo);
}
public class ConfirmEmail : IConfirmable {
public void Confirm(UserInfo userinfo) {
// do the appropriate thing to confirm via email
}
}
public class ConfirmSms : IConfirmable {
public void Confirm(UserInfo userinfo) {
// do the appropriate thing to confirm via email
}
}
public class ConfirmWeb : IConfirmable {
// this is a constructor
public ConfirmWeb(string endpoint) {
...
}
public void Confirm(UserInfo userinfo) {
// do the appropriate thing to confirm via web
}
}
और फिर कोड ही:
// An implementation that decides which implementation of the base class to use
// This replaces the if-then statements in the functional programmming.
IConfirmable confirmer = ConfirmerFactory.GetConfirmer();
// get the userinfo however you get it,
// which would be the same way you get it in the functional example.
UserInfo userinfo = ...;
// perform the action.
confirmer.Confirm(userinfo);
अब, अगर इफ-इन के अंदर बहुत कम कोड है, तो यह बिना किसी लाभ के बहुत काम की तरह दिखता है। और जब-अगर-तब में बहुत कम कोड होता है, तो यह सही है: यह कोड के लिए बहुत काम है जो समझना मुश्किल है।
लेकिन ऑब्जेक्ट-ओरिएंटेड शैली वास्तव में चमकती है जब आपके पास केवल एक Confirm()
विधि की तुलना में एक से अधिक कार्रवाई होती है जिसे निष्पादित करने की आवश्यकता होती है। हो सकता है कि आपके पास एक आरंभिक दिनचर्या हो, तीन या अधिक एक्शन विधियाँ, जिन्हें चलाया जा सकता है, और एक Cleanup()
विधि। आधार एल्गोरिथ्म समान है, सिवाय इसके कि यह उचित ऑब्जेक्ट्स में अपनी कॉल करता है जो एक सामान्य बेस क्लास को लागू करते हैं। अब आप ऑब्जेक्ट ओरिएंटेड स्टाइल का वास्तविक लाभ देखना शुरू करते हैं: बेस एल्गोरिदम को पढ़ने की तुलना में बहुत आसान है अगर यह जाँच रहा था कि क्या रास्ते में हर कदम पर स्टेटमेंट्स हैं।