2012-04-08 3 views
11

Я всегда считал, что главная цель пространства имен заключается в предотвращении столкновения имен и двусмысленности.Использование «использования» или «использования» в языках программирования

# 1 проблема фиксируется пространствами имен из php.net:

столкновения Имя между кодом вы создаете, и внутренний PHP классы/функции/константами или третьей стороной классов/функций/констант.

Однако большинство языков реализует ключевое слово «use» в некотором роде для псевдонима или импортирует другое пространство имен в текущее. Я знаю, как это работает, но я не понимаю, почему такая функциональность когда-либо используется.

Не использует ключевое слово 'use' эффективно, чтобы победить цель пространства имен?

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! 
?> 

Я что-то упустил или использует слова «использовать», по-настоящему, в целом, обескуражен?

В любом случае, при каких обстоятельствах это действительно хорошая идея пожертвовать инкапсуляцией?

Я использовал для использования, но теперь я не уверен, когда нужно использовать.

Редактировать: Хорошо, позвольте мне понять это: если я использую 'use' для получения короткого имени, как это лучше, чем просто объявление класса в глобальном пространстве имен? Смотрите ниже:

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

Да, парадигма 'use ... as' намного лучше, чем схемы с использованием' use/use/import/et al'. К сожалению, он недоступен на всех языках, и когда есть какие-то необычные ограничения (или, по крайней мере, архаичные «условности», которые делают его менее идеальным). –

+0

Конечно, это, вероятно, причина, по которой большинство людей используют «использование». Однако, не так ли это, как просто объявление класса в глобальном пространстве имен? Таким образом, вам не нужно возиться с 'use', _and_ у вас есть чистый код. Какие преимущества вы продолжаете преодолевать глобальные ns, когда, в конце концов, вы просто объедините пространства имен так или иначе с 'use'? – Webmut

+0

без глобального 'ns' этот экземпляр не будет возможен. Global' ns' - это то, что определяет путь, который 'use' действует – Baba

Смежные вопросы