Pergunta

Eu estou no processo de arquitetar uma biblioteca que será usado em vários lançamentos de um produto, e parte do seu trabalho é aumentar algumas das funcionalidades que não existe no .NET 1.1, já que estamos necessário para usá-lo. Provavelmente o melhor exemplo disso é o método String.IsNullOrEmpty, cuja funcionalidade contamos com bastante fortemente.

A classe String em .NET é selada; Eu pensei sobre usando os Adapter ou decorador para estender a funcionalidade da classe envolvendo a string original, mas eu não estou convencido de que esta é uma abordagem muito intuitiva para o que estou tentando fazer. Eu também olhou para outro post no StackOverflow sobre uma pergunta semelhante, mas mais uma vez levanta a questão que acabo de mencionar.

Eu definitivamente poderia usar adaptador para criar a funcionalidade que eu estou procurando, mas eu não posso imaginar fazendo isso para cada string:

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

Eu não necessariamente não gosta desta abordagem, mas parece que ele resulta em um monte de gerenciamento de memória em que uma solução diferente poderia ser melhor. Além disso, eu não sou louco sobre a criação de uma biblioteca "StringUtility", uma vez que a abordagem me leva mais longe do design orientado a objeto que eu gostaria de seguir.

Qualquer entrada seria útil; se eu sou apenas louco e deve usar uma dessas abordagens, me avise. Eu estou procurando mais por melhores práticas do que uma solução, pois tenho vários.

Foi útil?

Solução

Eu preferiria a biblioteca "StringUtility" com um método IsNullOrEmpty estática pessoalmente. Em essência, você estaria criando métodos de extensão sem a sintaxe agradável para chamar eles.

Outras dicas

Por definição, não há uma abordagem limpa. Eu acho que a abordagem adaptador é o melhor que você pode fazer em .NET 1.1. Claro, isso vai exigir que você ir e voltar ao lidar com o mundo exterior.

Eu concordo com Matthew que não há uma abordagem limpa. O padrão Decorator não é aplicável, uma vez que depende de herança (ou, pelo menos, polimorfismo), e você não pode decorar System.String, desde que você não pode criar uma classe que tem a mesma interface (uma vez que é selada).

adaptador é basicamente usado para adaptar uma interface para outra. Isso não é realmente o que você quer fazer aqui. Essencialmente, o que você parece ter em mente é um invólucro, mas como Matthew aponta, você terá que converter e para trás muito.

Talvez você poderia nomear seu novo "texto" tipo e implementar conversões implícitas para e de string para minimizar a quantidade de moldes você precisará escrever. Se você escolher esse caminho, certifique-se de que você projetar seu tipo como um tipo imutável, porque isso é o mesmo comportamento que os próprios strings.

Você pode usar um operador implícito para tornar as coisas mais "natural":

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);
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top