2008-10-19 12 views
6

मुझे व्युत्पन्न कक्षाएं कब जारी रखनी चाहिए, और मुझे अपने कोड में केवल सशर्त कब जोड़ना चाहिए? एक मिसाइलओओपी: व्युत्पन्न कक्षाएं कब और कब सशर्त के साथ सुविधाओं को लागू करने के लिए?

class Object; 
class Projectile : public Object; 

class Missile : public Projectile; 
class MissileGuided : public Missile; 

के लिए जैसे या मैं मिसाइल के कोड में है कि पिछले एक को लागू करना चाहिए?

void Missile::Update() 
{ 
    if(homing && ObjectExists(Target)) 
     TurnTowards(Target.Pos) 

    Pos += Motion; 
} 

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

हालांकि कुछ मामलों में नियमित प्रोजेक्टाइल मिसाइलों के गुणों को साझा करने के लिए कहा जा सकता है (उदाहरण के लिए विनाशकारी हो सकता है, बड़े प्रोजेक्ट रडार पर दिखाए जा सकते हैं, आदि)

और फिर मैं कह सकता हूं कि प्रोजेक्टाइल जहाजों के साथ गुण साझा करते हैं (दोनों कदम, टकराव पर ey नुकसान नहीं, रडार पर दिखाई दे सकते हैं, destroyable हो सकता है ...)

और फिर सब कुछ वापस 3 वर्गों की तरह के रूप में समाप्त होता है:

class Entity; 
class Object : public Entity; 
class Effect : public Entity; 

कहाँ एक अच्छा स्थान है व्युत्पन्न बनाने के बीच एक रेखा खींचना कक्षाएं, और झंडे या कुछ के साथ विधि में सुविधाओं को लागू करना?

उत्तर

9

आप दोनों दृष्टिकोणों के बजाय रणनीति पैटर्न का उपयोग करने और बाहरी कक्षाओं के भीतर व्यवहार को समाहित करने पर विचार करना चाह सकते हैं। फिर व्यवहार को मिसाइल क्लास में इंजेक्शन दिया जा सकता है ताकि इसे मार्गदर्शित मिस्मिले या स्पेसरोकेट या जो कुछ भी आपको चाहिए।

इस तरह मिसाइल वर्ग के भीतर तर्क की अत्यधिक शाखाओं से बचा जा सकता है और आपको गहरी विरासत से जुड़े तार्किक जटिलताओं में जाने की आवश्यकता नहीं होगी। http://en.wikipedia.org/wiki/Strategy_pattern

interface INavigable { 
    Course calcCourse (Position current, Destination dest); 
} 


Class GeoStationaryRocketCPU implements INavigable { 
    Course calcCourse (Position current, Destination dest) { 
    return dest.getShortestRouteTo (current).getCourse(); 
    }; 

} 

Class GuidedMissileCPU implements INavigable { 
    Course calcCourse (Position current, Destination dest) { 
     return dest.getLowestAltRouteTo (current).getCourse(); 
    }; 

} 



class Missile { 
    INavigable CPU; 

    void setCPU (INavigable CPU) { 
    this.CPU = CPU; 
    } 

    void fly() 
    { 

    ... 
    course = this.CPU.calcCourse (pos, dest); 
    ... 
    } 

} 

एक और सहयोगी ने सुझाव दिया रूप में, आप के रूप में अच्छी डेकोरेटर पैटर्न का उपयोग कर विचार कर सकते हैं:

विकिपीडिया कई भाषाओं में पैटर्न उपयोग के नमूने का संग्रह है। बस डिजाइन मुद्दों अगर आपको लगता है कि मार्ग तय लग रही थी कि अपने संदर्भ में महत्वपूर्ण हो सकता है की जोड़ी को उजागर करना:

  1. वस्तु के व्यवहार का सिर्फ एक निश्चित पहलू बदलने के लिए आप पूरी क्लास को सजाने के लिए आवश्यकता होगी।
  2. यदि सजाए गए वर्ग का सार्वजनिक इंटरफ़ेस (मिसाइल कहें) कभी भी बदला जा सकता है (यहां तक ​​कि कुछ कार्यक्षमता भी इसके नेविगेशन पहलू से संबंधित नहीं है) तो आपको सभी सजावटी कक्षाओं (यानी मार्गदर्शित मिसाइल, रॉकेट, आतिशबाजी रॉकेट इत्यादि) को बदलना होगा। इंटरफ़ेस पर पास करें।
  3. सजावट में आप उम्मीद करेंगे कि एक सजावटी कार्यक्षमता जोड़ देगा, इसे प्रतिस्थापित नहीं करेगा। यह अपने कार्यों का आह्वान करके बेस क्लास विधि को कॉल करके काम करता है। इसके ऊपर के परिदृश्य में एक GuidedMissileCPU हो सकता है जो एक GeoStationaryRocketCPU को सजाने में सक्षम होता है - स्पष्ट रूप से यह वही नहीं है जो आप चाहते हैं। आप चाहते हैं कि यह एक अलग नेविगेशन रणनीति का चयन करे, न कि एक दूसरे के ऊपर परत नेविगेशन रणनीतियों।

