Pobieranie prezentacji. Proszę czekać

Pobieranie prezentacji. Proszę czekać

OOPSmalltalk - stałe, klasy, bloki, instrukcje sterujące1 Komunikaty do self Odbiorcą jest obiekt, w którym wykonuje się ten komunikat Szukanie metody.

Podobne prezentacje


Prezentacja na temat: "OOPSmalltalk - stałe, klasy, bloki, instrukcje sterujące1 Komunikaty do self Odbiorcą jest obiekt, w którym wykonuje się ten komunikat Szukanie metody."— Zapis prezentacji:

1 OOPSmalltalk - stałe, klasy, bloki, instrukcje sterujące1 Komunikaty do self Odbiorcą jest obiekt, w którym wykonuje się ten komunikat Szukanie metody rozpoczyna się od klasy obiektu, w którym wykonuje się ten komunikat (a nie od klasy, w której występuje tekstowo ten komunikat). Jest to wiązanie dynamiczne, a nie statyczne. Object subclass: #One........ Metody egzemplarzowe test ^1 result1 ^ self test One sublcass: #Two Metody egzemplarzowe test ^2 x1 := One new. x2 := Two new. x1 test1 x1 result11 x2 test2 x2 result12

2 OOPSmalltalk - stałe, klasy, bloki, instrukcje sterujące2 Komunikaty do super Odbiorcą jest obiekt wyznaczony przez self. szukanie metody rozpoczyna się od nadklasy, w której występuje tekstowo ten komunikat. Jest to wiązanie statyczne, a nie dynamiczne. Two subclass: #Three.... metody egzemplarzowe result2 ^self result1 result3 ^super test Three subclass: #Four metody egzemplarzowe test ^4 x3 := Three new. x4 := Four new. x3 test2 x4 result14 x3 result22 x4 result24 x3 result32 x4 result32

3 OOPSmalltalk - stałe, klasy, bloki, instrukcje sterujące3 Identyfikatory ciągi liter, cyfr (i znaków podkreślenia), zaczynające się od litery (lub podkreślenia), konwencja: nie używa się podkreśleń, rozróżniane są wielkie i małe litery, niektóre implementacje akceptują polskie znaki (np. OS, Dolphin nie), nie ma ograniczenia na długość, konwencja : –z małej litery zaczynają się identyfikatory: zmiennych lokalnych, zmiennych egzemplarzowych, metod egzemplarzowych, –z wielkiej litery zaczynają się identyfikatory: klas, zmiennych klasowych, metod klasowych, zmiennych globalnych,

4 OOPSmalltalk - stałe, klasy, bloki, instrukcje sterujące4 Literały liczby (Number: Integer, Float, Fraction, Decimal, …) 3-123 15r11 Integer (SmallInteger [D]) 1234567890 Integer (LargeInteger [D]) -10.4 128.4e-3 Float 4/7 Fraction (ale 14/7 "SmallInteger") znaki (Character) $a $$ $# $. napisy (String) Ala ma kotaAdams symbole (Symbol) #Licznik #symbol #+ #value: tablice #(5 3 $a def) 'ab' =( 'a', 'b') "true" 'ab' ==( 'a', 'b') "false" 'ab' asSymbol == ( 'a', 'b') asSymbol "true"

5 OOPSmalltalk - stałe, klasy, bloki, instrukcje sterujące5 Podstawowe klasy Object Boolean False True Collection ArrayedCollection Array String Symbol Set Magnitude Character Date ArithmeticValue Number Float Fraction Integer Time UndefinedObject true - jedyny obiekt klasy True false - jedyny obiekt klasy False odpowiadają na komunikaty: & and:or:| ifFalse: ifTrue:ifTrue:ifFalse:ifFalse:ifTrue nil - jedyny obiekt klasy UndefinedObject

6 OOPSmalltalk - stałe, klasy, bloki, instrukcje sterujące6 Magnitude Na obiektach tej klasy jest określony porządek liniowy >= Uwaga: ==, ~=, ~ (czyli identyczności i różności) są odziedziczone z klasy Object. ArithmeticValue Na obiektach tej klasy są określone operacje arytmetyczne. +-*/ // anArithmeticVaueiloraz całkowity odbiorcy przez paarmetr \\ anArithmeticValuereszta całkowita abswartość bezwzględna odbiorcy negatednegacja odbiorcy (-k nie jest poprawne w wielu Smalltalkach: OS OK, Dolphin nie) sinsinus odbiorcy coscosinus odbiorcy Float Liczby rzeczywiste reprezentowane zmiennopozycyjnie. Fraction Ułamki nieupraszczalne Integer Klasa liczb całkowitych. Ma podklasy: SmallInteger – małe liczby całkowite (32-bitowe) LargeInteger – duże liczby całkowite (dowolne) factorialdaje silnię odbiorcy (Integer) gcd: anIntegerdaje największy wspólny dzielnik (Number ale musi mieć całkowitą wartość) lcm: anIntegerdaje najmniejszą wspólną wielokrotność (Integer)

7 OOPSmalltalk - stałe, klasy, bloki, instrukcje sterujące7 Bloki Bloki są obiektami klasy BlockClosure. Bloki to anonimowe funkcje (czyli kawałki kodu). [ :par1 :par2... | S1. S2..... Sk ] Bloki nie są wykonywane od razu po napotkaniu w tekście metody. Tworzony jest wtedy obiekt klasy BlockClosure. Można wykonać treść bloku wysyłając do utworzonego tak obiektu komunikat value (value:, value:value:, …). Komunikat value daje jako wynik wartość ostatniego wyrażenia wykonanego w bloku. aBlock value: wyr1 value: wyr2 [ i := i + 1] value [:x :y | (x + y * 3 ] value: 2 value: 5 blk := [ : par | total := total + par ] total := 0. blk value: 10. blk value: 1. blk value: 3.total = 14 Blok można przekazać jako parametr komunikatu. x wykonaj: [ 3 + 5 ]wykonaj: aBlock aBlock value

8 OOPSmalltalk - stałe, klasy, bloki, instrukcje sterujące8 Powrót z bloku – ^ Wystąpienie ^Expr w bloku jest powrotem z metody, w której blok występuje (tekstowo !), a więc kończy wykonanie tej metody (a nie metody, która wywołała ten blok). Przykłady: isPrime | candidate divisor | candidate := self. candidate <= 0 ifTrue: [^false]. candidate >= 1 & (candidate <= 3) ifTrue: [^true]. (candidate \\ 2) = 0 ifTrue: [^false]. divisor := 3. [ divisor * divisor <= candidate ] whileTrue: [ (candidate \\ divisor) = 0 ifTrue: [^false] ifFalse: [divisor := divisor + 2] ] ^true Użycie bloków do obsługi sytuacji wyjątkowych: set := Set new. set add: 3; add: 5; add: 7; add: 11..... set remove: 3 ifAbsent: [ nie ma obiektu! out. ^self]. set remove: 10 ifAbsent: [ nie ma obiektu! out. ^self].

9 OOPSmalltalk - stałe, klasy, bloki, instrukcje sterujące9 Instrukcje warunkowe wyrWarunkowe ifTrue: [ blok1 ] wyrWarunkowe ifFalse: [blok1] wyrWarunkowe ifFalse: [blok1] ifTrue: [blok2] wyrWarunkowe ifTrue: [blok1] ifFalse: [blok2] Wyrażenie warunkowe musi być obiektem klasy True lub False. x < 3 ifTrue: [ x := 0]. liczba1 < liczba2 ifTrue: [ max := liczba2. min := liczba1] ifFalse: [max := liczba1. min := liczba2] Treść metod warunkowych W klasie True: ifFalse: aBlock ^nil ifTrue: aBlock ^ aBlock value ifTrue: trueBlock ifFalse: falseBlock ^ trueBlock value ifFalse: falseBlock ifTrue: trueBlock ^ trueBlock value

10 OOPSmalltalk - stałe, klasy, bloki, instrukcje sterujące10 Pętle [ blok warunkowy ] whileTrue: [ blok pętli ] [ blok warunkowy ] whileFalse: [ blok pętli ] Blok warunkowy powinien być blokiem bezparametrowym takim, że wysłany do niego komunikat value zwraca true lub false. Komunikaty whileTrue: i whileFalse: są rozumiane przez bloki. suma := 0. liczba := 4. [ liczba <= 100 ] whileTrue: [ suma := suma + liczba. liczba := liczba + 1] napis := abcdef345. i := 1. [ (napis at: i) out. (napis at: i ) ~~$3 ] whileTrue: [ i := i + 1] Możliwa treść metody whileTrue: w klasie BlockClosure whileTrue: aBlock self value ifTrue: [ aBlock value. self whileTrue: aBlock ] ^ nil "faktyczna [D]: ^[self value] whileTrue: [aBlock value]"

11 OOPSmalltalk - stałe, klasy, bloki, instrukcje sterujące11 liczba timesRepeat: [ blok ] suma := 0. i := 0. 5 timesRepeat: [ i := i + 1. suma := suma + i ] timesRepeat: aBlock | anInteger | anInteger := self. [ anInteger > 0 ] whileTrue: [ anInteger := anInteger - 1. aBlock value ] Pętle liczbowe Odpowiednie metody są zdefiniowane w klasie Number lub Integer. liczba to: final by: step do: aBlock liczba to: final do: aBlock 1 to: 10 by: 2 do: [ :i | tab at: i put: 0 ] zeruje co drugi element tablicy tab Możliwa realizacja: to: final by: step do: aBlock | index | index := self. step > 0 ifTrue: [ [ index <= final ] whileTrue: [ aBlock value: index. index := index + step] ] ifFalse:......

12 OOPSmalltalk - stałe, klasy, bloki, instrukcje sterujące12 Klasa Object Najważniejsze metody: =porównanie obiektów. Zwykle przedefiniowane w podklasach (czy obiekty są takie same) = =porównanie obiektów (czy to jest ten sam obiekt) ~ =, ~~różność obiektów classzwraca klasę obiektu isKindOf: aClassczy to jest obiekt tej klasy lub jej podklasy isMemberOf: aClassczy to jest obiekt tej klasy copykopia obiektu (tzw. powierzchowna) shallowCopyj. w. deepCopykopia głęboka, z powierzchowną kopią atrybutów implementedBySubclasssygnalizacja (dla klasy abstrakcyjnej), że ta metoda nie może tu być zaimplementowana inspectwłącza okno oglądania obiektu isNil, notNilczy obiekt jest równy nil (nie jest) perform: aSymbolwysyła komunikat bezparametrowy aSymbol do odbiorcy komunikatu perform:. Wynikiem jest wynik wysłanego komunikatu perform: aSymbol with: anObjectj.w., anObject jest parametrem komunikatu aSymbol perform: aSymbol withArguments: anArray j.w., anArray jest tablicą parametrów komunikatu aSymbol

13 OOPSmalltalk - stałe, klasy, bloki, instrukcje sterujące13 metody klasy Object - c.d. error: aString wypisuje odpowiedni komunikat o błędzie i zatrzymuje program haltzatrzymuje program printOn: aStream wypisuje na strumień aStream tekstową reprezentację obiektu. Standardowo pisze tylko informację o klasie obiektu, powinna być przedefiniowana w poszczególnych klasach (np. Number, String, Date ) printStringdaje napis będący tekstową reprezentacją obiektu; powinna być przedefiniowana w podklasach (a jeszcze lepiej w Dolphinie przedefinować printOn:, bo Object>>printString używa) yourselfdaje obiekt odbiorcy (użyteczne w kaskadach) doesNotUnderstand: aMessage generuje komunikat o błędzie - niezrozumiały komunikat aMessage

14 OOPSmalltalk - stałe, klasy, bloki, instrukcje sterujące14 Klasy i metaklasy Object Behavior ClassDescription Class Metaclass Klasa Class reprezentuje wszystkie klasy. Metaklasy są to klasy klas. Tworzą dokładnie taką samą hierarchię, jak klasy. Każdej klasie (np. Number, Object) odpowiada metaklasa o tej samej nazwie (odp. Number, Object). Każda klasa jest jedynym obiektem swojej metaklasy. Każda metaklasa jest obiektem klasy Metaclass (klasa Metaclass jest obiektem swojej metaklasy, będącej obiektem klasy Metaclass). Zmienne egzemplarzowe i metody egzemplarzowe metaklasy (zaimplementowane w klasie Class jako egzemplarzowe) są zmiennymi klasowymi i metodami klasowymi każdego obiektu (czyli jakby klasy Object). Klasy Behavior i Class definiują protokoły wspólne dla wszystkich klas. W klasie Behavior: newtworzy nowy obiekt new: sizetworzy nowy obiekt ze zmiennymi indeksowanymi namedaje nazwę odbiorcy (czyli nazwę klasy) w klasie Class: subclass: aSymbol instanceVariableNames: string1 classVariableNames: string2 poolDictionaries: pool tworzenie nowej klasy, czyli nowego obiektu odp. metaklasy

15 OOPSmalltalk - stałe, klasy, bloki, instrukcje sterujące15 Refleksja Możliwość odwoływania się podczas wykonywania programu do samego programu. Można na przykład dowiedzieć się: anObject class o klasę obiektu (Object) anObject class name o nazwę klasy obiektu (Behavior, Class, MetaClass) anObject class canUnderstand: #metoda czy obiekt rozumie komunikat (Behavior) anObject class allSelectors jakie komunikaty rozumie obiekt (Behavior) aClass subclasses jakie podklasy ma wskazana klasa (Behavior) aClass allInstances jakie są wszystkie obiekty (dokładnie) tej klasy (Behavior)

16 OOPSmalltalk - stałe, klasy, bloki, instrukcje sterujące16 Dynamiczne generowanie klas "Tworzymy dynamicznie nową klasę" Object subclass: #Test instanceVariableNames: 'a b c' classVariableNames: '' poolDictionaries: ''. "Dodajemy do niej metody" Test compile: 'pokaz Transcript show: ''Udało się!'''. "I upewniamy się, że się udało" |a| a := Test new. "tworzy obiekt klasy Test" a pokaz. "wypisuje tekst do Transcriptu" a class canUnderstand: #pokaz. "true"

17 OOPSmalltalk - stałe, klasy, bloki, instrukcje sterujące17 Obiekty ze zmiennymi indeksowanymi 1. Zwykła klasa - obiekty mają tylko zwykłe (nazwane) zmienne egzemplarzowe. Number subclass: #Fraction instanceVariableNames: 'numerator denominator ' classVariableNames: '' poolDictionaries: '' classInstanceVariableNames: '' 2. Klasa, której obiekty, oprócz nazwanych zmiennych egzemplarzowych, mają zmienne indeksowane. Ich liczba jest określona w momencie tworzenia obiektu (new: size). ArrayedCollection variableSubclass: #Array instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' classInstanceVariableNames: '' Objet variableSubclass: Stack instanceVariableNames: top classVariableNames:...... 3. Klasa, której obiekty mają wyłącznie indeksowane zmienne egzemplarzowe (bajty). Rozmiar obiektów jest określany przy ich tworzeniu (new: size) ArrayedCollection variableByteSubclass: #String instanceVariableNames: '' classVariableNames: '' poolDictionaries: 'Win32Constants' classInstanceVariableNames: ''

18 OOPSmalltalk - stałe, klasy, bloki, instrukcje sterujące18 Metody (z klasy Object i Behavior), które są odbierane przez klasy i obiekty ze zmiennymi indeksowanymi: Behavior>>new: aSmallInteger Tworzy nowy obiekt, który ma aSmallInteger zmiennych indeksowanych. Błąd, jeśli klasa nie ma zmiennych indeksowanych. tab := Array new: 10 Object>>at: index Daje obiekt, który znajduje się na pozycji index w odbiorcy. Błąd, jeśli obiekt nie ma zmiennych indeksowanych lub index przekracza ich liczbę. y := tab at: 3 Object>>at: index put: value Wstawia obiekt value na pozycję index odbiorcy. Błąd j.w. tab at: 2 put: test. tab at: 3 put: 0 Object>>basicAt: aSmallInteger Jak at:, nie jest przedefiniowane w podklasach. Object>>basicAt: aSmallInteger put: value Jak at: put:, nie jest przedefiniowane w podklasach. Object>>size Daje liczbę indeksowanych zmiennych tab size = 10 true Object>>basicSize Jak size, nie jest przedefiniowane w podklasach

19 OOPSmalltalk - stałe, klasy, bloki, instrukcje sterujące19 Przykład - MonitoredArray Chcemy zdefiniować nową klasę pozwalającą na badanie częstości dostępu do elementów tablicy. Klasa MonitoredArray będzie podklasą klasy Array. Musimy przedefiniować metodę at: tak, aby zliczała dostęp do elementów tablicy. Klasa MonitoredArray może zastąpić klasę Array w każdym zastosowaniu. Array variableSubclass: #MonitoredArray instanceVariableNames: liczniki classVariableNames: poolDictionaries: Metody klasowe new: anInteger ^(super new: anInteger) initialize Metody egzemplarzowe initialize Tworzy równoległą tablicę liczniki | size | size := self size. liczniki := Array new: size. 1 to: size do: [ :i | liczniki at: i put: 0 ] at: i liczniki at: i put: ((liczniki at: i) + 1). ^super at: i licznikiDostepu ^liczniki


Pobierz ppt "OOPSmalltalk - stałe, klasy, bloki, instrukcje sterujące1 Komunikaty do self Odbiorcą jest obiekt, w którym wykonuje się ten komunikat Szukanie metody."

Podobne prezentacje


Reklamy Google