Bosh sahifa Wiki Namespace

Namespace

Namespace — nomlarni mantiqiy guruhlarga ajratib, bir xil nomlarning bir-biriga to‘qnashmasligini ta’minlaydigan hudud. Namespace ichida nom noyob bo‘lishi kerak, ammo boshqa namespace’da ayni nom qayta ishlatilishi mumkin.

Dasturlash tili, operatsion tizim, container, XML, DNS va boshqa tizimlarda namespace tushunchasi mavjud.

Nom to‘qnashuvi

Ikki library bir xil User, Config yoki Logger nomli type taqdim etishi mumkin.

Namespace bilan to‘liq nomlar farqlanadi:

billing.User
auth.User

Qisqa nom bir xil, qualified name boshqa.

Qualified name

Namespace va symbol birga yozilgan nom qualified name.

Misollar:

company.project.module.Class
std::vector
System.IO.File

Ajratuvchi belgi tilga qarab nuqta, ::, slash yoki boshqa ko‘rinishda bo‘ladi.

Nested namespace

Namespace ichida boshqa namespace bo‘lishi mumkin.

company
└── product
    └── billing
        └── invoice

Bu katta codebase’da ownership va domainni ko‘rsatadi.

Juda chuqur hierarchy uzun import va nomlarga sabab bo‘lishi mumkin.

Import

Import yoki using qisqa nomdan foydalanishga imkon beradi.

import billing.User

Keyin kodda faqat User yoziladi.

Ikki import bir xil qisqa nom bersa ambiguity yuz beradi. Alias ishlatiladi:

import billing.User as BillingUser

Global namespace

Namespace ko‘rsatilmagan nomlar global hududga tushishi mumkin.

Ko‘p global nom:

keltirib chiqaradi.

Library public nomlarini aniq prefix yoki namespace ichida saqlaydi.

Lexical scope bilan farqi

Scope variable qayerdan ko‘rinishini belgilaydi.

Namespace nomlar saqlanadigan mantiqiy jadval yoki guruh.

Ular bog‘liq, ammo bir xil emas.

Function local scope o‘z namespace’iga o‘xshash symbol tablega ega bo‘lishi mumkin, lekin atamalar til nazariyasida alohida ishlatiladi.

Type namespace va value namespace

Ba’zi tillar type nomlari va variable/function nomlarini alohida namespace’da saqlaydi.

Shu sababli type va variable bir xil nomga ega bo‘lishi mumkin.

Boshqa tillar barcha symbolni bitta namespace’da boshqaradi.

Module va namespace

Module:

bo‘lishi mumkin.

Namespace esa nomlarni tashkil qiladi.

Bir module bir nechta namespace’ga kod qo‘shishi yoki bitta namespace bir nechta module’da kengaytirilishi mumkin. Bu tilga bog‘liq.

Package va namespace

Ba’zi ekotizimlarda package yo‘li namespace nomiga mos keladi.

Boshqalarida ular mustaqil.

Package dependency va distribution birligi, namespace esa nom resolution birligi.

Ularni bir xil deb qabul qilish import xatolariga olib kelishi mumkin.

Namespace pollution

Library global namespace’ga ko‘p nom qo‘shsa namespace pollution yuz beradi.

Natijalar:

  • collision;
  • auto-completion shovqini;
  • accidental override;
  • noaniq code.

Faqat public API eksport qilinadi, internal helper yashiriladi.

Name resolution

Compiler yoki interpreter qisqa nomni topish uchun ma’lum tartibda qidiradi.

Masalan:

  1. local scope;
  2. enclosing scope;
  3. imported symbol;
  4. current namespace;
  5. global;
  6. built-in.

Aniq tartib tilga bog‘liq.

Shadowing oldingi scope’dagi nomni vaqtincha yashirishi mumkin.

Namespace alias

Uzun yoki collision beruvchi namespace qisqa alias bilan ishlatiladi.

namespace fs = company::storage::filesystem

Alias source code qulayligi uchun, asl binary yoki package nomini o‘zgartirmaydi.

Partial namespace

Ba’zi tillarda bir namespace declarationi bir nechta faylda bo‘lishi mumkin.

Bu katta loyiha uchun qulay.

Compile vaqtida barcha declarationlar bitta mantiqiy namespacega birlashtiriladi.

C++ namespace

C++ namespace function, class va variablelarni guruhlaydi.

Anonymous namespace ichidagi symbol translation unit doirasida internal linkage oladi.

using namespaceni headerda keng ishlatish boshqa kodga nom collision olib kirishi mumkin.

XML namespace

XMLda element nomlari URI bilan ajratiladi.

<a:table xmlns:a="urn:app-a">

Prefix lokal qisqartma, haqiqiy namespace identity URI.

Ikki schema bir xil element nomidan conflict qilmasdan foydalanadi.

DNS namespace

DNS global ierarxik nom maydonidir.

www.example.uz

Har label parent domain ichida boshqariladi.

Root, top-level domain, domain va subdomain nom ownershipini taqsimlaydi.

Operating system namespace

Kernel obyektlari ham namespace orqali ajratilishi mumkin.

Masalan:

Container ichida process va interface hostdan boshqa nom va identifikator bilan ko‘rinadi.

Network namespace

Alohida network namespace o‘z:

to‘plamiga ega.

Ikki process bir xil TCP portni turli namespace’da ishlatishi mumkin.

PID namespace

Process container ichida PID 1, hostda boshqa PID bilan ko‘rinishi mumkin.

Nested namespace parentga child processlarni ko‘rsatadi, child esa parent processlarini ko‘rmasligi mumkin.

Namespace va security

Namespace isolation beradi, ammo har doim to‘liq security boundary emas.

Masalan, Linux namespace host kernelini bo‘lishadi.

Capability, cgroup, seccomp, LSM va filesystem permission bilan birga ishlatiladi.

Naming dizayni

Yaxshi namespace:

  • domainni ifodalaydi;
  • barqaror;
  • juda umumiy emas;
  • ichki organizational structure’ga haddan tashqari bog‘lanmaydi;
  • public APIga mos;
  • conflict ehtimolini kamaytiradi.

Company domainini teskari yozish ayrim ekotizimlarda global noyob prefix beradi.

Refactoring

Public namespace o‘zgarsa import va binary nomlar buzilishi mumkin.

Migration usullari:

  • alias;
  • forwarding type;
  • deprecated eski namespace;
  • re-export;
  • major version.

Reflection yoki serialized type nomi namespace’ni public data’ga aylantirishi mumkin.

Diagnostika

Namespace muammosida:

tekshiriladi.

“Nom topilmadi” symbol mavjud emasligi emas, qidiruv namespace’i noto‘g‘ri ekanini ham bildirishi mumkin.

Bog‘liq tushunchalar

Name resolution, Scope, Module, Package, Import, Qualified name, Symbol, PID namespace, Network namespace, DNS