Jaunais vilnis - paplašinājuma īpašības

Sveicināti atkal,

 

Pētot sarakstu ar iespējām, ko Microsoft izstrādātāji ir ieplānojuši izdarīt ar C# 4.0 un VB 10 versijām (tās beidzot varētu teikt, ka saņems vienādu feature-set), ieraudzīju vienu palaistu garām feature - Extension Properties. Piekrītu dažiem, ka paplašinājuma metodes (ieraksti - 1, 2) rada sava veida apjukumu un disorientāciju kodā, piekrītu arī citiem, kas tas paver plašas paplašinājuma iespējas savam un kādam citam kodam.

Tomēr šķiet, ka C# trešās versijas jaunievedums, kas deva paplašināt metodes, šķiet nedaudz nepabeigts bez paplašinājuma īpašībām, statiskajiem klases locekļiem vai pat paplašināmiem klases notikumiem.

Par cik man darbs ir sajūsmināties un iedegties par visām jaunajām iespējām un platformām un galvenais argumentēti un pārliecinoši to pasniegt priekšniecībai, jo tikai tādā veidā notiek kaut kāds progress nevis stagnācija tehnoloģiskajā jomā, tad nu šoreiz kārta ir programmēšanas paradigmai, kas bija ļoti populāra pāris dekādes atpakaļ - funkcionālajai programmēšanai. Šoreiz runa ir par .NET 4.0 jaunpienācēju - F#.

Nedaudz apgūstot F# pamatus sapratu, ka paplašinājuma īpšības nodefinēt tipam F# programmēšanas valodā ir tikpat vienkārši, kā nodefinēt jaunu tipa locekli (member).

Tātad, uzsākot mūsu mazo eksperimentu, mums ir jānodefinē vārdu telpa

 

namespace Int32Extensions

 

Pēc tam ir jādefinē pats tips (klase):

 

module Int32Extensions = 
    type System.Int32 with
        member this.DivFromTen
            with get() =
                10 - this

 

Šim jaunajam tipam jeb klasei ir jauns loceklis, kas definē jaunu īpašību (with get()) System.Int32 tipam jeb klasei. Konkrēti jaunā īpašība aprēķina "attālumu" līdz skaitlim 10.

Pozitīvi ir arī tas, ka jaunie definētie locekļi parādās arī bez problēmām gudrajā pārlūkotajā - IntelliSense.

 

 

Un lūk arī rezultāts augstāk minētajām 2 rindiņām:

 

>
val int : int

Div - 5

>

 

Jāpiemin, ka diemžēl šīs konstrukcijas nav pieejamas citās valodās, piemēram, C# :(

Būtu jau jauki, ja mēs varētu uzrakstīt kodu apmēram šādu:

 

var past = 2.Minutes.Ago;

 

 

 

Cerams, ka noderēs!

_____________________________

Published Friday, November 21, 2008 10:40 PM by valdis.iljuconoks

Comments

# re: Jaunais vilnis - paplašinājuma īpašības

F# ir spēcīga valoda. Bet kas attiecās uz šo konkrēto gadījumu, tad funkcionālām valodām trūks skaidrāka pieraksta. Tāds iztiept kods iznāk:) Bet ko var gribēt, valoda paredzēta tādiem stiprākiem IT pasaules pārstāvjiem:)

Saturday, November 22, 2008 1:06 PM by andrejs.mamontovs

# re: Jaunais vilnis - paplašinājuma īpašības

iztiepts kods sanāk tāpēc, ka F# ir identation-based pieraksts, tb tas kas ir zem un `indentēts' dziļāk ir attiecināms uz attiecīgo objektu, klase, tipu, etc.

F# nav kā CL -> ka explicity kods ir arī dati :)

piemēram:

(defun test (x y z)

 (statement-1)

 (statement-2))

ir vienlīdzīgs ar:

(defun test (x y z)(statement-1)(statement-2))

Saturday, November 22, 2008 3:57 PM by valdis.iljuconoks

# re: Jaunais vilnis - paplašinājuma īpašības

Jā Valdi, to es zinu! Bet pie tā ir jāpierod:)

Saturday, November 22, 2008 7:05 PM by andrejs.mamontovs

# re: Jaunais vilnis - paplašinājuma īpašības

Man gan nešķiet komfortabli rakstīt kodu, kura loģika daļēji ir balstīta uz indentāciju.

Ja apskatam paplašinājuma īpašības, tad ir vairāki jautājumi:

1) Vai var definēt tikai "read-only" īpašības, vai arī ir iespēja definēt "set" loģiku?

2) Gadījumā, ja īpašības ir "read-only", tad āds ir būtisks ieguvums salīdzinot ar paplašinājuma metodēm (neskaitot "smukāk izskatās")?

Tagad drīkstat mani apsaukāt par stagnātu!

Sunday, November 23, 2008 9:02 AM by ivars.arins

# re: Jaunais vilnis - paplašinājuma īpašības

identācijas balstīts kods - tāda nu ir F# pagaidu īpašība. man personīgi arī tas nešķiet pievilcīgi :)

1) funkcionālajā programmēšanā daudzās valodās ir nemainības likums jau pēc būtības (by default). tas nozīmē, ka reiz tu 5 vertībai esi piešķīris nosaukumu (let x = 5) tad x nav maināms dotajā leksikoloģiskajā ietvarā (scope).

2) jā var definēt protams arī `set' bet jautājums ko tu mainīsi? :) F# ir tas iespējams

3) kāda ir atšķirība? nekāda. gala rezultātā tu anyway izpildi kaut kādu kodu :) tas ir filozofisks jautājums... Java izlīdzējās tikai ar metodēm :) un daudzi engine (piemēram, spring) uzsakta, ka, ja konfigurācijā ir teikts:

<bean id= class=>

 <property name='property'/>

</bean>

tad spring freimworks meklēs setProperty(property) metodi :)

tā kā, īstenībā jau tas vien syntax sugar ir, ja paskatās propertija IL kodu...

Sunday, November 23, 2008 3:58 PM by valdis.iljuconoks

Leave a Comment

(obligāts) 
(obligāts) 
(brīvizvēles)
(obligāts)