फिर भी जब मिसाइल सजावट की एक रेडीमेड अपरिवर्तनीय कार्यान्वयन के साथ प्रदान की हो सकता है करने के लिए यह "अनलॉक" कुंजी और रणनीति पैटर्न को लागू करने के लिए आवश्यक व्यवहार के सभी प्रकार के साथ मिसाइल प्रदान करने के लिए।

1

विरासत आपके द्वारा उपयोग की जाने वाली भाषा/तकनीक पर निर्भर करता है, उदाहरण के लिए सी ++ में आप कई कक्षाओं से कक्षा प्राप्त कर सकते हैं लेकिन ऐसा निर्माण जावा, सी #, पीएचपी आदि में उपलब्ध नहीं है बल्कि इसके बजाय आपके पास अमूर्त कक्षाएं और इंटरफेस हैं, जो मैं कहने की कोशिश कर रहा हूं वह यह है कि यदि आपके पास कक्षा है उदाहरण के लिए आपकी कंपनी का सॉफ़्टवेयर कई डेटाबेस प्रबंधन प्रणालियों का उपयोग करेगा और यह आपके लिए इस तरह के निर्माण के लिए कक्षाओं के स्वतंत्र सेट को डिज़ाइन करने के लिए तैयार करेगा, और आप इसे एक सार का उपयोग करके कर सकते हैं वर्ग और उदाहरण के लिए अपने सेट करने के लिए बहुरूपता लागू:

public abstract class Database 
    { 
     public virtual void Connect(); 
     public virtual int GetNumberOfTables(); 

    } 

और फिर आप विशिष्ट SQL सर्वर या Oracle कार्यान्वयन

के लिए एक वर्ग प्राप्त कर सकते हैं
public class SQLServerDatabase : Database 
    { 
      public override void Connect() 
      { 
        // SQL Implementation 
      } 

      public override int GetNumberOfTables() 
      { 
       // SQL Implementation 
      } 

    } 


    public class OracleDatabase : Database 
    { 
      public override void Connect() 
      { 
        // Oracle Implementation 
      } 

      public override int GetNumberOfTables() 
      { 
       // Oracle Implementation 
      } 
    } 

इस तरह के निर्माण में आप विरासत का उपयोग कर सकते हैं, लेकिन क्लास तर्क जटिलता से बचने के रूप में मैंने उपरोक्त आपके उदाहरण में देखा था।

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

1

मुझे लगता है कि इस मामले आप डेकोरेटर पैटर्न चाहिए में। आपके द्वारा जोड़ी गई नई कार्यक्षमता मूल मिसाइल वर्ग पर सजावट है। उदाहरण के लिए आप एक नई सजाए गए मिसाइल वर्ग को बना सकते हैं जिसे निर्देशित किया जा सकता है (मार्गदर्शित मिस्मिइल) और यह पानी के नीचे (अंडरवाटर मिसाइल) आसानी से मिसाइल वर्ग को सजाने जा सकता है। अच्छा यह है कि सजावटी पैटर्न रनटाइम पर काम करता है और आपको स्थिर वर्ग के साथ उन सभी वर्गों को बनाने की आवश्यकता नहीं है लेकिन आप रनटाइम पर आवश्यक व्यवहार लिख सकते हैं। http://en.wikipedia.org/wiki/Decorator_pattern http://www.dofactory.com/Patterns/PatternDecorator.aspx

0

बस अपने आप से पूछना है, यह कैसे आसान होगा:

  1. पढ़ने और कोड (छोटी परियोजना हिस्सा है और पूरी परियोजना)
  2. परिवर्तन को समझने यहाँ एक नज़र भविष्य में कोड (भविष्य की जरूरतों की भविष्यवाणी करते समय बहुत सावधान रहें, आम तौर पर बेहतर है कि "कोड" परिवर्तनों के लिए अपने कोड को अनुकूलित न करें)

इसके अलावा कुछ दुर्लभ मामले भी हैं जब कक्षा पदानुक्रम प्रदर्शन को गंभीरता से प्रभावित कर सकता है।

तो व्युत्पन्न वर्ग जब यह उपरोक्त मानदंडों के लिए बेहतर है बनाते हैं।

संबंधित मुद्दे