命名空間,有效範圍介紹

我被程式碼海扁 @codebeatme
閱讀 5:16·字數 1581·發佈 

命名空間

命名空間是一種識別碼的管理方案,這些識別碼被用於任何可能的實體,比如,變數,函式,類別等。同一識別碼在不同的命名空間中,其指向的目標和表示的含義是互不幹擾的。

為何需要命名空間?
大型專案會用到眾多的變數,函式等實體,當他們的含義接近時,采用相同的識別碼將是合理的,而命名空間可以消除相同識別碼之間的沖突。

巢狀命名空間

命名空間可以呈現為一種巢狀或樹狀結構,一個命名空間可被包含在另一個命名空間中,並具有自己的識別碼。

什麽是完整名稱?
在巢狀命名空間中,完整名稱是指一個識別碼從根命名空間開始計算的路徑,由於他是完整的,因此只要給出完整名稱,就可以定位到相關的識別碼,無論目前所處的命名空間是哪一個。

什麽是巢狀型別?
如果在某個型別所在的命名空間中定義另一個型別,那麽被定義的型別就是巢狀型別。

在下面的 C# 程式碼中,列舉FlowerColor是巢狀型別,他被定義在類別Flower中。

namespaces_and_scope.cs
// 類別 Flower,表示一朵花
class Flower
{
	// 巢狀型別 Color
	enum Color
	{
		// 沒有色彩
		None = 0,
		// 紅色
		Red = 1,
		// 白色
		White = 2,
		// 藍色
		Blue = 3,
	}

// 欄位 Color,表示花的色彩,隨機產生 private Color color = (Color)new Random().Next(1, 4); // … }

明確命名空間

要定義明確命名空間,一般需要使用特定的關鍵字,並給出命名空間的完整名稱,或相對於目前命名空間的路徑,名稱。

在下面的 C# 程式碼中,我們明確定義了命名空間World.Animals,他包含了類別Lion

namespaces_and_scope.cs
// 命名空間 World.Animals
namespace World.Animals
{
	// 類別 Lion,表示獅子
	class Lion { }
}

隱含命名空間

隱含命名空間的定義一般由語言自動完成,通常會依據程式碼檔案的名稱和路徑,或某些實體來建置。常見的一種情況是函式,每個函式都擁有自己的命名空間,因此你可以在函式內定義與函式外變數同名的變數。

模組,套件

模組和套件都具有命名空間的效果,他們可以用於區別功能不同的程式碼。一般情況下,模組是比套件更小的單位,但一些語言可能會做出相反的處理。模組通常會包含變數,函式,類別等實體,而套件通常是多個模組的集合。在使用模組或套件之前,需要進行相應的匯入操作。

下面的 Node.js 模組stat,包含了統計學校總人數的函式getPeopleCount,以及表示學生和教師數量的變數studentCountteacherCount

school/stat.js
// 模組 stat
// 學生的數量
exports.studentCount
// 教師的數量
exports.teacherCount

// 統計學校內的總人數 exports.getPeopleCount = function () { return exports.studentCount + exports.teacherCount }

在匯入模組stat後,我們使用了相關的變數和函式。

namespaces_and_scope.js
// 匯入模組 stat
const stat = require('./school/stat')

// 設定學校人數 stat.studentCount = 100 stat.teacherCount = 10
// 呼叫模組的 getPeopleCount 函式,取得學校內的總人數 console.log(`學校內的總人數為:${stat.getPeopleCount()}`)
學校內的總人數為:110

有效範圍

有效範圍是指識別碼的有效作用範圍,在該範圍內,識別碼是可以被識別的。在命名空間系統中,一個識別碼的有效範圍不僅限於其所在的命名空間,還包括包含在該命名空間中的命名空間。在這樣的規則下,根命名空間中的識別碼具有全域效果,可以被其他命名空間識別,比如,全域變數,全域函式。

當某個識別碼在目前命名空間中不存在時,一般會在樹狀結構中逐步向根命名空間搜尋,直到該識別碼在某個命名空間中被找到,或以類似於“未定義”的警告結束。

下面的 C# 函式sum會進行加法計算,計算結果被儲存至函式外的total變數。

*.cs
// 變數 total,用於儲存計算結果
int total = 0;
// 函式 sum,進行加法計算
void sum(int num)
{
	// 函式內可以存取函式外的變數 total
	total += num;
}

// 呼叫 sum sum(7); sum(9); Console.WriteLine($"結果為:{total}");
結果為:16

程式碼

namespaces_and_scope.cs·codebeatme/programming·GitHub
school/stat.js·codebeatme/programming·GitHub
namespaces_and_scope.js·codebeatme/programming·GitHub