php जनक निजी तरीके या संरक्षित तरीकों का उपयोग करने के लिए सबसे अच्छा?




मार्शल कला संस्थान patna bihar (8)

मेरे बहुत सारे PHP परियोजनाओं में, मैं उन वर्गों के साथ समाप्त होता है जिनके पास गैर-सार्वजनिक कार्य हैं जो मुझे विस्तारित करने का इरादा नहीं है।

क्या इन्हें संरक्षित, या निजी घोषित करना सबसे अच्छा है?

मैं बहस को दोनों तरीकों से देख सकता हूं - उन्हें निजी बनाना एक बहुत अधिक रूढ़िवादी दृष्टिकोण है, लेकिन यह तर्क दिया जा सकता है कि बाद में अगर मैं विधि को विस्तारित करना चाहता हूं और इसे स्पष्ट करता है कि आधार वर्गों द्वारा कौन से तरीकों को बढ़ाया जाता है।

दूसरी तरफ, किसी भी तरह से असामाजिक निजी का उपयोग कर रहा है, इसमें किसी सैद्धांतिक भविष्य के डेवलपर को अपने कोड को बिना किसी संशोधन के विस्तार से बाधित किया जा सकता है?


यदि आपके द्वारा कार्यान्वित किया गया फ़ंक्शन वर्ग-विशिष्ट है और उस वर्ग के संदर्भ के बाहर उपयोग नहीं किया जाना चाहिए, तो उसे विरासत में लाने की अनुमति न दें। उदाहरण के लिए, अगर हमारे पास पशु पदानुक्रम होता है, और जानवरों में से एक को केवल उनके लिए कुछ अविश्वसनीय रूप से अनूठा था, तो कहते हैं "लेग्स इन सैंड" एक कछुए की तरह यह कछुए के लिए पूरी तरह अनूठा हो सकता है (कछुए, जो कुछ भी हो!) इसलिए किसी अन्य जानवर द्वारा विरासत में नहीं लिया जाना चाहिए। इस संदर्भ में हम कहेंगे कि यह निजी है दूसरी ओर यदि फ़ंक्शन "वॉक ()" है तो यह अद्वितीय नहीं है, इसलिए इसे इनहेरिट करने योग्य होना चाहिए।

यह पहले से बहुत ही अस्पष्ट लगता है क्योंकि ज्यादातर समय के मामलों को विरासत में लेना चाहिए, लेकिन दुर्लभ मामलों में जब उन्हें विरासत में नहीं लिया जाना चाहिए क्योंकि वे उस प्रकार के लिए अद्वितीय हैं


मैं आमतौर पर कुछ बहुत विशिष्ट अवसरों में निजी का उपयोग करता हूं जहां विधि / चर बहुत ही आंतरिक है और किसी भी अन्य उपवर्ग (ऐसा मूल रूप से लगभग कभी भी) द्वारा पढ़ा या नहीं लिखा जाना चाहिए। मन में एकमात्र मामला जहां मैं निजी चर का उपयोग करता हूं उदाहरण के लिए:

final public function init():void
{
    if(!_initialized)
    {
        _init();
        _initialized = true;
    }

}

protected function _init():void
{
    // specific code.
}

