Ilgu laiku mums nācies programmēt valodās, kurās pozicionālie argumenti jeb vērtības metodei tika nodotas atkarībā no pozīcijas. Jaunajā C# valodā šīs problēmas tiks atrisinātas, citās valodās laikam saglabāsies vēl ilgāku laiku - sākas ar "JA" un beidzas ar "VA" :)
Protams, ka pozicionālie argumenti metodēm rada nelielas galvas sāpes šo metožu radītājiem, kas kopsummā padara kodu repetatīvu un grūtāk uztveramu.
Tā kā mēģinu lēnām kustēties līdzi galvenajai straumei (next wave mainstream) un interesējos intensīvāk par funkcionālās programmēšanas iespējām .Net platformā, tad šoreiz gribēju padalīties nedaudz ar informāciju, kā nosauktos un neobligātie argumenti ir realizēti F# programmēšanas valodā.
Pieņemsim, ka ir sekojošas klases:
type Address(st :string) =
member a.Street = st
type Client(code :string, address :Address) =
member c.Code = code
member c.Address = addr
Klases nav pārāk sarežģītas - adrese un klients.
Konstruēt jaunas instances šādam klientam ir ļoti vienkārši:
> Client ("1123456-12345", Address ("Brivibas"));;
val it : Client = FSI_0004+Client {Address = FSI_0003+Address;
Code = "1123456-12345";}
Ideāli būtu ja varētu šai klasei ieviest neobligātos parametrus, ja nu pēkšņi kādam ievajagās klientu ar noklusēto adresi, kas gan diezvai kādam būs noderīgs :)
Lai ieviestu klienta klases konstruktoram neobligātos parametrus (un patiesībā arī nosauktos parametrus), ir nepieciešams tipa definīcijas parametros ieviest "?" simbolu, kas pazīmē, ka parametru var arī nenorādīt tipa konstruēšanas laikā.
Jaunais tips izskatās šāds
type Address(st :string) =
member a.Street = st
type Client(?code :string, ?address :Address) =
let code = defaultArg code ""
let addr = match address with
| None -> new Address("")
| Some a -> a
member c.Code = code
member c.Address = addr
Tātad par veiktajām izmaiņām visu pēc kārtas:
- Pirms parametra nosaukuma tika pievienots "?" simbols, kas definē, ka parametrs ir neobligāts.
- Tipā tika ieviesti divi papildus mainīgie parametru vērtību aprēķināšai.
- Funkcija defaultArg dod iespēju pārbaudīt un piešķirt vērtību kādam mainīgajam, ja parametrs netika norādīts (kaut kas līdzīgs var i = (p != null ? p : -1)). Šī funkcija darbojas tikai uz vienkāršajiem tipiem.
- Otrs parametrs, kas ir kompleksais (cits tips - Address) tipa ķermenī tiek reprezentēts kā option, kura vērtība var iegūst pielietojot pattern matching ideoloģiju F# programmēšanas valodā (par šo veidu noteikti pastāstīšu kādā no nākamajām reizēm).
Tātad izveidojām tipu ar neobligātajiem parametriem, kura definīcija ir sekojoša:
type Client =
class
new : ?code:string * ?address:Address -> Client
member Address : Address
member Code : string
end
Kā redzams, tad jauna tipa izveide ir iespējama ar neobligātajiem parametriem, kuri tipā tiek reprezentēti kā ?address:Address, kas nozīmē, ka parametrs ir option tipa.
Jaunu instanci izveidot ir pavisam vienkārši:
> Client();;
val it : Client = FSI_0006+Client {Address = FSI_0003+Address;
Code = "";}
Šajā gadījumā noklusēto vērtību iegūst abi argumenti.
> Client(address = Address("Brivibas"), code = "123456-12345");;
val it : Client = FSI_0006+Client {Address = FSI_0003+Address;
Code = "123456-12345";}
Kā redzams, tad neobligāto pparametru nodošanas pieraksts ir stipri līdzīgs, kādu mēs sagaidām no jaunās C# valodas versijas. Jauki redzēt, ka šī iespēja ir iestrādāta F# OO sadaļā jau no paša sākuma.
Centīšos cik vien laiks atļauj mēģinām lēnām iepazīstināt Jūs ar šīs valodas konstrukcijām un iespējām. Tā tak nevar būt, ka Microsoft kļūdās, par nākamās paaudzes un nākamā viļņa tehnoloģijām un rīkiem, ko pēc pāris gadiem visi izmantos un visiem darba devējiem būs aktuāli (ja vien nebūsim jau ekonomiskās krīzes nobeigti...)
Cerams, ka noderēs!