2010-06-03 11 views
5

मुझे कुछ सामान्य ओओपी & जावा दृष्टिकोण के साथ कठिनाइयों का सामना करना पड़ रहा है। कक्षाओं/वस्तुओं को एक-दूसरे के साथ संवाद करने के कई तरीके हैं।ओओपी दृष्टिकोण क्या होगा? (या आपका दृष्टिकोण?)

  • मैं एक कार्रवाई एक्स प्रदर्शन करने के लिए
  • वस्तु एक पी, क्यू और आर की जरूरत है इस कार्रवाई एक्स

तो एक वस्तु जाएगा पुनः प्राप्त पी प्रदर्शन करने के लिए वस्तु की जरूरत है: एक साधारण उदाहरण देने के लिए , क्यू और आर स्वयं (एक्शन एक्स के भीतर), या इन मानों को एक्शन एक्स के लिए पैरामीटर होना चाहिए?

उत्तर

0

यदि मानों का पुन: उपयोग किया जा सकता है, तो उन्हें पैरामीटर के रूप में (या का एक हिस्सा) पास करें। Otrherwise, उन्हें X.

4

के अंदर स्थानीय चर के रूप में बनाएं, यह सामान्य रूप से उत्तर देने के लिए एक सामान्य प्रश्न है। कुछ स्थितियों में या तो दृष्टिकोण अच्छा हो सकता है। कुछ कारकों:

  • पी, क्यू और आर गुजर मापदंडों एक आसान पुन: उपयोग करने और परीक्षण करता है के रूप में (Dependency Injection देखें)
  • अगर पी, क्यू और आर ए के बाहर कहीं और उपयोग नहीं किया जाता है, वे विधि बनाया जा सकता है स्थानीय
  • अगर पी, क्यू और आर भी एक के अन्य तरीकों में किया जाता है, वे बनाया जा सकता है सदस्यों
0

दर्रा पी, क्यू और आर के लिए एक किसी तरह से, या तो एक के गुणों के रूप में यह निर्धारित करके या एक्स को पास करके (यदि पीक्यूआर एक्स-विशिष्ट हैं या यदि उन्हें अन्य स्थितियों में ए द्वारा भी आवश्यकता हो सकती है) के आधार पर।

0

उत्तर यह है कि यह निर्भर करता है।

पी, क्यू और आर ए का एक उदाहरण के लिए एक मजबूत, सार्थक लिंक है तो आप उन्हें कक्षा ए के सदस्यों के रूप में जोड़ना चाहें

public class A { 

    private P p; 
    private Q q; 
    private R r; 

    public A(P p, Q q, R r) { 
    this.p = p; 
    this.q = q; 
    this.r = r; 
    } 

    public void x() { 
    p.doSomething(); 
    q.doSomething(); 
    r.doSomething(); 
    } 

} 

पी, क्यू और आर नहीं हैं, और बस "कुछ मान" है कि मदद कार्रवाई एक्स यह कार्य कर रहे हैं, तो आप के रूप में मानकों

public class A { 

    public void x(P p, Q q, R r) { 
    p.doSomething(); 
    q.doSomething(); 
    r.doSomething(); 
    } 

} 

दूसरा संस्करण किसी भी राज्य को प्रबंधित नहीं करता तो यह परिभाषा धागा सुरक्षित कर रहा है उन्हें प्रयोग करना चाह सकते हैं

0

दृष्टिकोण 1

class A{ 
    ctor(P, Q, R) 
    { 
    } 
    void X() 
    { 
    P.SomeMethod(); 
    Q.SomeMethod(); 
    R.SomeMethod(); 
    } 
} 

दृष्टिकोण 2

class A{ 
    void X(P, Q, R) 
    { 
    P.SomeMethod(); 
    Q.SomeMethod(); 
    R.SomeMethod(); 
    } 
} 
0

वर्ग डिजाइन सॉफ्टवेयर डिजाइन का एक सबसेट है: तो यह सब निर्भर करता है।

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

public interface FuncX { 

    public void actionX(FuncP p, FuncQ q, FuncR r); 

} 

और कक्षाओं को इस इंटरफ़ेस को लागू करने दें। यदि दो वर्ग छोटे हैं लेकिन संबंधित हैं, तो मैंने उन्हें दोनों इंटरफेस को लागू करने दिया।

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

public class MyFuncX implements FuncX, FuncP { 

    public void actionX(FuncP p, FuncQ q, FuncR r) { 
     ... 
    } 

    public void actionP(...) { 
     ... 
    } 

} 

// the caller: 
FuncX x = new MyFuncX(); // dependency 
FuncQ q = ...; 
FuncR r = ...; 

x.actionX(x, q, r); 
0

यह मुझे Composite Pattern के लिए काम की तरह लगता है।

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

graphic1.add(ellipse1); 
graphic1.add(ellipse2); 
graphic1.add(ellipse3); 

graphic.print(); 

और graphic.print(); अंडाकार वस्तुओं में से प्रत्येक के अंदर print विधि कॉल करेगा।

0

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

0

इसे सबसे सुविधाजनक तरीका बनाना संभव है?

आप 18+ तर्क स्वीकार करने के लिए एक फ़ंक्शन/विधि लिख सकते हैं, लेकिन यह वास्तव में सुविधाजनक नहीं है।

यदि विधि ए क्रिया करने जा रही है तो हमेशा एक ही तर्क प्राप्त होता है (और आपको पूरा यकीन है कि यह नहीं बदलेगा), मुझे नहीं लगता कि आपको तर्क द्वारा पारित करने की आवश्यकता क्यों है।

उस ने कहा, मैं आम तौर पर मानकों से चिपकता नहीं हूं और यह नहीं जानता कि अन्य ओओपी कट्टरपंथी (हाइप गुरु) इस स्थिति में क्या करेंगे।

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