2012-04-08 40 views
11

Tôi luôn nghĩ mục tiêu chính của không gian tên là ngăn ngừa va chạm tên và sự mơ hồ.Cách sử dụng 'sử dụng' hoặc 'sử dụng' bằng ngôn ngữ lập trình

# 1 vấn đề cố định bởi không gian tên từ php.net:

Tên va chạm giữa mã bạn tạo ra, và nội bộ PHP lớp/chức năng/hằng số hoặc của bên thứ ba lớp/chức năng/hằng số.

Tuy nhiên, hầu hết các ngôn ngữ đều triển khai từ khóa "sử dụng" theo cách nào đó để đặt bí danh hoặc nhập không gian tên khác vào một từ khóa hiện tại. Tôi biết nó hoạt động như thế nào, nhưng tôi không hiểu tại sao chức năng này lại được sử dụng.

Không sử dụng từ khóa 'sử dụng' có hiệu quả đánh bại mục đích của không gian tên?

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

Tôi đang thiếu điều gì đó hoặc sử dụng từ khóa 'sử dụng' thực sự không được khuyến khích?

Dù bằng cách nào, trong hoàn cảnh nào thực sự là một ý tưởng tốt để hy sinh việc đóng gói?

Tôi đã từng sử dụng, nhưng bây giờ tôi không chắc chắn khi sử dụng nên được sử dụng.

Chỉnh sửa: Được rồi, hãy để tôi nói thẳng: Nếu tôi sử dụng 'sử dụng' để lấy tên ngắn, làm thế nào tốt hơn là chỉ khai báo lớp trong không gian tên chung? Xem dưới đây:

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(); 
} 

^lợi thế của không gian tên như thế chống lại tuyên bố này là gì:

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

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

Có sự khác biệt nào giữa hai?

+0

"Sử dụng" được sử dụng bởi vì nó là cả một nỗi đau trong ass và trái với sự hiểu biết trực quan tốt để có để đánh vần tất cả mọi thứ tất cả các thời gian. –

+0

Điều đó thực sự đúng, nhưng có vẻ như tôi đang làm tổn thương không gian tên. Ranh giới giữa sự mơ hồ và khả năng đọc ở đâu? – Webmut

+0

Bí danh phải là dự phòng.Nhưng hiện tại là một sản phẩm phụ của không gian tên không được sử dụng cho mục đích dự định của chúng, mà là để tạo ra phân loại định danh. – mario

Trả lời

3

1 Rất Thú vị câu hỏi

Ý kiến ​​của tôi

Từ khóa use như rất nhiều công dụng và chức năng tưởng tượng này

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

Bây giờ so sánh

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); 
} 

Kết luận

Without namespaceuse tôi sẽ không thể đạt được một mã số có thể đọc được sạch sẽ như vậy nên những gì tôi nghĩ là namespace and use complement each other chứ không phải là 'sử dụng' đánh bại mục đích của một namespace

+0

Có, mô hình 'use ... as' tốt hơn nhiều so với các lược đồ chỉ với' use/using/import/et al'. Thật không may nó không có sẵn trong tất cả các ngôn ngữ, và khi nó có đôi khi hạn chế kỳ quặc (hoặc ít nhất là "quy ước" cổ xưa mà làm cho nó ít hơn lý tưởng). –

+0

Tất nhiên đây có lẽ là lý do hầu hết mọi người sử dụng 'sử dụng'. Tuy nhiên, nó không phải là khá nhiều giống như chỉ tuyên bố các lớp học trong không gian tên toàn cầu sau đó? Bằng cách đó bạn không cần phải gây rối với 'sử dụng', _and_ bạn có mã sạch. Những lợi thế nào bạn tiếp tục để có được trên toàn cầu ns khi cuối cùng bạn chỉ cần kết hợp các không gian tên anyway với 'sử dụng'? – Webmut

+0

mà không có 'ns' toàn cục, ví dụ đó sẽ không thể thực hiện được .. toàn bộ' ns' là cái xác định đường dẫn mà 'use' đang hoạt động – Baba

Các vấn đề liên quan