İsim / Paketlerin Esasları


14

Bazı programlama dilleri (örn. Java ve C ++) "paket" veya "ad alanları" olarak adlandırılan dil özelliklerine sahiptir. İsim alanlarına sahip olmak gerçekten ne kadar faydalı? SDL gibi bir dil özelliğini kullanmadan işlevleri ve sınıfları belirli bir kütüphaneye ait olarak işaretlemek mümkündür (örn. SDL_BlitSurface()). İsim alanları sahip olmaya değecek kadar yardımcı değil mi? Kütüphanelerde yararlı mıdır, uygulamalarda değil mi? Küçük projeler dışında her yerde faydalılar mı? Düşünceler?

Yanıtlar:


16

Değil misin önekleri isim aynı şeyi Namespacing o / ayrıştırma okumak için daha az kullanışlı ve daha zor bir şekilde yapıldığını dışında? Soru kendine cevap vermiyor mu?


Bir tanımlayıcının adının başına bir önek koymak, ad alanları gibi bir dil özelliğini kullanmakla aynı şey değildir. Örneğin, C ++ 'da, usingbelirli bir ad alanı olduğunuzu söyleyebilir ve daha sonra öneki bu ad alanındaki tanımlayıcıların başına koymak zorunda kalmayabilirsiniz.
compman

2
@ user9521 - bu benim açımdan ...
Nicole

Tarafından, tanımlanır özellikle şey refere ad - 1 ad tek büyük avantajı / atlamak İhtiyaç olmadığında önek kısaltmak olmasıdır usingtarafından, import xxxxxxxxx as yyyvb

1
Çoğu programcı tembel using SDL;olduğu için, SDL_*her yerde beyan etmeyi mi yoksa yazmayı mı tercih edersiniz ?
Berin Loritsch

2
+1, ancak bence gerçekten "daha az kullanışlı, okunması daha zor ve derleyici tarafından doğrulanmadı".
Larry Coleman

5

Ad alanlarına sahip çoğu (tümü?) Dil nesne yönelimli olma eğilimindedir. Birden çok uyumsuz uygulama olmasına rağmen, çoğu zaman bir tür için okunabilir bir isim uygundur. (bu, nesne yönelimli yeniden kullanımla ilgili diğer konuları gündeme getirir, ancak bu sorunun konusu bu değildir). Örneğin, Java'da arka plan UI görevleri için kullanılan bir Zamanlayıcı ve arka plan uygulaması (AWT / Swing'e bağlı olmayan) görevler için kullanılan bir Zamanlayıcı vardır. Ad alanı, bu aynı adlı nesnelerin farklı alt API'larda yaşamanıza izin verir.

İsim alanlarının ortaya çıkmasının nedeni, diğer geliştiricilerin nesnelerini adlandıracaklarını tahmin etmenin mantıksız görevi ile ilgiliydi. C ++ konsepti tanıttı (ya da en azından kavramla karşılaştığım ilk dildi) ve en iyi kullanım uygulamaları hakkında hiçbir rehber olmamasına rağmen yardımcı oldu. Java, konsepti uyarladı ve şirket adınızı ad alanına dahil eden "en iyi uygulamaları" ekledi. Bu şekilde sadece kendi şirketiniz hakkında endişelenmeniz gerekiyordu.

Ön ek oldukça dağınık olabilir. Ne zaman uygularsınız? Ne zaman do not uygulamak? Yapılar / sınıflar / global yöntemler ön ek alır mı? Yöntemler ne olacak? Yapıdaki özellikler ne olacak? Tüm bunları kodda gördüm, ancak şükür ki hepsi bir anda değil. Ad alanları, tüm bu sorulara öngörülebilirlik sağlar ve kişisel bir "en iyi uygulama" yerine bir dil özelliği haline getirir.


Haskell'in isim alanları (modülleri) vardır ve nesneye yönelik değildir.
Jeremy Heiler

3

İsim alanlarının harika bir fikir olduğunu düşünüyorum. Bir adın kapsamını sınırlandırarak adlandırma çakışmalarını önlemeye yardımcı olurlar. Java paketlerinde, önerilen paket adlandırma kuralı, benzersiz olması gereken ve özel kitaplıklar üzerindeki adlandırma çakışmalarını önlemeye yardımcı olan etki alanı adlarına dayanır . Genel olarak, isimlendirmeyi geniş anlamda biraz daha benzersiz hale getirirken, programcıya bazı belirsiz adlandırma kurallarına uymaksızın parçalarını adlandırma konusunda biraz daha fazla özgürlük sağlarlar.


1
Ancak, Java'nın özel sözleşmesi durumunda, herkesin bir web sitesi yoktur. Ayrıca, programınızı bir web sitesinden başka bir web sitesine (örneğin Sourceforge'dan Github'a) taşırsanız, başka şeyler kodunuza bağlıysa paketleri değiştirmek mantıklı olacaktır.
compman

1
Java'nın sözleşmesi, barındırıldığı yer için değil, kuruluşunuz için geçerlidir. Kendinize bir organizasyon beyan edebilir ve bununla işlerinizi yapabilirsiniz. Ayrıca paket adlarında kullanılamayan karakterlere izin veren URL sorunları da vardır. Ama oraya gitmeyeceğiz. Yani sizin için, paket adınız olarak sadece "me.user9521" kullanın ve hazırsınız.
Berin Loritsch

1
Sözleşme web adları ile değil, alan adları ile ilgilidir. Web sitesi olmayan bir alan adınız olabilir.
David Thornley

1

Ad alanları / Modüller / Paketler, ad çakışmalarını önlemek için kullanışlıdır. Ad önekleme de öyle, ancak ad alanlarının geçerli ad alanına sembolleri içe aktarabilme rahatlığı vardır, böylece tüm Namespace :: * ile uğraşmanıza gerek kalmaz.

Bazı diller (Python gibi), mevcut modülünüze yalnızca belirli sembolleri veya farklı bir ad olarak sembolleri içe aktarmanıza izin vererek bu yeteneği genişletir. Bu, yalnızca birkaç sınıf / işlev / sabitle ilgileniyorsanız veya bazı simgeler ad alanınızdaki sembollerle çakışıyor, ancak bazıları ilgisizse yararlıdır.

Bazı diller (Ruby gibi) bir modülün yöntemlerini sınıfınıza eklemenize izin verir. Bu, polimorfizm ve jenerikler için yararlıdır. Örneğin, aynı şekilde hareket eden yineleyicilere sahip birden fazla sınıfınız varsa, nesnedeki verileri sıralamak ve filtrelemek için yöntemler sağlayan ayrı bir modülden bu sınıfların tümüne yöntemler ekleyebilirsiniz. Bu, has ailişkilere olduğu kadar is a(kalıtım) ilişkilere de izin verir .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.