Labdien,
Šoreiz iemūžināšu vienu koda gabalu, kas var būt visai noderīgs Web izstrādātājiem. Lieta tāda, ka ikdienā bieži nododam argumentus izmantojot URL. Piemēram: “list.aspx?status=Enabled”.
Lapas apstrādes kodā parasti var atrasts ko līdzīgu uz šo te piemēru:
var status = Request["status"] ?? "Disabled";
switch(status)
{
case "Enabled":
// Code;
break;
case "Disabled":
// Code
break;
}
Tāds īsts PHP variants. Ir visai liela varbūtība pieļaut kļūdu. Vai nav daudz OOP draudzīgāks variants?
Šinī gadījumā var labi noderēt Enum tips. Izveidojam pārskaitījumu ar nosaukumu Status.
public enum Status
{
Disabled,
Enabled
}
Pārveidojam jau iepriekš apskatīto kodu, lai pārveidotu tekstu par konkrētāku Enum tipu.
var status = (Status)Enum.Parse(
typeof(Status), Request["status"] ?? "0");
switch(status)
{
case Status.Enabled:
// Code;
break;
case Status.Disabled:
// Code
break;
}
Tagad kods ir daudz kontrolējamāks, pārbaudes veicam ar pārskaitījuma vērtībām. Jāatzīmē, ka abos gadījumos, kodā vel būtu jāveic dažas papildus pārbaudes. Kas tur tāds, principā jau nav lielas atšķirības abās realizācijās. Daļēji tā arī ir. Bet gadījumā ar pārskaitījumiem, mēs šo te funkcionalitāte varam padarīt par universālāku izmantojot Generic iespējas. Izveidosim jaunu palīg klasi.
public static class Enum<T>
{
public static T Parse(string value)
{
Type t = typeof (T);
if (!t.IsEnum)
{
throw new ArgumentException(
String.Format("{0} is not an Enum", t.Name));
}
string s = value ?? "";
if (Enum.IsDefined(t, s))
{
return (T) Enum.Parse(t, s);
}
return default(T);
}
}
Tagad mums pavērās iespēja izmantot šādu te funkcionalitāti visur, kur mēs apstrādājam argumentus. Vēlreiz pārveidojam mūsu piemēru.
var status =
Enum<Status>.Parse(Request["status"]);
switch(status)
{
case Status.Enabled:
// Code;
break;
case Status.Disabled:
// Code
break;
}
Tagad kods ir maksimāli drošs lietošana. Protams pēc vajadzības klasi Enum<T> vel var papildināt ar funkcionalitāti, bet tas jau pēc vajadzības. Galvenais mans uzdevums novirzīt domāšanu pareizā virzienā:)
Cerams noderēs!
Posted
Mar 10 2010, 07:11 PM
by
andrejs.mamontovs