2010-05-18 13 views
6

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

मैंने श्रेणियों के बारे में सोचा, लेकिन कोड स्वतंत्र नहीं है (उदाहरण के लिए इसे कई बार देखने के लिए जरूरी है, उदाहरण के लिए) और मुझे लगता है कि मैं संकलक से लड़ने में काफी समय व्यतीत करता हूं। मैंने विरासत का उपयोग करके परतों में कार्यक्षमता जोड़ने के बारे में भी सोचा, लेकिन यह हैक की तरह लगता है।

+0

मैं कोको से परिचित नहीं हूं, लेकिन मेरे पास एमवीसी सेटअप का उपयोग करके PHP में एक ही समस्या है, इसलिए मुझे लगता है कि यह विभिन्न भाषाओं पर भी लागू होता है। मैं विभिन्न हिस्सों के लिए उप-नियंत्रकों के बारे में सोच रहा हूं, लेकिन इससे केवल पूरे जटिल हो जाएंगे। और जब आप कुछ बड़ा लिख ​​रहे हों, तब तक आप मूल रूप से ड्रिलिंग को तब तक रख सकते हैं जब तक कि आप कुछ बड़ा लिख ​​रहे हों, और यह केवल बनाए रखना मुश्किल हो जाता है। यह देखने के लिए उत्सुक है कि कौन से समाधान आते हैं :) – Alec

उत्तर

4

मुद्दा आकार नहीं है, लेकिन जिम्मेदारी है। क्या आपका नियंत्रक एक से अधिक टोपी पहन रहा है? यदि ऐसा है, तो इसे एकाधिक, एक-नौकरी-प्रति-वर्ग नियंत्रकों में उड़ाएं।

श्रेणियाँ आकार के साथ मदद करते हैं, लेकिन ज़िम्मेदारी नहीं। यदि आप अभी भी एक (समेकित) कक्षा में कई चीजें कर रहे हैं, तो आपको अभी भी एक समस्या है; उन्हें अलग फाइलों में ले जाने से इसे हल नहीं किया गया।

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

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

यदि आपका नियंत्रक एक से अधिक टोपी पहन रहा है, तो इसे कई कक्षाओं में उड़ाएं।

मैं मार्टिन फाउलर की पुस्तक "रिफैक्टरिंग" की सलाह देता हूं। अपने कोड को रिफैक्टर करना इसे साफ कर रहा है, और बहुत बड़ी कक्षाओं (और विधियों और कार्यों) को उड़ाना इस तरह के सफाई का सबसेट है।

बेशक, एक से अधिक कक्षाओं को एक बार संचार के प्रतिस्थापन की आवश्यकता होती थी जो पहले कक्षा के भीतर आंतरिक थी।

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

+0

ब्लॉक ने मेरे जीवन को और अधिक आसान बना दिया, क्योंकि मैं पॉप-ओवर और एक्शन शीट्स द्वारा आवश्यक प्रतिनिधिमंडल विधियों को हटा सकता हूं (उदाहरण के लिए http://github.com/zoul/Lambda- चेतावनी)। आईपैड पर ब्लॉक आने के लिए इंतजार नहीं कर सकता, मैंने नहीं कहा होगा कि वे इतना अंतर करते हैं। – zoul

3

श्रेणियाँ जाने का रास्ता है। चाल (आपके "उस स्वतंत्र नहीं" सामान के लिए) आपके मुख्य नियंत्रक में श्रेणी विधियों को घोषित करना है। एच फ़ाइल (एक अलग नियंत्रक + श्रेणी.h फ़ाइल नहीं, कोई भी नहीं होगा) फिर उन्हें अपने नियंत्रक + श्रेणी में लागू करें। एम फाइल इस तरह:

//****************** 
// MyController.h 
//****************** 
#import <Cocoa/Cocoa.h> 

@interface MyContoller : NSObject 
{ 
    NSWindow *window; 

    // stuff to implement in the category 
    NSComboBox *someCombo; 
    NSButton  *someButton; 
} 

@property IBOutlet NSWindow *window; 

@property IBOutlet NSComboBox *someCombo; 
@property IBOutlet NSButton *someButton; 

@end 

@interface MyController (MyCategory) 

- (IBAction)someComboSelected:(id)sender; 
- (IBAction)someButtonPressed:(id)sender; 

@end 

//************************** 
// MyController+MyCategory.m 
//************************** 
#import <Cocoa/Cocoa.h> 
#import "MyController.h" 

@implementation MyContoller (MyCategory) 

- (IBAction)someComboSelected:(id)sender 
{ 
    .... 
} 

- (IBAction)someButtonPressed:(id)sender 
{ 
    .... 
} 

जाहिर है, मैं "MyController.m", जहां "@synthesize" सामान रख दिया और जो कुछ भी के लिए आवश्यक है शामिल नहीं किया था मुख्य नियंत्रक/जाग-से-निब/जो कुछ भी। वैसे भी, इसे इस तरह से करने से आपके नियंत्रक विधियों को श्रेणी विधियों और vise-versa तक पहुंच मिलती है, और श्रेणी विधियों के पास सभी गुणों तक पहुंच होती है।

2

नियमित कोको में, NSViewController का उपयोग खिड़की के भीतर "घटकों" को अपने स्वयं के समग्र नियंत्रकों के लिए अनुमति देकर नियंत्रक जटिलता का प्रबंधन करने के लिए किया जा सकता है।

आप UIViewController के साथ कुछ ऐसा करने में सक्षम हो सकते हैं, या आप अपने मॉडल ऑब्जेक्ट्स के व्यवहार को अलग से प्रबंधित करने के लिए अपने व्यू/व्यू कंट्रोलर पदानुक्रम के बाहर "समन्वय नियंत्रक" बनाना चाहते हैं।

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