Как назвать класс, который охватывает несколько примитивных типов? - PullRequest
1 голос
/ 07 июня 2011

У меня проблема с именами для некоторых из моих классов. Мне нужно обернуть некоторые примитивные типы .net в класс, как показано ниже. Таких классов будет около 20.

(Название, конечно, дерьмо. Просто для демонстрации)

public class Int32Single
{
    public int Value { get; set; }
}

public class Int32Double
{
    public int Value1 { get; set; }

    public int Value2 { get; set; }

}

public class DoubleSingle
{
    public double Value { get; set; }
}

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

Возможно также, что у меня есть класс, который содержит смешанные типы примитивов.

Ответы [ 4 ]

2 голосов
/ 07 июня 2011

Это совсем не очень хорошая идея. У вас есть и класс Tuple, и стандартный array, которые оба имеют больше смысла в любом возможном случае использования. Однако это не отвечает на ваш вопрос, так что ...

Наиболее интуитивное имя для класса-оболочки должно соответствовать соглашению {type-name}Wrapper или, например, Int32Wrapper. В вашем случае обернутый объект является примитивным типом, поэтому имеет смысл назвать класс "Tuple" . Поскольку вы хотите указать размер кортежа в имени класса, {primitive-type-name}{size}Tuple кажется наиболее интуитивным соглашением об именах, но это вызывает несколько проблем.

  • Естественный язык, используемый для описания кортежей, создает неоднозначность (например, Single и Double, потому что они конфликтуют с именами типов). (например, DoubleDouble плохо)
  • Целые числа используются в именовании некоторых примитивных типов, так что это может вызвать двусмысленность. (например, Int322Tuple плохо).

Мы не можем переместить размер в начало, например 2Int32Tuple, поскольку целые числа не являются допустимыми символами для начала имени класса. Итак, я думаю, что есть два подхода, которые могут сработать.

Я думаю, что ваш лучший способ обойти эти ограничения - использовать {primitive-type-name}{text-represented-size}Tuple соглашение. (например, Int32TwoTuple или DoubleTwoTuple). Это соглашение выражает содержимое класса-оболочки без двусмысленности, так что это кажется хорошим подходом. Кроме того, имя начинается с имени типа примитива, поэтому, если у вас много этих классов, вашему IntelliSense будет проще ввести правильное имя класса, и оно будет в алфавитном порядке перечисляться рядом с типом примитива, который быть завернутым.

1 голос
/ 07 июня 2011

Обобщения могут помочь вам здесь:

public class WrapTwo<T>
{
    public T Value1 { get; set; }
    public T Value2 { get; set; }
}

public class WrapOne<T>
{
    public T Value1 { get; set; }
}

А вы рассматривали Tuple класс ?

0 голосов
/ 08 июня 2011

Я не очень люблю Tuples или массивы, потому что оба мало рассказывают об их назначении.Ну, я их использую.Но в основном как внутренние члены классов, локальные переменные или сторонний / устаревший код.

Вернуться к именованию.Сравните:

Tuple<int,int> a = Tuple.Create(10,10);
Int32Double b = new Int32Double(15, 15);
WrapTwo<int> c = new WrapTwo<int>(20, 20);

с

Point a = new Point(10, 10);
Vertex b = new Vertex(15, 15);

Можно утверждать, что «a» не является хорошим именем для переменной (и вместо этого предложить использовать «pointA»).Но я думаю, что это очень хорошо в контексте применения геометрии.

Не только имя типа и код создания выглядят неясными, но и учитывают имена полей типов:

a.X = 20;
b.Value1 = 20;

Итак, я думаю, что вам нужно немногоинформативный тип в контексте домена вашего приложения.

0 голосов
/ 07 июня 2011

OneInt32, TwoInt32s, TwoDoubles? Звучит не очень хорошо.

кортежей? http://www.dotnetperls.com/tuple

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...