ข้อดีของเนมสเปซ / แพ็คเกจ


14

ภาษาการเขียนโปรแกรมบางภาษา (เช่น Java และ C ++) มีคุณสมบัติภาษาที่เรียกว่า "แพ็คเกจ" หรือ "namespaces" การมีเนมสเปซเป็นประโยชน์จริง ๆ อย่างไร เป็นไปได้ที่จะทำเครื่องหมายฟังก์ชั่นและคลาสว่าเป็นของห้องสมุดบางแห่งโดยไม่ใช้คุณสมบัติภาษาเช่น SDL ทำ (เช่นSDL_BlitSurface()) เนมสเปซไม่มีประโยชน์เพียงพอที่จะคุ้มค่าหรือไม่? มันมีประโยชน์ในห้องสมุด แต่ไม่ใช่ในแอพพลิเคชัน มีประโยชน์ทุกที่ยกเว้นในโครงการขนาดเล็กหรือไม่? คิด?

คำตอบ:


16

คำนำหน้าชื่อไม่ใช่แบบเดียวกับการกำหนดเนมสเปซยกเว้นว่าจะใช้วิธีที่มีประโยชน์น้อยกว่าและอ่าน / แยกวิเคราะห์ได้ยากขึ้นหรือไม่ คำถามไม่ได้ตอบตัวเอง?


เพียงแค่ใส่คำนำหน้าที่จุดเริ่มต้นของชื่อตัวระบุไม่เหมือนกับการใช้คุณลักษณะภาษาเช่นเนมสเปซ ตัวอย่างเช่นใน C ++ คุณสามารถพูดได้ว่าคุณusingเป็นเนมสเปซเฉพาะและไม่ต้องใส่คำนำหน้าที่จุดเริ่มต้นของตัวระบุในเนมสเปซนั้น
compman

2
@ user9521 - นั่นคือสิ่งที่ฉัน ...
Nicole

+1 ประโยชน์ใหญ่หนึ่ง namespaces คือการที่คุณสามารถข้าม / ย่นคำนำหน้าเมื่อมันไม่จำเป็น - ใน namespace ที่สิ่งที่โดยเฉพาะอย่างยิ่งที่จะอ้างถูกกำหนดโดยusingโดยimport xxxxxxxxx as yyyฯลฯ

1
เนื่องจากโปรแกรมเมอร์ส่วนใหญ่ขี้เกียจคุณอยากจะประกาศusing SDL;หรือพิมพ์SDL_*ทั่วสถานที่หรือไม่?
Berin Loritsch

2
+1 แต่ฉันคิดว่าคุณหมายถึง "มีประโยชน์น้อยกว่าอ่านยากกว่าและไม่ได้รับการยืนยันโดยคอมไพเลอร์"
Larry Coleman

5

ภาษา (all?) ส่วนใหญ่ที่มีเนมสเปซมักจะเป็นวัตถุ หลายครั้งที่ชื่อที่มนุษย์สามารถอ่านได้สำหรับประเภทนั้นมีความเหมาะสมแม้ว่าจะมีการใช้งานที่เข้ากันไม่ได้หลายอย่างก็ตาม (สิ่งนี้จะทำให้เกิดปัญหาอื่น ๆ เกี่ยวกับการใช้งานเชิงวัตถุอีกครั้ง แต่นั่นไม่ใช่สิ่งที่คำถามนี้เกี่ยวกับ) ตัวอย่างเช่นใน Java คุณมีตัวจับเวลาที่ใช้สำหรับงาน UI พื้นหลังและตัวจับเวลาที่ใช้สำหรับงานแอปพลิเคชันพื้นหลัง (ไม่เชื่อมโยงกับ AWT / Swing) เนมสเปซช่วยให้คุณมีวัตถุที่มีชื่อเหมือนกันเหล่านี้อาศัยอยู่ใน sub-APIs ที่แตกต่างกัน

เหตุผลที่เนมสเปซเข้ามาเกี่ยวข้องกับงานที่ไม่สมเหตุสมผลในการคาดการณ์ว่านักพัฒนาคนอื่นจะตั้งชื่อวัตถุของพวกเขาอย่างไร C ++ แนะนำแนวคิด (หรืออย่างน้อยก็เป็นภาษาแรกที่ฉันสัมผัสกับแนวคิด) และมันก็มีประโยชน์แม้ว่าจะไม่มีแนวทางในการใช้งานที่ดีที่สุดก็ตาม Java ปรับแนวคิดและเพิ่ม "แนวปฏิบัติที่ดีที่สุด" บางอย่างที่มีชื่อ บริษัท ของคุณในเนมสเปซ ด้วยวิธีนี้คุณเพียงแค่ต้องกังวลเกี่ยวกับ บริษัท ของคุณเอง

