Qu'est-ce qu'une approche propre / intuitive pour l'extension d'une classe scellée dans .NET 1.1?

StackOverflow https://stackoverflow.com/questions/1046405

Question

Je suis en train de concevoir une bibliothèque qui sera utilisée dans plusieurs versions d'un produit. Une partie de son travail consiste à améliorer certaines fonctionnalités qui n'existent pas dans .NET 1.1, car nécessaire pour l'utiliser. Le meilleur exemple de ceci est probablement la méthode String.IsNullOrEmpty, sur laquelle nous nous appuyons assez lourdement sur la fonctionnalité.

La classe String dans .NET est scellée; J'ai envisagé d'utiliser les modèles Adapter ou Decorator pour étendre les fonctionnalités de la classe en enveloppant la chaîne d'origine, mais je ne suis pas convaincu qu'il s'agisse d'une approche très intuitive de ce que j'essaie de faire. J'ai également consulté un autre article sur StackOverflow sur une question similaire, mais il soulève à nouveau le problème que je viens de mentionner.

Je pourrais certainement utiliser Adapter pour créer la fonctionnalité que je cherchais, mais je ne peux pas imaginer le faire pour chaque chaîne:

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

Je ne déteste pas forcément cette approche, mais il semble que cela entraîne beaucoup de gestion de la mémoire, où une solution différente pourrait être meilleure. De plus, je ne suis pas folle de créer un & Quot; StringUtility & Quot; bibliothèque car cette approche m’éloigne de la conception orientée objet que j’aimerais suivre.

Toute entrée serait utile; si je suis juste fou et que je devrais utiliser l'une de ces approches, faites le moi savoir. Je recherche plus de bonnes pratiques qu'une solution, car j'en ai plusieurs.

Était-ce utile?

La solution

Je préférerais le " StringUtility " bibliothèque avec une méthode statique IsNullOrEmpty personnellement. En substance, vous créeriez des méthodes d'extension sans la syntaxe de choix leur.

Autres conseils

Par définition, il n’ya pas d’approche propre. Je pense que l’adaptateur est ce que vous pouvez faire de mieux dans .NET 1.1. Bien sûr, cela nécessitera que vous échangiez avec le monde extérieur.

Je suis d'accord avec Matthew sur le fait qu'il n'y a pas d'approche propre. Le modèle Decorator n'est pas applicable, car il repose sur l'héritage (ou, du moins, sur le polymorphisme) et vous ne pouvez pas Decorate System.String, car vous ne pouvez pas créer une classe ayant la même interface (car elle est scellée).

L’adaptateur est essentiellement utilisé pour adapter une interface à une autre. Ce n'est pas vraiment ce que vous voulez faire ici. Ce que vous semblez avoir à l’esprit, c’est un Wrapper, mais comme le fait remarquer Matthew, vous devrez beaucoup vous convertir.

Peut-être pourriez-vous nommer votre nouveau type " Text " et implémentez des conversions implicites vers et depuis une chaîne afin de minimiser le nombre de conversions que vous devrez écrire. Si vous choisissez cette route, assurez-vous de concevoir votre type comme un type immuable, car il s'agit du même comportement que les chaînes elles-mêmes.

Vous pouvez utiliser un opérateur implicite pour rendre les choses plus & "naturelles &":

.
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);
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top