2012-04-08 32 views
11

मैंने हमेशा सोचा कि नामस्थान का मुख्य लक्ष्य नाम टकराव और अस्पष्टता को रोकने के लिए है। आपके द्वारा बनाए गए कोड, और आंतरिक पीएचपी वर्गों/कार्य/स्थिरांक या तीसरे पक्ष के वर्गों/कार्य/स्थिरांक के बीचप्रोग्रामिंग भाषाओं में 'उपयोग' या 'उपयोग' का उपयोग

नाम टकराव:

1 समस्या php.net से नामस्थान द्वारा तय #।

हालांकि, अधिकांश भाषाएं "उपयोग" कीवर्ड को किसी अन्य तरीके से उपनाम या अन्य नामस्थान आयात करने के लिए लागू करती हैं। मुझे पता है कि यह कैसे काम करता है, लेकिन मुझे समझ में नहीं आता कि ऐसी कार्यक्षमता का उपयोग क्यों किया जाता है।

किसी 'उपयोग' कीवर्ड का प्रभावी ढंग से नामस्थान के उद्देश्य को हराने का उपयोग नहीं कर रहा है?

namespace core\utils; 

class User { 
    public static function hello(){ 
     return "Hello from core!"; 
    } 
} 
//--------------------------------------------------- 

namespace core2\utils; 

class User { 
    public static function hello(){ 
     return "Hello from core2!"; 
    } 
} 
//--------------------------------------------------- 

namespace core2; 

//causes name collision, we now have two different classes of type 'utils\User' 
use core\utils; //without this line the result is 'Hello from core2' 

class Main { 
    public static function main(){ 
     echo utils\User::hello(); 
    } 
} 

Main::main(); 
//outputs Hello from core! 
?> 

क्या मुझे कुछ याद आ रहा है या 'उपयोग' कीवर्ड का उपयोग वास्तव में आम तौर पर निराश होता है?

किसी भी तरह से, वास्तव में encapsulation बलिदान के लिए वास्तव में एक अच्छा विचार क्या है?

मैं उपयोग का उपयोग करता था, लेकिन अब मुझे यकीन नहीं है कि उपयोग कब किया जाना चाहिए।

संपादित करें: ठीक है मुझे यह सीधे प्राप्त करने दें: यदि मैं संक्षिप्त नाम पाने के लिए 'उपयोग' का उपयोग करता हूं, तो यह वैश्विक नामस्थान में कक्षा घोषित करने से बेहतर कैसे है? नीचे देखें:

namespace core\utils\longname {  
    class User {} //declare our class in some namespace 
} 

//------------------Other File--------------------------- 
namespace { //in another file import our long name ns and use the class 
    use core\utils\longname\User as User; 
    new User(); 
} 

^इस घोषणा के खिलाफ इस तरह नेमस्पेसिंग का लाभ क्या है:

namespace {  
    class User {} //declare our class in global namespace 
} 

//------------------Other File--------------------------- 
namespace { //in another file just use the class 
    new User(); 
} 

वहाँ कोई अंतर बिल्कुल दोनों के बीच है?

+0

"का उपयोग करना" इसका उपयोग किया जाता है क्योंकि यह गधे में दर्द होता है और हर समय सबकुछ स्पेल करने के लिए अच्छी दृश्य समझ के विपरीत होता है। –

+0

यह वास्तव में सच है, लेकिन ऐसा लगता है जैसे मैं नामस्थान को चोट पहुंचा रहा हूं। अस्पष्टता और पठनीयता के बीच सीमा कहां है? – Webmut

+0

उपनाम अनावश्यक होना चाहिए।लेकिन वर्तमान में नामस्थानों का उप-उत्पाद उनके इच्छित उद्देश्य के लिए उपयोग नहीं किया जा रहा है, बल्कि पहचानकर्ता टैक्सोनोमी बनाने के लिए। – mario

उत्तर

3

+1 बहुत दिलचस्प सवाल

मेरे राय

कीवर्ड use के रूप में इतने सारे उपयोग करता है और कार्यक्षमता की कल्पना इस

use core\utils\sms\gateway\clickatell\http\SmsSender as SmsCSender 
use core\utils\sms\gateway\fastSMS\ftp\Smssender as SmsFSender 

अब की तुलना करें

if(!SmsCSender::send($sms)) 
{ 
    SmsFSender::send($sms); 
} 

करने के लिए +०१२३५१६४१०६

if(!core\utils\sms\gateway\clickatell\http\SmsSender::send($sms)) 
{ 
    core\utils\sms\gateway\fastSMS\ftp\SmsSender::send($sms); 
} 

निष्कर्ष

namespace और use बिना मैं मैं तो क्या लगता है इस तरह के एक स्वच्छ पठनीय कोड प्राप्त करने के लिए सक्षम नहीं होगा है कि namespace and use complement each other बल्कि 'उपयोग' एक नाम स्थान के प्रयोजन को हराने से

+0

हां, 'उपयोग ... के रूप में' प्रतिमान केवल 'उपयोग/उपयोग/आयात/et al' के साथ योजनाओं की तुलना में काफी बेहतर है। दुर्भाग्यवश यह सभी भाषाओं में उपलब्ध नहीं है, और जब कभी-कभी ओडबॉल प्रतिबंध (या कम से कम पुरातन "सम्मेलन" होते हैं जो इसे आदर्श से कम प्रस्तुत करते हैं)। –

+0

बेशक शायद यही कारण है कि अधिकांश लोग 'उपयोग' का उपयोग करते हैं। हालांकि, क्या यह वैश्विक नामस्थान में कक्षा घोषित करने के समान ही नहीं है? इस तरह आपको 'उपयोग' के साथ गड़बड़ नहीं करना है, _and_ आपके पास क्लीन कोड है। अंत में जब आप 'उपयोग' के साथ नामस्थानों को विलय करते हैं तो वैश्विक एनएस पर आपको क्या फायदे मिलते हैं? – Webmut

+0

वैश्विक 'ns' के बिना यह उदाहरण संभव नहीं होगा .. वैश्विक' ns' वह तरीका है जो 'उपयोग' पर कार्य कर रहा है – Baba

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