अधिकांश अन्य मामलों में तरीकों और चर को कम से कम पठन समारोह के रूप में विरासत के लिए उपयोगी होना चाहिए। क्योंकि ज्यादातर समय जब मैं किसी और के द्वारा बनाई गई कोड का उपयोग करता हूं, और जब यह कोड निजी चीजों को हमेशा से और कई परेशानियों के साथ उपयोग करता है:

  • वांछित व्यवहार पहले से लागू नहीं है या पूरा नहीं है
  • मैं एक विधि का उपयोग नहीं कर सकता क्योंकि यह निजी है
  • मैं इस विधि को नहीं बदल सकता क्योंकि यह निजी है
  • अगर यह संरक्षित है (या यदि मैं इसे संरक्षित रूप में बदलता हूं) तो मैं कोड को फिर से काम नहीं कर सकता (उर्फ अन्य लोगों के निर्देशों के बीच में व्यवहार जोड़ना, क्योंकि इस कोड का भाग निजी विधियों या वेरिएबल्स का उपयोग करता है ...

    = अंत में आप वर्ग के विस्तार की क्षमता प्राप्त करने के लिए संरक्षित करने के लिए लगभग सभी एक्सेसर को बदल देते हैं!

इस प्रकार, अगर आपको लगता है कि इस वर्ग को विस्तारित किया जा सकता है तो केवल विशिष्ट मामले को छोड़कर सभी के लिए संरक्षित प्राथमिकता है (यदि आपको लगता है कि किसी विशेष विधि का उपयोग किया जाना चाहिए, लेकिन अंतिम उपयोग नहीं बदला गया तो)

यदि आपको लगता है कि इस वर्ग को किसी भी मामले में विस्तारित नहीं किया जाना चाहिए: निजी उपयोग करें


यदि आप विरासत के लिए एक वर्ग बनाने का इरादा रखते हैं, तो आपको इसे इस तरह से डिजाइन करना चाहिए, यानी उन विधियों को सुरक्षित बनाते हैं जो कि अन्य डेवलपर्स को आपके इच्छित उद्देश्यों के साथ वर्ग के व्यवहार को बदलने की अनुमति देता है। बस सभी तरीकों को संरक्षित बनाने के लिए एक बहुत अच्छा डिजाइन नहीं है ध्यान रखें कि सभी संरक्षित विधियां सार्वजनिक एपीआई का हिस्सा बनती हैं, इसलिए यदि आप बाद में चीजें बदल दें तो आप अन्य लोगों के कोड को तोड़ देंगे।

सामान्य तौर पर, यदि आप विरासत के लिए डिजाइन नहीं कर रहे हैं, तो आपको इसे प्रतिबंधित करना चाहिए


जैसा कि कहा गया है, यदि आप बाद में एक वर्ग का विस्तार करने जा रहे हैं तो आप इसे तब हमेशा बदल सकते हैं

लेकिन अगर आप अपनी विरासत का उपयोग करने से बच सकते हैं जब भी संभव हो, डिजाइन करते समय अन्य पैटर्न का उपयोग करना बेहतर होता है

असल में क्या करना है विरासत और कार्यक्रम के लिए इंटरफेस पर अनुकूलन के पक्ष में, कार्यान्वयन के लिए नहीं।

यदि आप वर्गों को केवल एक कसकर परिभाषित उद्देश्य देते हैं तो आप उन्हें एक-दूसरे के होने के बजाय ऑब्जेक्ट जमा कर सकते हैं। यदि आप इंटरफ़ेस का उपयोग करते हैं, तो आप के बजाय विरासत में सबसे likley छोटे और प्रभावी इंटरफेस परिभाषित करेंगे तब आप देखेंगे कि विरासत कम हो जाएगी और इसलिए संरक्षित होने की आवश्यकता को कम किया जाएगा।

उदाहरण

interface sound {
 public function makeSound();
}

class bark implements sound{
 public function makeSound() {
   return "Bark!!!";  
 }
}

class mew implements sound{
 public function makeSound() {
   return "Mewmew!!!";  
 }
}

class forLeggedAnimal {
  private $sound;

  public function forLeggedAnimal($sound){
    $this->sound = $sound;
  }

  public function eat(){
    echo $this->sound->makeSound();
  }

}

$cat = new forLeggedAnimal(new mew());
$dog = new forLeggedAnimal(new bark());

मैं यह एक आदर्श उदाहरण से अब तक जानता हूं। लेकिन यह तकनीक को दिखाता है और आप इसे कई मायनों में उपयोग कर सकते हैं। उदाहरण के लिए आप बिल्लियों और कुत्तों के निर्माण के लिए अलग-अलग रचनात्मक पैटर्नों के साथ इसे जोड़ सकते हैं, यह जानना इतना बुद्धिमान नहीं हो सकता है कि कोई बिल्ली छाल या मूस .. लेकिन वैसे भी .. यह आधार वर्ग बनाने और उसके बाद विस्तार करने से अलग है यह एक बिल्ली और एक कुत्ते के साथ, और इसके लिए "ध्वनि" विधि को सार्वजनिक खाने विधि को सुरक्षित या ओवरराइड करना पड़ता है

/ पीटर


निजी रूप से, मुझे लगता है कि जितना संभव हो सके उतना निजी बनाने के लिए मुझे उचित लगता है। मैं सिर्फ प्रत्येक पद्धति को देखता हूं और खुद से पूछता हूं कि अगर मैं एक व्युत्पन्न वर्ग चाहता हूं तो उसे कॉल करने में सक्षम होना चाहिए। सब कुछ संरक्षित पत्तियों को गलत तरीके से बुलाया तरीके होने के लिए दरवाजा खोलने का निर्माण करना।

मुझे लगता है कि यह प्रश्नों के नीचे आता है "जब तक कि विशेष रूप से अनुमति नहीं दी जाती है"

एक अतिरिक्त कारक यह है कि भावी रिलीज में सुरक्षित तरीके से संरक्षित निजी विधि बनाना आसान है। किसी विधि को निजीकरण करने में एक बार संरक्षित होने के बाद यह लगभग असंभव है, जैसा कि आप कभी भी नहीं जानते हैं कि आप जो अन्य कोड अवैध हैं


मुझे लगता है कि आपको केवल तब ही पता होना चाहिए जब आपको इसकी आवश्यकता होती है। इससे परिवर्तनों के प्रभाव आकलन को आसान बना देता है यानी यदि एक विधि निजी है, तो आप जानते हैं कि यदि आप इसे बदलते हैं तो इसका प्रभाव कम होगा।


खैर, निजी खोजशब्द एक उद्देश्य से किया गया था। यदि आप चर को अपने विरासत कक्षाओं को अपनाना नहीं चाहते हैं (या आप चाहते हैं कि लोगों को विरासत में मिली कक्षाओं में नहीं खेलना) तो आप उन्हें सुरक्षित क्यों बनाते हैं?

लोगों को अपने निजी भागों को छूने न दें :)


मैं आम तौर पर private से बचने मेरा तर्क यह है कि यदि आपके पास दो वर्गों के बीच एक विरासत का संबंध है, और निजी सदस्य हैं, तो यह एक बहुत ही मजबूत संकेत है कि निजी भागों को एक अलग वस्तु में फेंक देना चाहिए।





oop