Şeker Kupası Analojisi
Sürüm 1: Her şeker için bir fincan
Diyelim ki böyle bir kod yazdınız:
Mod1.ts
export namespace A {
export class Twix { ... }
}
Mod2.ts
export namespace A {
export class PeanutButterCup { ... }
}
Mod3.ts
export namespace A {
export class KitKat { ... }
}
Bu kurulumu oluşturdunuz:
Her bir modül (kağıt levha) alır , kendi fincan adında A
. Bu işe yaramaz - aslında şekerinizi burada organize etmiyorsunuz, sadece ikramlar arasında ek bir adım (fincandan çıkarıyorsunuz) ekliyorsunuz.
Sürüm 2: Küresel kapsamda bir fincan
Modül kullanmıyorsanız, böyle bir kod yazabilirsiniz ( export
beyan ):
global1.ts
namespace A {
export class Twix { ... }
}
global2.ts
namespace A {
export class PeanutButterCup { ... }
}
global3.ts
namespace A {
export class KitKat { ... }
}
Bu kod A
, genel kapsamda birleştirilmiş bir ad alanı oluşturur :
Bu kurulum kullanışlıdır, ancak modüller için geçerli değildir (çünkü modüller genel kapsamı kirletmez).
Sürüm 3: Kupasız gitmek
Orijinal örneğe dönersek A
, bardaklar A
, veA
size iyilik yapmıyorlar. Bunun yerine, kodu şu şekilde yazabilirsiniz:
Mod1.ts
export class Twix { ... }
Mod2.ts
export class PeanutButterCup { ... }
Mod3.ts
export class KitKat { ... }
şuna benzer bir resim oluşturmak için:
Çok daha iyi!
Şimdi, hala ad alanınızı modüllerinizle gerçekten ne kadar kullanmak istediğinizi düşünüyorsanız, okumaya devam edin ...
Bunlar Aradığınız Kavramlar Değil
Ad alanlarının neden ilk başta var olduklarının kökenine geri dönmeli ve bu nedenlerin dış modüller için anlamlı olup olmadığını incelemeliyiz.
Organizasyon : Ad alanları, mantıksal olarak ilgili nesneleri ve türleri gruplandırmak için kullanışlıdır. Örneğin, C # 'da, tüm koleksiyon türleriniSystem.Collections
. Türlerimizi hiyerarşik ad alanlarına düzenleyerek, bu tür kullanıcılar için iyi bir "keşif" deneyimi sunarız.
İsim Çatışmaları : Çarpışmaların adlandırılmasını önlemek için ad alanları önemlidir. Örneğin, My.Application.Customer.AddForm
ve My.Application.Order.AddForm
- aynı ada, ancak farklı bir ad alanına sahip iki tür olabilir . Tüm tanımlayıcıların aynı kök kapsamda bulunduğu ve tüm derlemelerin tüm türleri yüklediği bir dilde, her şeyin bir ad alanında olması çok önemlidir.
Bu nedenler dış modüllerde anlamlı mı?
Organizasyon : Harici modüller, zorunlu olarak bir dosya sisteminde zaten mevcuttur. Bunları yol ve dosya adına göre çözümlememiz gerekiyor, bu yüzden kullanmamız için mantıklı bir organizasyon şeması var. Bir /collections/generic/
klasöre sahip olabiliriz.list
modül bulunan .
İsim Anlaşmazlıkları : Bu, harici modüllerde hiç geçerli değildir. Bir modül içinde , aynı ada sahip iki nesneye sahip olmanın makul bir nedeni yoktur. Tüketim taraftan, tüketici herhangi bir modülün kazara adlandırma çatışmaları imkansız bu yüzden, modülün başvurmak için kullanacağı ismini almaya alır.
Bu nedenlerin modüllerin nasıl çalıştığına yeterince değindiğine inanmasanız bile, harici modüllerde ad alanlarını kullanmaya çalışmanın "çözümü" bile işe yaramaz.
Kutular Kutular Kutular
Bir hikaye:
Arkadaşın Bob seni çağırıyor. “Evimde yeni bir organizasyon planım var” diyor, “gel bakalım!”. Güzel, hadi gidip Bob'un ne bulduğunu görelim.
Mutfakta başlayıp kileri açıyorsunuz. Her biri "Kiler" etiketli 60 farklı kutu vardır. Rastgele bir kutu seçip açarsınız. İçeride "Taneler" etiketli tek bir kutu var. "Tahıllar" kutusunu açar ve "Makarna" etiketli tek bir kutu bulursunuz. "Makarna" kutusunu açar ve "Penne" etiketli tek bir kutu bulursunuz. Bu kutuyu açıp beklediğiniz gibi bir torba penne makarna buluyorsunuz.
Biraz karışık, "Kiler" olarak da adlandırılan bitişik bir kutu alırsınız. İçeride yine "Tahıl" olarak etiketlenmiş tek bir kutu var. "Tahıllar" kutusunu açarsınız ve yine "Makarna" etiketli tek bir kutu bulursunuz. "Makarna" kutusunu açın ve tek bir kutu bulmak, bu "Rigatoni" etiketli. Bu kutuyu açıp ... bir çanta rigatoni makarna bul.
"Bu harika!" diyor Bob. "Her şey bir isim alanında!".
"Ama Bob ..." diye cevap ver. "Organizasyon şemanız işe yaramaz. Herhangi bir şeye ulaşmak için bir grup kutu açmanız gerekir ve her şeyi üç yerine bir kutuya koymuş olmanızdan daha uygun değildir . . Aslında, kiler zaten rafa göre sıralanmıştır, kutulara hiç ihtiyacınız yoktur. Neden sadece makarnayı rafa yerleştirip ihtiyaç duyduğunuzda almıyorsunuz? "
"Anlamıyorsun - kimsenin 'Kiler' ad alanına ait olmayan bir şey koymadığından emin olmalıyım. Ve tüm makarnamı güvenli bir şekilde Pantry.Grains.Pasta
ad alanına yerleştirdim, böylece kolayca bulabilirim"
Bob çok şaşkın bir adam.
Modüller Kendi Kutularıdır
Muhtemelen gerçek hayatta benzer bir şey yaşadınız: Amazon'da birkaç şey sipariş edersiniz ve her öğe kendi kutusunda, daha küçük bir kutuyla, öğeniz kendi ambalajında sarılır. İç kutular benzer olsa bile, gönderiler yararlı bir şekilde "birleşik" değildir.
Kutu benzetmesi ile ilgili olarak, ana gözlem, harici modüllerin kendi kutusu olduklarıdır . Çok fazla işlevselliğe sahip çok karmaşık bir öğe olabilir, ancak herhangi bir harici modül kendi kutusudur.
Harici Modüller için Rehberlik
Artık 'ad alanları' kullanmamız gerekmediğini anladığımıza göre, modüllerimizi nasıl organize etmeliyiz? Bazı yol gösterici ilkeler ve örnekler aşağıdadır.
Mümkün olduğunca üst seviyeye yakın dışa aktarın
- Yalnızca tek bir sınıfı veya işlevi dışa aktarıyorsanız, şunu kullanın
export default
:
MyClass.ts
export default class SomeType {
constructor() { ... }
}
MyFunc.ts
function getThing() { return 'thing'; }
export default getThing;
tüketim
import t from './MyClass';
import f from './MyFunc';
var x = new t();
console.log(f());
Bu tüketiciler için idealdir. Türünüzü istedikleri gibi adlandırabilirler ( t
bu durumda) ve nesnelerinizi bulmak için herhangi bir yabancı noktalama yapmak zorunda kalmazlar.
- Birden çok nesneyi dışa aktarıyorsanız, hepsini en üst düzeye yerleştirin:
MyThings.ts
export class SomeType { ... }
export function someFunc() { ... }
tüketim
import * as m from './MyThings';
var x = new m.SomeType();
var y = m.someFunc();
- Çok sayıda şeyi dışa aktarıyorsanız, yalnızca
module
/ namespace
anahtar sözcüğünü kullanmanız gerekir :
MyLargeModule.ts
export namespace Animals {
export class Dog { ... }
export class Cat { ... }
}
export namespace Plants {
export class Tree { ... }
}
tüketim
import { Animals, Plants} from './MyLargeModule';
var x = new Animals.Dog();
Kırmızı bayraklar
Aşağıdakilerin tümü modül yapılandırması için kırmızı bayraklardır. Bunlardan herhangi biri dosyalarınız için geçerliyse harici modüllerinizi adlandırmaya çalışmadığınızı bir kez daha kontrol edin:
- Yalnızca üst düzey bildirimi olan bir dosya
export module Foo { ... }
( Foo
her şeyi kaldırın ve bir üst seviyeye taşıyın)
- Tekli olan
export class
veya export function
olmayan bir dosyaexport default
export module Foo {
Üst düzeyde aynı olan birden fazla dosya (bunların tek bir dosyada birleşeceğini düşünmeyin Foo
!)