Существует множество случаев, когда у вас есть интерфейс, который принимает аргументы аналогичного типа, которые имеют отдельный логический смысл домена:
public static class Database
{
public static bool HasAccess(string userId, string documentId) { return true; }
}
Теперь довольно просто иметь какой-либо ключевой documentId вместо userId и наоборот. Это можно предотвратить, абстрагировав тип данных аргументов:
public class UserId
{
public string Value { get; internal set; }
public static implicit operator string(UserId id) { return id.Value; }
}
public class DocumentId
{
public string Value { get; internal set; }
public static implicit operator string(DocumentId id) { return id.Value; }
}
public static class Database
{
public static bool HasAccess(UserId userId, DocumentId documentId) { return true; }
}
Таким образом, вы получаете хорошее предупреждение компилятора, если вводите аргументы не по порядку:
UserId e = new UserId() { Value = "a" };
DocumentId d = new DocumentId() { Value = "b" };
Database.HasAccess(d, e);
Вы также получаете возможность изменять абстрактный тип, не затрагивая остальную часть системы, но это не очень вероятно. Будет ли абстрагирование типа хорошей идеей для обеспечения большей безопасности типов?
Вопрос относится к решениям на C #, но приветствуются короткие описания на других языках.
РЕДАКТИРОВАТЬ: Убрал неявное приведение из строки и указывая пальцем на тег C #.