Что такое чистый / интуитивно понятный подход к расширению закрытого класса в .NET 1.1? - PullRequest
2 голосов
/ 26 июня 2009

Я нахожусь в процессе разработки библиотеки, которая будет использоваться в нескольких выпусках продукта, и часть ее работы заключается в расширении некоторых функций, которых нет в .NET 1.1, поскольку мы требуется использовать его. Вероятно, лучшим примером этого является метод String.IsNullOrEmpty, функциональность которого мы полагаемся довольно сильно.

Класс String в .NET запечатан; Я думал об использовании шаблонов Adapter или Decorator для расширения функциональных возможностей класса путем переноса исходной строки, но я не уверен, что это очень интуитивный подход к тому, что я пытаюсь сделать. Я также посмотрел на другой пост в StackOverflow о похожем вопросе, но он снова поднимает проблему, которую я только что упомянул.

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

bool isEmpty = new StringExtensionAdapter(myXmlNode.SelectSingleNode(myXpathString)).IsNullOrEmpty();
if (isEmpty)
{
    // Do something
}

Мне не обязательно не нравится этот подход, но кажется, что он приводит к большому управлению памятью, где может быть лучше другое решение. Кроме того, я не в восторге от создания библиотеки «StringUtility», поскольку этот подход уводит меня еще дальше от объектно-ориентированного дизайна, которому я бы хотел следовать.

Любой вклад будет полезен; если я просто сумасшедший и должен использовать один из этих подходов, дайте мне знать. Я ищу больше лучших практик, чем решений, поскольку у меня их несколько.

Ответы [ 4 ]

3 голосов
/ 26 июня 2009

Я бы лично предпочел библиотеку "StringUtility" со статическим методом IsNullOrEmpty. По сути, вы будете создавать методы расширения без приятного синтаксиса для их вызова.

2 голосов
/ 26 июня 2009

По определению нет чистого подхода. Я думаю, что адаптерный подход - лучшее, что вы можете сделать в .NET 1.1. Конечно, это потребует от вас, чтобы иметь дело с внешним миром.

0 голосов
/ 26 июня 2009

Вы можете использовать неявный оператор, чтобы сделать вещи более "естественными":

public class SuperString
{
    public SuperString(string s) { S = s; }

    public static implicit operator SuperString(string s)
    {
        return new SuperString(s);
    }

    public string S { get; private set; }

    public bool IsNot() { return String.IsNullOrEmpty(S); }
}

[TestMethod]
public void Test_SuperString()
{
    SuperString ss = "wee";
    SuperString xx = "";
    if (xx.IsNot()) ss = "moo";
    System.Console.WriteLine(ss.S);
}
0 голосов
/ 26 июня 2009

Я согласен с Матфеем, что нет чистого подхода. Шаблон Decorator неприменим, поскольку он опирается на наследование (или, по крайней мере, полиморфизм), и вы не можете декорировать System.String, поскольку вы не можете создать класс с таким же интерфейсом (поскольку он запечатан).

Адаптер в основном используется для адаптации одного интерфейса к другому. Это не совсем то, что вы хотите сделать здесь. По сути, вы, похоже, имеете в виду Wrapper, но, как указывает Мэтью, вам придется много конвертировать туда и обратно.

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

...