Соглашения об именах пространства имен C # и классов / подклассов, когда верхнее пространство имен содержит базовый класс, а внутренние пространства имен содержат подклассы - PullRequest
8 голосов
/ 19 августа 2009

Я пытаюсь спроектировать библиотеку классов для конкретного инженерного приложения и стараюсь, чтобы мои соглашения об именах классов и пространств имен имели смысл.

У меня следующая ситуация:

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 для ясности в коде, который использует эту библиотеку, corret?

Кажется избыточным иметь:

Vehicle.Car.CarWheel

или

Vehicle.Truck.TruckEngine

но я также хочу иметь очень описательные и конкретные имена классов.

С философской точки зрения я спрашиваю, стоит ли включать пространство имен как часть имени класса при рассмотрении вопроса о том, достаточно ли имя класса описательно.

Ответы [ 2 ]

20 голосов
/ 19 августа 2009

Обычно пространства имен являются множественными, чтобы не конфликтовать с именами классов (например, вероятно, вы захотите, чтобы классы имели имена Vehicle и Car), поэтому я бы склонен использовать пространства имен следующим образом:

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 и т. Д.), Которые могут стать болезненными, если они обычно используются вместе, и поэтому каждый файл, использующий их, должен будет импортировать все пространства имен, например

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

Если вы обнаружите, что этот же стек директив using находится вверху каждого файла, тогда сверните классы в единое пространство имен. Обычно вы включаете все связанные функциональные возможности, которые, как ожидается, будут использоваться вместе в одном пространстве имен, и используете только вложенные функциональные возможности, которые расширяют базовое пространство имен, но используются реже.

4 голосов
/ 19 августа 2009

Я бы попытался , чтобы избежать повторного использования имен в разных пространствах имен, особенно если клиент может захотеть использовать оба в одной и той же программе.

Вам действительно нужно пространство имен для Car, Truck и т. Д.? Все эти пространства имен звучат так, как будто они должны быть классами , чем пространства имен. Возможно, в вашей реальной ситуации это имеет больше смысла, хотя ...

...