Ưu điểm của không gian / gói


14

Một số ngôn ngữ lập trình (ví dụ Java và C ++) có các tính năng ngôn ngữ được gọi là "gói" hoặc "không gian tên". Làm thế nào hữu ích là có không gian tên? Có thể đánh dấu các chức năng và các lớp thuộc về một số thư viện cụ thể mà không sử dụng tính năng ngôn ngữ như vậy, giống như SDL (ví dụ SDL_BlitSurface()). Là không gian tên không đủ hữu ích để có giá trị? Chúng có hữu ích trong các thư viện nhưng không phải trong các ứng dụng? Chúng có hữu ích ở mọi nơi ngoại trừ trong các dự án nhỏ? Suy nghĩ?

Câu trả lời:


16

Không phải tiền tố tên giống như không gian tên , ngoại trừ việc nó được thực hiện theo cách ít hữu ích hơn và khó đọc / phân tích hơn? Không phải câu hỏi tự trả lời sao?


Chỉ đặt một tiền tố ở đầu tên định danh không giống như sử dụng một tính năng ngôn ngữ như không gian tên. Chẳng hạn, trong C ++, bạn có thể nói rằng bạn là usingmột không gian tên cụ thể và sau đó không phải đặt tiền tố ở đầu các định danh trong không gian tên đó.
compman

2
@ user9521 - đó là quan điểm của tôi ...
Nicole

+1 Ưu điểm lớn của không gian tên là bạn có thể bỏ qua / rút ngắn tiền tố khi không cần thiết - trong không gian tên nơi điều cụ thể được giới thiệu được xác định, bởi using, bởi import xxxxxxxxx as yyy, v.v.

1
Vì hầu hết các lập trình viên đều lười biếng, bạn muốn khai báo using SDL;hay phải gõ ra SDL_*khắp nơi?
Berin Loritsch

2
+1, nhưng tôi nghĩ bạn thực sự có nghĩa là "ít hữu ích hơn, khó đọc hơn và không được xác minh bởi trình biên dịch."
Larry Coleman

5

Hầu hết (tất cả?) Ngôn ngữ có không gian tên có xu hướng hướng đối tượng. Nhiều lần một tên người có thể đọc được cho một loại là phù hợp, mặc dù có nhiều triển khai không tương thích. (điều này đưa ra các vấn đề khác về tái sử dụng hướng đối tượng, nhưng đó không phải là câu hỏi này là gì). Chẳng hạn, trong Java, bạn có Timer được sử dụng cho các tác vụ UI nền và Timer được sử dụng cho các tác vụ nền (không gắn với AWT / Swing). Không gian tên cho phép bạn có các đối tượng cùng tên này sống trong các API phụ khác nhau.

Lý do mà các không gian tên ra đời phải thực hiện với nhiệm vụ không hợp lý là dự đoán những gì các nhà phát triển khác sẽ đặt tên cho các đối tượng của họ. C ++ đã giới thiệu khái niệm này (hoặc ít nhất là ngôn ngữ đầu tiên tôi tiếp xúc với khái niệm này) và nó rất hữu ích mặc dù không có hướng dẫn về thực hành sử dụng tốt nhất. Java điều chỉnh khái niệm và thêm một số "thực tiễn tốt nhất" bao gồm tên công ty của bạn vào không gian tên. Bằng cách đó bạn chỉ phải lo lắng về công ty của riêng bạn.

Tiền tố có thể trở nên khá lộn xộn. Khi nào bạn áp dụng nó? Khi nào bạn không áp dụng nó? Các cấu trúc / lớp / phương thức toàn cầu có được tiền tố không? Còn phương pháp thì sao? Những gì về tính chất trong cấu trúc. Tôi đã thấy tất cả những điều này trong mã, mặc dù rất may không phải tất cả cùng một lúc. Không gian tên cung cấp một số dự đoán cho tất cả các câu hỏi này và làm cho nó trở thành một tính năng ngôn ngữ chứ không phải là một "thực tiễn tốt nhất" cá nhân.


Haskell có không gian tên (mô-đun) và không hướng đối tượng.
Jeremy Heiler

3

Tôi nghĩ rằng không gian tên là một ý tưởng tuyệt vời. Chúng giúp ngăn chặn xung đột đặt tên bằng cách giới hạn phạm vi của tên. Trong gói Java, quy ước đặt tên gói đề nghị dựa trên tên miền, mà nên là duy nhất, mà giúp đỡ ngăn chặn xung đột đặt tên trên thư viện tùy chỉnh. Nhìn chung, họ làm cho việc đặt tên độc đáo hơn một chút theo nghĩa rộng, trong khi vẫn cho phép lập trình viên tự do hơn một chút trong việc đặt tên cho tác phẩm của mình mà không phải tuân theo một số quy ước đặt tên tối nghĩa.


1
Tuy nhiên, trong trường hợp quy ước cụ thể của Java, không phải ai cũng có trang web. Ngoài ra, nếu bạn từng chuyển chương trình của mình từ trang web này sang trang web khác (ví dụ Sourceforge sang Github), sẽ rất bất tiện khi thay đổi gói nếu những thứ khác phụ thuộc vào mã của bạn.
compman

1
Quy ước của Java áp dụng cho tổ chức của bạn, không phải nơi lưu trữ. Bạn có thể chỉ cần tuyên bố cho mình một tổ chức và được thực hiện với nó. Ngoài ra còn có vấn đề về URL cho phép các ký tự không thể được sử dụng trong tên gói. Nhưng chúng tôi sẽ không đến đó. Vì vậy, đối với bạn, chỉ cần sử dụng "me.user9521" làm tên gói của bạn và bạn đã được đặt.
Berin Loritsch

1
Quy ước không phải là về tên web, mà là về tên miền. Bạn có thể có một tên miền mà không cần một trang web.
David Thornley

1

Không gian tên / Mô-đun / Gói rất hữu ích để tránh xung đột tên. Tiền tố tên cũng vậy, nhưng không gian tên có thêm sự tiện lợi khi có thể nhập các ký hiệu vào không gian tên hiện tại để bạn không phải bận tâm với toàn bộ Namespace :: *.

Một số ngôn ngữ (như Python) mở rộng khả năng này bằng cách cho phép bạn chỉ nhập các ký hiệu cụ thể vào mô-đun hiện tại hoặc nhập các ký hiệu dưới dạng tên khác. Điều này hữu ích nếu bạn chỉ quan tâm đến một vài lớp / hàm / hằng hoặc nếu một số biểu tượng xung đột với các biểu tượng trong không gian tên của bạn nhưng một số thì không.

Một số ngôn ngữ (như Ruby) cho phép bạn đưa các phương thức của mô-đun vào lớp của mình. Điều này rất hữu ích cho đa hình và thuốc generic. Ví dụ, nếu bạn có một vài lớp có các trình vòng lặp hoạt động theo cùng một cách, bạn có thể trộn các phương thức vào tất cả các lớp này từ một mô-đun riêng biệt cung cấp các phương thức để sắp xếp và lọc dữ liệu trong đối tượng. Điều này cho phép các has amối quan hệ cũng như các mối quan hệ is a(thừa kế).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.