Class.Class vs Namespace.Class для библиотек классов общего пользования верхнего уровня? - PullRequest
4 голосов
/ 15 марта 2010

Какой из них более приемлем (лучшая практика)?:

namespace NP
   public static class IO
   public static class Xml
   ...
   // extension methods

using NP;

IO.GetAvailableResources ();

против

public static class NP
   public static class IO
   public static class Xml
   ...
   // extension methods

NP.IO.GetAvailableResources ();

Также для #2 размер кода определяется наличием частичных классов, поэтому каждый вложенный класс может находиться в отдельном файле, то же самое для методов расширения (за исключением того, что для них нет вложенного класса)

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

Какой из них вы предпочитаете? Есть плюсы и минусы для каждого? Какова лучшая практика для этого случая?

РЕДАКТИРОВАТЬ: Также будет ли разница в производительности между двумя?

Ответы [ 7 ]

3 голосов
/ 15 марта 2010

Я бы сказал # 1. Потому что, когда вы объединяете множество классов в один статический класс, вы делаете то же самое, что и пространство имен. Вот почему я бы сказал, что лучше всего, чтобы пространства имен сделали это для вас.

В этом случае вы также можете избавиться от необходимости писать «NP» перед всем, добавив использование, если хотите. Я думаю, что вы должны либо вкладывать свои пространства имен, чтобы они не сталкивались, либо использовать больше описывающих имен пространств имен, чем IO.

Чаще всего лучшим вариантом является то, что делает Microsoft, и я никогда не видел, чтобы они делали # 2

2 голосов
/ 15 марта 2010

Я предпочитаю # 1, потому что это не требует, чтобы я звонил через 1 класс, чтобы добраться до другого. Я думаю, что это немного сбивает с толку, потому что в целом объекты должны иметь классы-члены, методы и тому подобное, которые имеют дело непосредственно с объектами, созданными путем создания экземпляра класса. Это означает, что вы не следуете принципам ООП. Microsoft также говорит, что № 1 - лучшая практика.

1 голос
/ 15 марта 2010

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

Кроме того, когда вы делаете более сложные вещи, такие как рефлексия или что-то вроде модели провайдера, наличие вложенных классов в качестве фактического раздела провайдера или цели, которую вы пытаетесь достичь, становится проблематичным.

Наконец, тестирование вложенных классов и интерфейсов усложняет тестирование.

1 голос
/ 15 марта 2010

Суть пространств имен в том, что они используются для организации вашего кода :

Пространства имен интенсивно используются в программах на C # двумя способами. Во-первых, классы .NET Framework используют пространства имен для организации множества классов. Во-вторых, объявление ваших собственных пространств имен может помочь контролировать область имен классов и методов в более крупных проектах программирования.

Когда вы посмотрите на саму платформу .NET, вы увидите, что практически все структурировано, как ваш первый пример (пространства имен), и практически ничего не структурировано, как ваш второй пример (вложенные типы). Редкие случаи, когда используются вложенные типы, - это когда они настолько тесно связаны с внешним типом, что по существу являются его частью, но должны быть отдельным классом по причинам, таким как повторное использование кода.

Таким образом, если под «наилучшей практикой» вы подразумеваете «использование вещей для целей, для которых они были разработаны», «больше всего похоже на .NET framework» и «наиболее близко соответствующих парадигмам проектирования .NET», то никакого конкурса нет; использовать пространства имен для организации, а не для вложенных типов.

Относительно вашего редактирования - нет, в реальном мире не будет разницы в производительности.

1 голос
/ 15 марта 2010

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

0 голосов
/ 18 февраля 2014

Иногда я на самом деле использую # 2. Я пойму почему после следующей строки. Но в вашем случае с пустыми статическими классами пространства имен более идеальны, потому что для этого они и нужны.

Однако, если у вас есть сценарий использования, когда вы производите новые классы, иногда может иметь смысл вложить эти производные классы.

Например, вы могли бы иметь:

public abstract class Vehicle
{
    int NumberOfWheels;
}

public class SportsCar : Vehicle
{
}

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

Вместо этого, их вложение дает вам все преимущества:

public abstract class Vehicle
{
    int NumberOfWheels;

    public class SportsCar : Vehicle
    {
    }
}
0 голосов
/ 15 марта 2010

Я думаю, вам следует избегать открытых (публичных) вложенных классов и интерфейсов, или, по крайней мере, так сказал бы Microsoft FxCop. Таким образом, первый лучше.

Редактировать: (да, изменил на первый, я не должен отвечать в SO, когда я очень устал)

...