Vra

Ek is in die proses van architecting'n biblioteek wat gebruik sal word in verskeie uitgawes van'n produk, en deel van sy werk is om te vul'n paar van die funksies wat nie bestaan in .NETTO 1.1, aangesien ons vereis om dit te gebruik.Waarskynlik die beste voorbeeld van hierdie is die String.IsNullOrEmpty metode, wie se funksionaliteit ons staatmaak op redelik swaar.

Die String klas in .NETTO verseël is;Ek het gedink oor die gebruik van óf die Adapter of Versierder patrone te brei na die funksionaliteit van die klas deur die wikkel die oorspronklike string, maar ek is nie oortuig dat dit is'n baie intuïtiewe benadering vir wat ek probeer doen.Ek het ook gekyk na nog'n post op StackOverflow oor'n soortgelyke vraag nie, maar dit bring weer die probleem wat ek nou net genoem het.

Ek kan beslis gebruik Adapter te skep om die funksionaliteit ek is op soek na, maar ek kan nie dink om dit te doen vir elke string:

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

Ek hoef nie noodwendig hou nie van hierdie benadering, maar dit lyk soos dit resultate in'n baie van die geheue bestuur waar'n ander oplossing dalk beter wees.Ook, ek is nie mal oor die skep van'n "StringUtility" biblioteek sedert daardie benadering neem my verder weg van die voorwerp-georiënteerde ontwerp ek wil graag om te volg.

Enige insette sou nuttig wees;as ek net mal en moet gebruik maak van een van hierdie benaderings, laat my weet.Ek is op soek meer vir beste praktyke as'n oplossing, want ek het'n paar.

Was dit nuttig?

Oplossing

Ek sou verkies om die "StringUtility" biblioteek met 'n statiese IsNullOrEmpty metode persoonlik. In wese is jy sal skep uitbreiding metodes sonder die mooi sintaksis vir 'n beroep hulle.

Ander wenke

Per definisie, daar is geen skoon benadering. Ek dink die adapter benadering is die beste wat jy kan doen in NET 1.1. Natuurlik sal dit wat jy nodig het om heen en weer te gaan wanneer jy met die res van die wêreld.

Ek stem saam met Matthew dat daar geen skoon benadering. Die Decorator patroon is nie van toepassing, aangesien dit berus op erfenis (of, ten minste, polimorfisme), en jy kan nie Versier System.String, aangesien jy 'n klas wat dieselfde koppelvlak het nie kan skep (aangesien dit verseël).

Adapter is basies gebruik word om 'n koppelvlak na 'n ander Pas. Dit is nie regtig wat jy wil hê om hier te doen. In wese, wat jy lyk om in gedagte te hê is 'n wrapper, maar as Matthew uitwys, sal jy het om terug te sit en weer 'n lot.

Miskien kan jy die naam van jou nuwe tipe "teks" en implementeer implisiete doelskoppe en na string om die bedrag van gooi jy sal nodig hê om te skryf die minimum te beperk. As jy daardie roete kies, maak seker dat jy jou tipe ontwerp as 'n onveranderlike tipe, want dit is dieselfde gedrag as hulself snare.

Jy kan 'n implisiete operateur gebruik om dinge te maak meer "natuurlike":

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);
}
Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top