簡體   English   中英

當頂級命名空間包含基類和內部命名空間時,C#命名空間和類/子類命名約定包含子類

[英]The C# namespace and class/sub-class naming conventions when the top namespace contains the base class and inner namespaces contain sub-classes

我正在嘗試為特定的工程應用程序設計一個類庫,我正在努力確保我的類和命名空間命名約定有意義。

我有以下情況:

namespace Vehicle{

    class Wheel{...} //base class for Wheel objects
    class Engine{...} //base class for Engine objects
    ...
    namespace Truck{ 
        class Wheel: Vehicle.Wheel{...} //Truck specific Wheel object
        class Engine: Vehicle.Engine{...} //Truck specific Engine object
        ...
    }

    namespace Car{ 
        class Wheel: Vehicle.Wheel{...} //Car specific Wheel object
        class Engine: Vehicle.Engine{...} //Car specific Engine object
        ...
    }
    ...
}

代碼的使用方式是需要在同一范圍內引用所有這些類。 可能存在以下情況:

...
Vehicle.Wheel.DoSomething();
Vehicle.Truck.Wheel.DoSomething();
Vehicle.Car.Wheel.DoSomething();
...

在這種情況下,我最好給這些課程更具體的名字

namespace Car{
    class CarWheel: Vehicle.Wheel{...} //Car specific Wheel object
    ...
}

或保留第一個示例中所示的命名,並依賴於命名空間中編碼的信息以便清楚起見? 在后一種方法下,我假設我想在使用這個庫的代碼中明確地使用alaising,對嗎?

擁有以下內容似乎更令人不滿:

Vehicle.Car.CarWheel

要么

Vehicle.Truck.TruckEngine

但我也希望有非常具有描述性和特定性的類名。

從哲學上講,我在問的是,在考慮類名是否足夠描述時,是否將名稱空間作為類名的一部分。

通常,名稱空間是多元化的,以免與類名沖突(例如,您可能需要名為VehicleCar類),因此我傾向於使用名稱空間,如下所示:

namespace Vehicles;
namespace Vehicles.Cars;
namespace Vehicles.Trucks;

至於類的名稱,通常在類名前加上特化,特別是如果它們可能一起使用,那么你最終會得到類似的東西:

class CarWheel : Wheel
class TruckWheel : Wheel

您可以在.NET Framework中的任何位置看到這種類型的“冗余”,例如在System.Xml命名空間中,幾乎所有類都以Xml為前綴,或者在System.Data.SqlClient命名空間中,大多數類都以Sql為前綴。 這意味着您可以using指令導入名稱空間,然后不必在整個代碼中對類名稱進行完全限定,例如,以下哪個更具可讀性?

Vehicles.Cars.Wheel wheel = new Vehicles.Cars.Wheel();

要么

CarWheel wheel = new CarWheel();

兩者都做得很明顯,但第二個要短得多。


請注意,如果您在名稱中包含特化,那么您可能會發現您不需要所有嵌套的命名空間( .Cars.Trucks等),如果它們通常一起使用會變.Trucks痛苦,所以每個使用它們的文件必須導入所有名稱空間,例如

using Vehicles;
using Vehicles.Cars;
using Vehicles.Trucks;
using Vehicles.SomethingElse;
using Vehicles.YetAnotherThing;

如果您發現同一堆using指令位於每個文件的頂部,則將這些類折疊為單個命名空間。 您通常包括預期在單個命名空間中一起使用的所有相關功能,並且僅將嵌套的功能用於擴展基本命名空間但不常使用的功能。

我會盡量避免在不同的命名空間中重用名稱,特別是如果客戶端可能想要在同一個程序中使用這兩個名稱。

你真的需要CarTruck等命名空間嗎? 所有這些命名空間聽起來更像是應該是類而不是命名空間。 也許在你的真實情況下,它更有意義......

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM