[ Pobierz całość w formacie PDF ]

metoda to zwraca obiekt Range (przedzia ), który mo e zosta u yty w p tli for. Wyobra
sobie scenariusz, w którym kto stosuje nasz domnieman konwersj w celu definiowa-
nia przedzia ów czasowych, ale pó niej chce odwo a si do oryginalnego widoku
zdefiniowanego w Predef, poniewa ma zamiar napisa p tl for. Jednym z rozwi za
jest zaimportowanie widoku z Predef z wy szym priorytetem w w szym zakresie  tylko
tam, gdzie jest potrzebny. Taki kod nie jest zbyt czytelny, co wida na listingu 5.10.
Listing 5.10. Priorytety i zakresy
object Test {
println(1L to 10L)
import Time._
println(1L to 10L)
def x() = {
import scala.Predef.longWrapper
println(1L to 10L)
def y() = {
import Time.longWrapper
println(1L to 10L)
}
y()
}
x()
}
Obiekt Test natychmiast po swojej definicji wypisuje w konsoli wyra enie (1L to 10L).
Nast pnie importujemy domniemane encje z Time i jeszcze raz wypisujemy wynik wyra-
enia. Dalej, w zagnie d onym zakresie, importujemy longWrapper z Predef i ponownie
wypisujemy wynik na wyj ciu. Na koniec, jeszcze g biej, importujemy longWrapper z Time
i wypisujemy wynik. Oto co pojawi si na wyj ciu:
scala> Test
NumericRange(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
TimeRange(1,10)
NumericRange(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
TimeRange(1,10)
res0: Test.type = Test$@2d34ab9b
Pierwsza wypisana linia typu NumericRange (zakres liczbowy) to wynik wyra enia
(1L to 10L) przed jak kolwiek instrukcj import. Dalej mamy wynik TimeRange, zwrócony
dzi ki zaimportowaniu domniemanego widoku z Time. Dalej pojawia si NumericRange,
zwi zany z zakresem zagnie d onym w metodzie x(), a ostatni wynik TimeRange to wynik
z najbardziej zagnie d onej metody y(). Gdyby obiekt Test zawiera wi cej takiego kodu
Kup ksi k Poleć ksi k
5.4. Ograniczanie zakresu encji domniemanych 133
i kod ten nie mie ci by si w jednym oknie, trudno by oby przewidzie , jaki b dzie wynik
wyra enia (1L to 10L) w danym miejscu. Unikaj tego typu zawik anych sytuacji. Najle-
piej wystrzega si konfliktów w definicji domniemanych widoków, jednak nie zawsze
jest to proste. W trudnych sytuacjach mo na zdecydowa , e jedna z konwersji b dzie
domniemana, natomiast inne b d wywo ywane tradycyjnie.
Projektowanie odkrywalnych domniemanych encji zwi ksza czytelno kodu, ponie-
wa nowemu programi cie atwiej jest zrozumie , co dzieje si w danym fragmencie
kodu i co powinno si w nim dzia . Znaczenie odkrywalnych encji ro nie podczas pracy
w zespole. W spo eczno ci Scali panuje ogólna zgoda na ograniczenie importowalnych
encji domniemanych do jednego z dwóch miejsc:
obiektów pakietowych,
obiektów singletonowych z postfiksowymi (przyrostkowymi) widokami
domniemanymi.
Obiekty pakietowe s doskona ym miejscem do sk adowania encji domniemanych,
poniewa i tak s one w zakresie domniemanym dla typów zdefiniowanych wewn trz
pakietu. U ytkownicy powinni szuka w obiekcie pakietowym encji domniemanych zwi -
zanych z pakietem. Umieszczenie w obiekcie pakietowym domniemanych encji wymagaj -
cych jawnego importu zwi kszy ich szanse na to, e zostan zauwa one przez u ytkownika.
Podczas korzystania z obiektu pakietowego do przechowywania encji domniemanych
zawsze dokumentuj, czy wymagaj one jawnych importów.
Lepszym rozwi zaniem ni dokumentowanie jawnych importów domniemanych encji
jest ca kowita rezygnacja z instrukcji import.
5.4.2. Parametry i widoki domniemane bez podatku od importu
Parametry i widoki domniemane wietnie sobie radz bez instrukcji import. Ich drugo-
rz dne regu y wyszukiwania, sprawdzaj ce obiekty towarzysz ce typów powi zanych,
pozwalaj na definiowanie domniemanych konwersji i warto ci, które nie wymagaj
u ywania instrukcji import. Przy odrobinie kreatywno ci jest mo liwe stworzenie eks-
presywnych bibliotek, które w pe ni wykorzystuj si domniema bez potrzeby impor-
towania. Przeanalizujemy to zadanie na przyk adzie, za który pos u y nam biblioteka do
reprezentacji liczb zespolonych.
Liczby zespolone to liczby, które sk adaj si z cz ci rzeczywistej i urojonej. Cz
urojona jest mno ona przez pierwiastek kwadratowy z  1, znany tak e jako i (lub j w dzie-
dzinie elektrotechniki). W Scali atwo zamodelowa tak liczb za pomoc tzw. klasy
wzorcowej (case class)  prostej klasy b d cej kontenerem na warto ci.
package complexmath
case class ComplexNumber(real : Double, imaginary : Double)
Klasa ComplexNumber definiuje cz rzeczywist jako pole real typu Double. Cz
urojona to pole imaginary, tak e typu Double. Klasa reprezentuje liczby zespolone przy [ Pobierz całość w formacie PDF ]

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • littlewoman.keep.pl