2015-01-24 2 views
0

Пожалуйста, рассмотрите мой прецедент: Я разрабатываю программную систему, в которой есть уникально идентифицированные «элементы» разных типов (пользователи, документы, билеты и т. Д.).Скрытие реализации типов значений в .NET/C#

Я начал реализацию, и, хотя я хотел бы двигаться вперед с реализацией, я не совсем уверен, что будет самым подходящим уникальным идентификатором «элементов». Это может быть автоматически увеличиваемое целое число, GUID, строка, содержащая префикс + время создания и т. Д.

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

Мой вопрос в том, есть ли механизм .NET для typedef -имя типов значений, поэтому я могу изменить тип «real» и специфичные для типа функции в (например, используя методы расширения) и не беспокоиться о десятках других случаев в коде.

+0

C# не имеет эквивалента 'typedef ', слабого или сильного. Не совсем понятно, что вы пытаетесь сделать - если вы можете привести пример псевдокода, это может помочь предложить альтернативы. –

+0

Звучит как проблема, с которой [Strategy Pattern] (https://en.wikipedia.org/wiki/Strategy_pattern) был разработан для решения. –

+0

@Cory: извините, неясно. Рассмотрим множество классов с идентификатором свойства типа UniqueIdentifier, который на самом деле является GUID (например). В каждом конструкторе такого класса я бы добавил Id = UniqueIdentifier.Generate(); (возможно, метод расширения). Класс не должен знать, как Id реализован или сгенерирован, и я могу изменить реализацию UniqueIdentifier без изменения кода классов. – ury

ответ

1

Нет, нет. Не глобально. Однако вы можете сделать базовый класс, как:

public class BaseEntity 
{ 
    public int Id { get; set; } 
} 

Затем вывести все объекты оттуда:

public class MyItem : BaseEntity 
{ 
} 

Тогда вы только изменить тип в одном месте.

Вы можете создать псевдоним для типа, но вы должны определить его на каждом модуле, не может быть сделано во всем мире:

using MyIdType = System.Int32; 

Документация для сглаживания является here

Это говорит: я не думайте, что это хорошая практика, чтобы изменить подобные вещи ... подумайте дважды, код один раз.

+0

он говорил типы значений :) –

+0

@CoryNelson Я думал, что он имел в виду тип значения, которым является идентификатор, а не классы ... – Jcl

+0

Правильно, тип значения относится к уникальному идентификатору. В настоящее время я использую aliasing, но это не одноточечное решение, которое я ищу. @Jcl, даже если я думаю, что все это произошло и выберете GUID (например), все равно будет «чище» определять тип UniqueIdentifier и расширять его, а не расширять все GUID (или все строки!) – ury

1

Что относительно Наследование?

public class UniqueIdentifiedObject 
{ 
    public Guid Id { get; set; } 
} 

public class User : UniqueIdentifiedObject 
{ 
    // You don't need to stupidly repeat yourself (DRY) 
} 

Если вы не можете использовать наследование, потому что вы уже получены эти классы от того, кто знает, что другой класс ... Затем вы можете использовать дженерики:

public class User<TId> where TId : IEquatable<TId> 
{ 
    public TId Id { get; set; } 
} 

public class Employee<TId> where TId : IEquatable<TId> 
{ 
    public TId Id { get; set; } 
} 

Это означает, что вы будет должен предоставить тип всего уникального идентификатора во время вашего класса конкретизации:

Employee<Guid> employee = new Employee<Guid>(); 

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

Во всяком случае, массивные найти & замену с использованием регулярных выражений, как (?:User|Employee|Boss|Document)<([A-Za-z0-9-_]+)> или что-то такого было бы достаточно, чтобы изменить тип уникального идентификатора для каждого класса домена в вашем проекте!).