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)
|