Start  |  Gry  |  Słowniki *  
 : : Menu
Dla początkujących
Dla praktyków
Język
Wersje
Książki
Smalltalk vs. Java
Wiadomości
Linki
FAQ
Pobierz
Co nowego?
Mapa serwisu
Kontakt
Impressum
Księga gości
Po godzinach
Nakarm głodne dziecko - wejdź na stronę www.Pajacyk.pl
 

Wywoływanie wyjścia z metody wewnątrz bloku

Wywoływanie wyjścia z metody wewnątrz bloku spowalnia znacznie wykonanie metody, ponieważ maszyna wirtualna musi najpierw znaleźć właściwy kontekst.

Tak więc zamiast pisać:

value := myDictionary at: #myKey ifAbsent: [^self].

lepiej jest napisać:

value := myDictionary at: #myKey ifAbsent: [nil].
value isNil ifTrue: [^self].

lub zamiast:

value := myCollection detect: [:each | each = myObject ] ifNone: [^self].

lepiej jest:

value := myCollection detect: [:each | each = myObject ] ifNone: [nil].
value isNil ifTrue: [^self].

Stosowanie drugiego sposobu kodowania przynosi praktyczne, wymierne korzyści, jeżeli dany kod jest wywoływany dostatecznie często, a więc podczas wielokrotnego przeszukiwania kolekcji przy założeniu, że element szukany w większości przypadków nie występuje w tej kolekcji.

Dobrym nawykiem jest jednak stosowanie drugiego z przedstawionych tutaj sposobów kodowania w każdej metodzie - pozwala to utrzymać jednolity standard w całej aplikacji i zwalnia programistę od zastanawiania się nad częstością wywołania danego algorytmu i opłacalnością zastosowania takiego a nie innego sposobu zapisu.

Poza tym drugi podany tutaj sposób kodowania wyjścia z metody w razie nieznalezienia danego elementu w kolekcji jest po prostu bardziej czytelny i taka jego implementacja jest dla innego programisty łatwiejsza do wychwycenia na pierwszy rzut oka.


(jg / pn)

Szukanie nil w kolekcji

Na marginesie warto dodać, że przy użyciu żadnego z powyższych sposobów użycia metody detect:ifNone: nie da się stwierdzić obecności wartości nil w kolekcji takiej jak np. #(1 2 3 nil). W obu przypadkach nastąpi wyjście z metody wywołujacej detect:ifNone:, ponieważ kryterium wyjścia jest zwrócenie przez tę ostatnią metodę wartości nil.

W takim, raczej teoretycznym przypadku, należałoby zastosować konstrukcję:

value := myCollection detect: [:each | each = myObject ] ifNone: [noObjectFound].
value == noObjectFound ifTrue: [^self].

,gdzie zmienna noObjectFound zawiera jakiś singleton, mówiący nam, że żądany obiekt nie został znaleziony.


(doc / pn)



SelfSmaltalk, (c) ObjectSpace.Net
Strona wygenerowana przy pomocy edytora aceHTML
i systemu VisualWorks Smalltalk NC 7.0