Candy Cup คล้ายคลึง
เวอร์ชั่น 1: ถ้วยสำหรับขนมทุกชนิด
สมมติว่าคุณเขียนโค้ดบางอย่างเช่นนี้:
Mod1.ts
export namespace A {
export class Twix { ... }
}
Mod2.ts
export namespace A {
export class PeanutButterCup { ... }
}
Mod3.ts
export namespace A {
export class KitKat { ... }
}
คุณได้สร้างการตั้งค่านี้:
แต่ละโมดูล (กระดาษ) ได้รับถ้วยของตัวเองA
ชื่อ นี่ไร้ประโยชน์ - คุณไม่ได้จัดระเบียบขนมของคุณที่นี่จริง ๆคุณแค่เพิ่มขั้นตอนเพิ่มเติม (นำมันออกจากถ้วย) ระหว่างคุณกับขนม
รุ่น 2: หนึ่งถ้วยในขอบเขตส่วนกลาง
หากคุณไม่ได้ใช้โมดูลคุณอาจเขียนโค้ดแบบนี้ (สังเกตการขาดการexport
ประกาศ):
global1.ts
namespace A {
export class Twix { ... }
}
global2.ts
namespace A {
export class PeanutButterCup { ... }
}
global3.ts
namespace A {
export class KitKat { ... }
}
รหัสนี้สร้าง namespace ที่ผสานA
ในขอบเขตส่วนกลาง:
การตั้งค่านี้มีประโยชน์ แต่ไม่ได้นำไปใช้ในกรณีของโมดูล (เนื่องจากโมดูลจะไม่สร้างมลภาวะระดับโลก)
เวอร์ชัน 3: ไร้ความหมาย
จะกลับไปเช่นเดิมถ้วยA
, A
และA
ไม่ได้ทำคุณโปรดปรานใด ๆ แต่คุณสามารถเขียนรหัสเป็น:
Mod1.ts
export class Twix { ... }
Mod2.ts
export class PeanutButterCup { ... }
Mod3.ts
export class KitKat { ... }
เพื่อสร้างรูปภาพที่มีลักษณะดังนี้:
ดีกว่ามาก!
ตอนนี้ถ้าคุณยังคิดอยู่ว่าคุณต้องการใช้เนมสเปซกับโมดูลของคุณมากเพียงใดอ่านต่อ ...
นี่ไม่ใช่แนวคิดที่คุณต้องการ
เราต้องย้อนกลับไปที่จุดเริ่มต้นว่าทำไมเนมสเปซมีอยู่ตั้งแต่แรกและตรวจสอบว่าเหตุผลเหล่านั้นสมเหตุสมผลสำหรับโมดูลภายนอกหรือไม่
องค์กร : เนมสเปซมีประโยชน์สำหรับการจัดกลุ่มวัตถุและประเภทที่เกี่ยวข้องกับเหตุผล ยกตัวอย่างเช่นใน C # System.Collections
คุณกำลังจะไปหาทุกประเภทคอลเลกชันใน ด้วยการจัดระเบียบประเภทของเราเป็นเนมสเปซแบบลำดับขั้นเราจะมอบประสบการณ์ "การค้นพบ" ที่ดีสำหรับผู้ใช้ประเภทเหล่านั้น
ความขัดแย้งของชื่อ : เนมสเปซมีความสำคัญเพื่อหลีกเลี่ยงการชนกันของชื่อ ตัวอย่างเช่นคุณอาจมีMy.Application.Customer.AddForm
และMy.Application.Order.AddForm
- สองประเภทที่มีชื่อเหมือนกัน แต่เป็นชื่อเฉพาะที่แตกต่างกัน ในภาษาที่มีตัวระบุทั้งหมดอยู่ในขอบเขตรูทเดียวกันและแอสเซมบลีทั้งหมดโหลดทุกประเภทสิ่งสำคัญคือต้องมีทุกอย่างในเนมสเปซ
เหตุผลเหล่านั้นสมเหตุสมผลในโมดูลภายนอกหรือไม่
องค์กร : มีโมดูลภายนอกอยู่ในระบบไฟล์อยู่แล้วจำเป็นต้องมี เราต้องแก้ไขมันด้วยพา ธ และชื่อไฟล์ดังนั้นจึงมีรูปแบบองค์กรที่เป็นตรรกะเพื่อให้เราใช้ เราสามารถมี/collections/generic/
โฟลเดอร์ที่มีlist
โมดูลอยู่ในนั้น
ความขัดแย้งของชื่อ : สิ่งนี้ไม่ได้ใช้กับโมดูลภายนอกทั้งหมด ภายในโมดูลไม่มีเหตุผลที่เป็นไปได้ที่จะมีวัตถุสองชิ้นที่มีชื่อเดียวกัน จากด้านการใช้งานผู้บริโภคของโมดูลใด ๆ ที่ได้รับจะเลือกชื่อที่พวกเขาจะใช้เพื่ออ้างถึงโมดูลดังนั้นความขัดแย้งในการตั้งชื่อโดยไม่ตั้งใจนั้นเป็นไปไม่ได้
แม้ว่าคุณจะไม่เชื่อว่าเหตุผลเหล่านั้นได้รับการแก้ไขอย่างเพียงพอโดยวิธีการทำงานของโมดูล "การแก้ปัญหา" ในการพยายามใช้เนมสเปซในโมดูลภายนอกไม่สามารถใช้งานได้
กล่องในกล่องในกล่อง
เรื่องราว:
บ๊อบเพื่อนของคุณโทรหาคุณ "ฉันมีรูปแบบองค์กรใหม่ที่ยอดเยี่ยมในบ้านของฉัน" เขาพูด "ลองดูสิ!" ไม่เป็นไรลองดูว่าบ็อบมากับอะไรกัน
คุณเริ่มต้นในห้องครัวและเปิดตู้กับข้าว มี 60 กล่องแตกต่างกันแต่ละป้าย "ตู้กับข้าว" คุณเลือกกล่องโดยการสุ่มและเปิด ข้างในเป็นกล่องเดียวเขียนว่า "ธัญพืช" คุณเปิดกล่อง "Grains" และค้นหากล่องเดียวที่ชื่อ "พาสต้า" คุณเปิดกล่อง "พาสต้า" และค้นหากล่องเดียวที่ระบุว่า "Penne" คุณเปิดกล่องนี้และค้นหาพาสต้าเพนเน่หนึ่งถุงอย่างที่คุณคาดไว้
สับสนเล็กน้อยคุณหยิบกล่องที่อยู่ติดกันชื่อ "ครัว" ข้างในเป็นกล่องเดียวป้าย "Grains" อีกครั้ง คุณเปิดกล่อง "ธัญพืช" และค้นหากล่องเดียวที่มีป้ายกำกับ "พาสต้า" อีกครั้ง คุณเปิดกล่อง "พาสต้า" และค้นหากล่องเดียวกล่องนี้มีชื่อว่า "Rigatoni" คุณเปิดกล่องนี้และพบ ... พาสต้า rigatoni
"มันเยี่ยมมาก!" บ๊อบบอกว่า "ทุกอย่างอยู่ในเนมสเปซ!"
"แต่บ๊อบ ... " คุณตอบกลับ "รูปแบบองค์กรของคุณไร้ประโยชน์คุณต้องเปิดกล่องหลายอย่างเพื่อไปทำอะไรและมันไม่สะดวกกว่าที่จะหาอะไรมากกว่าที่คุณเพิ่งใส่ทุกอย่างไว้ในกล่องเดียวแทนที่จะเป็นสามกล่องอันที่จริงแล้วตั้งแต่ของคุณ ตู้เก็บอาหารนั้นถูกจัดเรียงตามชั้นวางแล้วโดยที่คุณไม่ต้องใช้กล่องเลยทำไมไม่ลองวางพาสต้าไว้บนชั้นแล้วหยิบมันขึ้นมาเมื่อคุณต้องการ "
"คุณไม่เข้าใจ - ฉันต้องตรวจสอบให้แน่ใจว่าไม่มีใครใส่อะไรที่ไม่ได้อยู่ในเนมสเปซ 'Pantry' และฉันได้จัดระเบียบพาสต้าทั้งหมดของฉันไว้ในPantry.Grains.Pasta
เนมสเปซอย่างปลอดภัยแล้ว
บ๊อบเป็นคนสับสนมาก
โมดูลเป็นกล่องของตัวเอง
คุณอาจมีสิ่งที่คล้ายกันเกิดขึ้นในชีวิตจริง: คุณสั่งบางสิ่งใน Amazon และแต่ละรายการจะแสดงในกล่องของตัวเองโดยมีกล่องเล็ก ๆ อยู่ข้างในโดยที่รายการของคุณห่อด้วยบรรจุภัณฑ์ของตัวเอง แม้ว่ากล่องภายในจะคล้ายกัน แต่การจัดส่งจะไม่รวมกันอย่างเป็นประโยชน์
ไปกับกล่องเปรียบเทียบที่สังเกตที่สำคัญคือโมดูลภายนอกช่องของตัวเอง มันอาจเป็นไอเท็มที่ซับซ้อนมากที่มีฟังก์ชั่นมากมาย แต่โมดูลภายนอกที่ให้นั้นเป็นกล่องของมันเอง
คำแนะนำสำหรับโมดูลภายนอก
ตอนนี้เราได้รู้แล้วว่าเราไม่จำเป็นต้องใช้ 'namespaces' เราจะจัดการโมดูลของเราอย่างไร? หลักการและตัวอย่างที่ชี้นำบางประการปฏิบัติตาม
ส่งออกใกล้เคียงกับระดับสูงสุดเท่าที่จะทำได้
- หากคุณส่งออกคลาสหรือฟังก์ชันเดียวให้ใช้
export default
:
MyClass.ts
export default class SomeType {
constructor() { ... }
}
MyFunc.ts
function getThing() { return 'thing'; }
export default getThing;
การบริโภค
import t from './MyClass';
import f from './MyFunc';
var x = new t();
console.log(f());
นี่คือที่ดีที่สุดสำหรับผู้บริโภค พวกเขาสามารถตั้งชื่อประเภทของคุณตามที่พวกเขาต้องการ ( t
ในกรณีนี้) และไม่จำเป็นต้องทำสิ่งต่าง ๆ เพื่อค้นหาวัตถุของคุณ
- หากคุณกำลังส่งออกวัตถุหลายรายการให้วางทั้งหมดไว้ที่ระดับบนสุด:
MyThings.ts
export class SomeType { ... }
export function someFunc() { ... }
การบริโภค
import * as m from './MyThings';
var x = new m.SomeType();
var y = m.someFunc();
- หากคุณกำลังส่งออกสิ่งต่าง ๆ จำนวนมากคุณควรใช้คำหลัก
module
/namespace
MyLargeModule.ts
export namespace Animals {
export class Dog { ... }
export class Cat { ... }
}
export namespace Plants {
export class Tree { ... }
}
การบริโภค
import { Animals, Plants} from './MyLargeModule';
var x = new Animals.Dog();
ธงแดง
ทั้งหมดต่อไปนี้เป็นธงสีแดงสำหรับการสร้างโมดูล ตรวจสอบอีกครั้งว่าคุณไม่ได้พยายามกำหนด namespace ให้กับโมดูลภายนอกของคุณหากสิ่งเหล่านี้มีผลกับไฟล์ของคุณ:
- ไฟล์ที่มีการประกาศระดับบนสุดเท่านั้น
export module Foo { ... }
(ลบFoo
และย้ายระดับขึ้นทุกสิ่ง 'ขึ้น')
- ไฟล์ที่มีไฟล์เดียว
export class
หรือexport function
ไม่มีเลยexport default
- หลายไฟล์ที่เหมือนกัน
export module Foo {
ที่ระดับบนสุด (อย่าคิดว่าไฟล์เหล่านี้จะรวมกันเป็นหนึ่งเดียวFoo
!)