คำนำหน้าอาจกลายเป็นความยุ่งเหยิง คุณจะใช้มันเมื่อใด เมื่อใดที่คุณไม่ใช้ โครงสร้าง / คลาส / เมธอดโกลบอลมีส่วนนำหน้าหรือไม่? วิธีการเกี่ยวกับอะไร? เกี่ยวกับคุณสมบัติในโครงสร้าง ฉันได้เห็นสิ่งต่าง ๆ เหล่านี้ในรหัสถึงแม้ว่าจะไม่ได้ขอบคุณในครั้งเดียว Namespaces จัดเตรียมความสามารถในการคาดเดาได้สำหรับคำถามเหล่านี้ทั้งหมดและทำให้เป็นคุณสมบัติทางภาษาแทนที่จะเป็นแบบฝึกหัดที่ดีที่สุด


Haskell มีเนมสเปซ (โมดูล) และไม่ใช่เชิงวัตถุ
Jeremy Heiler

3

ฉันคิดว่า namespaces เป็นความคิดที่ดี ช่วยป้องกันความขัดแย้งในการตั้งชื่อโดย จำกัด ขอบเขตของชื่อ ในแพ็คเกจ Java ข้อตกลงการตั้งชื่อแพ็กเกจที่แนะนำนั้นขึ้นอยู่กับชื่อโดเมนซึ่งควรไม่ซ้ำกันซึ่งช่วยป้องกันการตั้งชื่อข้อขัดแย้งกับไลบรารีที่กำหนดเอง โดยรวมแล้วพวกเขาทำให้การตั้งชื่อแตกต่างกันเล็กน้อยในแง่กว้างในขณะที่ยังช่วยให้โปรแกรมเมอร์มีอิสระมากขึ้นในการตั้งชื่อส่วนของเขาโดยไม่ต้องทำตามแบบแผนการตั้งชื่อที่คลุมเครือ


1
อย่างไรก็ตามในกรณีของการประชุมเฉพาะของ Java ทุกคนไม่ได้มีเว็บไซต์ นอกจากนี้หากคุณเคยย้ายโปรแกรมของคุณจากเว็บไซต์หนึ่งไปยังอีกเว็บไซต์หนึ่ง (เช่น Sourceforge ไปยัง Github) มันจะสมเหตุสมผล แต่ไม่สะดวกที่จะเปลี่ยนแพ็คเกจหากสิ่งอื่น ๆ ขึ้นอยู่กับรหัสของคุณ
compman

1
ระเบียบของ Java นั้นใช้กับองค์กรของคุณไม่ใช่สถานที่ที่โฮสต์ คุณสามารถประกาศตัวองค์กรและลงมือทำ นอกจากนี้ยังมีปัญหา URL ที่อนุญาตให้ใช้อักขระที่ไม่สามารถใช้ในชื่อแพ็คเกจได้ แต่เราจะไม่ไปที่นั่น ดังนั้นสำหรับคุณเพียงใช้ "me.user9521" เป็นชื่อแพ็คเกจของคุณและคุณตั้งค่าไว้
Berin Loritsch

1
การประชุมไม่เกี่ยวกับชื่อเว็บ แต่เกี่ยวกับชื่อโดเมน คุณสามารถมีโดเมนโดยไม่มีเว็บไซต์
David Thornley

1

Namespaces / Modules / Packages มีประโยชน์ในการหลีกเลี่ยงความขัดแย้งของชื่อ ดังนั้นการขึ้นต้นชื่อ แต่เนมสเปซมีความสะดวกสบายเพิ่มขึ้นจากความสามารถในการนำเข้าสัญลักษณ์เข้าสู่เนมสเปซปัจจุบันเพื่อให้คุณไม่ต้องกังวลกับ Namespace :: * ทั้งหมด

บางภาษา (เช่น Python) ขยายความสามารถนี้โดยอนุญาตให้คุณนำเข้าเฉพาะสัญลักษณ์ที่ระบุในโมดูลปัจจุบันของคุณหรือสัญลักษณ์นำเข้าในชื่ออื่น สิ่งนี้มีประโยชน์หากคุณสนใจเพียงไม่กี่คลาส / ฟังก์ชั่น / ค่าคงที่หรือหากสัญลักษณ์บางตัวขัดแย้งกับสัญลักษณ์ในเนมสเปซของคุณ แต่บางอันไม่ได้

บางภาษา (เช่น Ruby) อนุญาตให้คุณรวมวิธีการของโมดูลลงในชั้นเรียนของคุณ สิ่งนี้มีประโยชน์สำหรับ polymorphism และ generics ตัวอย่างเช่นถ้าคุณมีหลายคลาสที่มีตัววนซ้ำที่ทำหน้าที่ในลักษณะเดียวกันคุณสามารถผสมวิธีในคลาสทั้งหมดเหล่านี้จากโมดูลแยกต่างหากที่ให้วิธีการเรียงลำดับและกรองข้อมูลในวัตถุ สิ่งนี้ช่วยให้has aความสัมพันธ์เช่นเดียวกับความสัมพันธ์is a(มรดก)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.