Pregunta

Estoy en el proceso de diseñar una biblioteca que se utilizará en varias versiones de un producto, y parte de su trabajo es aumentar algunas de las funciones que no existen en .NET 1.1, ya que estamos requerido para usarlo. Probablemente el mejor ejemplo de esto es el método String.IsNullOrEmpty, en cuya funcionalidad confiamos bastante.

La clase String en .NET está sellada; He pensado en usar los patrones Adaptador o Decorador para extender la funcionalidad de la clase envolviendo la cadena original, pero no estoy convencido de que este sea un enfoque muy intuitivo para lo que estoy tratando de hacer. También he visto otra publicación en StackOverflow sobre una pregunta similar, pero nuevamente plantea el problema que acabo de mencionar.

Definitivamente podría usar el Adaptador para crear la funcionalidad que estoy buscando, pero no puedo imaginar hacer esto para cada cadena:

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

No necesariamente no me gusta este enfoque, pero parece que resulta en una gran cantidad de administración de memoria donde una solución diferente podría ser mejor. Además, no estoy loco por crear un & Quot; StringUtility & Quot; biblioteca ya que ese enfoque me lleva más lejos del diseño orientado a objetos que me gustaría seguir.

Cualquier entrada sería útil; si estoy loco y debería usar uno de estos enfoques, avíseme. Estoy buscando más prácticas recomendadas que una solución, ya que tengo varias.

¿Fue útil?

Solución

Preferiría la " StringUtility " biblioteca con un método estático IsNullOrEmpty personalmente. En esencia, estaría creando métodos de extensión sin la buena sintaxis para llamar ellos.

Otros consejos

Por definición, no hay un enfoque limpio. Creo que el enfoque del adaptador es lo mejor que puede hacer en .NET 1.1. Por supuesto, esto requerirá que vayas de un lado a otro cuando trates con el mundo exterior.

Estoy de acuerdo con Matthew en que no hay un enfoque limpio. El patrón Decorador no es aplicable, ya que se basa en la herencia (o, al menos, el polimorfismo), y no puede Decorar System.String, ya que no puede crear una clase que tenga la misma interfaz (ya que está sellada).

El adaptador se usa básicamente para adaptar una interfaz a otra. Eso no es realmente lo que quieres hacer aquí. Esencialmente, lo que parece tener en mente es un Wrapper, pero como señala Matthew, tendrá que realizar muchas conversiones.

Quizás podría nombrar su nuevo tipo " Texto " e implementar conversiones implícitas hacia y desde una cadena para minimizar la cantidad de conversiones que necesitará escribir. Si elige esa ruta, asegúrese de diseñar su tipo como un tipo inmutable, porque ese es el mismo comportamiento que las cadenas mismas.

Puede usar un operador implícito para hacer las cosas más " 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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top