Ad alanı (diğer adlandırmalarla 'Ad uzayı', 'Alan adı', 'isim uzayı' 'isim alanı' ya da İngilizce'deki adıyla 'namespace') çeşitli türdeki nesneleri tanımlayıp kümelere ayırmak için kullanılan ad ile belirteçler bütünüdür. Ad alanları, Genellikle yazılımcılık ile özdeşleşseler de sadece yazılıma özgü değillerdir. Kaynak kodun mantıksal olarak alt parçalara bölünmesini ve ad çakışmalarını önlemeyi sağlar. Genellikle soyut bir kavram olarak kabul edilirler. Ad alanları ayrıca isimlerin farklı bağlamlarda yeniden kullanımlarını sağlamak için yapısal olarak hiyerarşileştirilebilmektedirler.
Ad alanlarına ilişkin en öne çıkan örneklerden birisi, dosyalara ad atayan dosya sistemleridir. Bazı programlama dilleri ise kendi değişkenlerini ve fonksiyonlarını ad uzaylarında örgütler.
Ad alanlarının ek olarak neresinde olacağı değişir, bazı ad alanı örnekleri aşağıdaki tablodadır:
| Bağlam | Ad | Ad uzayı ismi | Yerel ad |
|---|---|---|---|
| Domain adı | www.olmayansite.com | olmayansite.com | .com |
| Türkçe Vikipedi | Vikipedi:Doğrulanabilirlik | Vikipedi | Doğrulanabilirlik |
| Dosya yolu | C:\Kullanıcılar\Örnek_Kullanıcı\Masaüstü\PyCharm.exe | C:\Kullanıcılar\Örnek_Kullanıcı\Masaüstü (dizin adı) | Pycharm.exe |
| C++ Standard Kütüphanesi | std::meta::info std::vector<int> |
std::meta std |
info vector<int> |
| C++ ad alanı | Poco::Net::HTTPClientSession | Poco::Net | HTTPClientSession |
| C Sharp | Classlar.Arac | Classlar | Arac |
| Java Standart Kütüphanesi | java.util.Date | java.util | Date |
| Doi | 10.1177/16118944221130213 | 10.1177 | 16118944221130213 |
| Python | functools.reduce | functools (modül adı) | reduce |
Bu alt başlığın genişletilmesi gerekiyor with: C++ ve Python dışında diğer diller de eklenmeli. Sayfayı düzenleyerek yardımcı olabilirsiniz. |
Bilgisayar biliminde ad alanları (namespace), normal tanımlarına ek olarak, birbirlerine mantıksal olarak bağlı olan eşsiz tanımlayıcıları ile simgeleri bir arada tutan sanal ve soyut birer ortam olarak da davranırlar. Bir ad uzayında bildirilmiş olan bir değişken, fonksiyon, sınıf vs. (yani tanımlayıcılar) sadece o ad uzayında geçerlidir. Aynı isimde olan birden çok tanımlayıcı birbirinden farklı isim uzaylarında bulunabilir. Ad uzaylarının içinde ayrıca başka bir ad uzayı da bulunabilir. Ad alanı özelliğini destekleyen yazılım dillerinde hangi tanımlayıcının hangi ad alanına ait olduğunu belirten kurallar da bulunabilmektedir.
C++ programlama dilinde namespace anahtar sözcüğüyle bir ad alanı bildirilebilir. İsim uzayının adı, namespace sözcüğünden sonra gelir. Ad alanının içinde tanımlanacak nesneler normalde tanımlandıkları şekilde tanımlanabilirler. Örnek olarak aşağıdaki kaynak kod verilebilir:
#include <concepts>
namespace matematik { //Bu ad alanının adı 'matematik'tir
constexpr bool cift_mi(std::integral auto tamsayi) noexcept {
return tamsayi % 2 == 0;
}
constexpr double pi = 3.141592653589;
//tanımlayıcılar normalde nasıl tanımlandılarsa öyle tanımlandılar, hiçbir değişiklik olmadı
}
Eğer bir ad uzayının içindeki tanımlayıcılara eğer sözü edilen ad alanının dışından erişmek istenilirse, bunun için o ad alanının ismi birer ön ek olarak kullanılıp :: operatörü (kapsam çözümleme operatörü) ile erişilmesi gerekilmektedir. Örnek olarak şu kod parçası verilebilir (üstteki kaynak kodu takiben):
int main() {
bool sonuc = matematik::cift_mi(2029);
constexpr double ters_pi = 1 / matematik::pi;
//Görüldüğü üzere bir ad alanının içindeki tanımlayıcıya erişebilmek için "[ad_alanının_adı]::[tanımlayıcı]" sözdizimini kullandık
}
Bildirilen isim uzaylarına aynı zamanda takma ad verilebilir. bunun için ise namespace verilecek_takma_ad = varolan_ad_uzayı; sözdizimi izlenir.
constexpr bool asal_mi(std::size_t tamsayi) {
namespace math = matematik;
if (math::cift_mi(tamsayi))
return false;
else if (tamsayi % 3 == 0)
return false;
for (std::size_t i = 5; i += 4; ++i){
if (tamsayi % i == 0)
return false;
}
return true;
}
Başka bir kaynak kod örneği ise iç içe oluşturulmuş ad alanlarına kısa takma ad vermek için kullanılabilir:
#include <print>
namespace hede {
namespace hödö {
namespace falan {
char abecemizin_son_harfi = 'Z';
}
}
}
namespace kısa = hede::hödö::falan;
int main() {
std::print("'Z'nin ASCII karşılığı: {}", static_cast<int>(kısa::abecemizin_son_harfi) );
}
Eğer bir ad uzayındaki tüm tanımlayıcıları o anda bulunan kapsama aktarmak istersek using direktiflerini (yönergelerini) kullanılabilir. using direktiflerinin sözdizimi using namespace ad_alanı; şeklindedir.
#include <cstddef>
namespace genel {
struct rgb_değerleri {
std::uint8_t r;
std::uint8_t g;
std::uint8_t b;
};
constexpr int gündeki_saniye_sayısı = 86'400;
constexpr double fahrenhaytdan_celciusa(double fahr) {
return (fahr - 32.0) * 5.0 / 9.0;
}
}
int main() {
using namespace genel;
//artık "genel" ad uzayındaki tüm tanımlayıcılar 'main' fonksiyonunun kapmasına da aktarıldı
//Yani artık "genel::" önekini kullanmamıza gerek yok
constexpr auto beyaz = rgb_değerleri(255,255,255);
constexpr std::size_t haftadaki_saniye_sayısı = gündeki_saniye_sayısı * 7;
constexpr double degisken = fahrenhaytdan_celciusa(32);
}
C++ Standard Kütüphanesindeki her şeyi o anda bulunulmakta olan kapsama aktaran using namespace std; direktifi, std alan adındaki tüm tanımlayıcıları aynı bulunulan kapsam fark etmeksizin küresel kapsama tanıtır. Bunun nedeni, küresel kapsamın (İngilizce adıyla "global scope") hem std ad alanını hem de herhangi bir kullanıcı tanımlı ad alanını dahil eden en yakın kapsam olmasıdır. Bu direktifin kullanımı istenmeyen ad çakışmalarına yol açabilmektedir. Bu direktif ile diğer using direktiflerinin -özellikle küresel kapsamda- kullanımı Header dosyalarında kötü pratik olarak kabul görmektedir.
Eğer bahsi geçilen ad alanının içindeki tüm tanımlayıcıları aktarmak istemeyip yalnızca belirli bir(kaç) tane tanımlayıcıları içe aktarmak isteniliyorsa using bildirilerini kullanabilir. using bildirilerinin sözdizimi using ad_alanı::tanımlayıcı1, ad_alanı::tanımlayıcı2, [...] ad_alanı::tanımlayıcıN; şeklindedir.
C++'daki diğer bir ad alanı özelliği ise inline namespace'lerdir. Bu tür ad uzaylarının üyeleri, her ne kadar belirtilen ad uzayın ismiyle erişirilebilseler de, sanki onları çevreleyen hemen üst kapsam/ad uzayının üyesilermiş gibi davranırlar.
Ad alanları harikulade bir düşünce, bunlardan daha fazlasını yapalım!
— Tim Peters, 'Python'un felsefesi' anlamına gelen 'Zen of Python' adındaki bir PEP eserinde.
Python'da ad alanları genellikle modüller üzerinden sağlanmaktadır. Bir modül içindeki tanımlayıcıyı doğrudan o anda bulunulan kapsama aktarmak istenirse from modül_adı import tanımlayıcı sözdizimi, eğer bir modüldeki tanımlayıcıların hepsi o anda bulunulan kapsama aktarılmak istenirse from modül_adı import * sözdizimi kullanılabilir.
What are namespaces? In the broadest definition, namespaces are a way of encapsulating items. This can be seen as an abstract concept in many places. For example, in any operating system directories serve to group related files, and act as a namespace for the files within them.
The primary construct established by a file system is a hierarchical directory namespace, which is the logical repository for files.