Professional Documents
Culture Documents
PRZYKADOWY ROZDZIA
SPIS TRECI
KATALOG KSIEK
KATALOG ONLINE
ZAMW DRUKOWANY KATALOG
TWJ KOSZYK
DODAJ DO KOSZYKA
CENNIK I INFORMACJE
ZAMW INFORMACJE
O NOWOCIACH
ZAMW CENNIK
CZYTELNIA
FRAGMENTY KSIEK ONLINE
Wydawnictwo Helion
ul. Kociuszki 1c
44-100 Gliwice
tel. 032 230 98 63
e-mail: helion@helion.pl
SPIS TRECI
O autorze .................................................................................................................... 19
Wprowadzenie ........................................................................................................... 21
Rozdzia 1. Komputery i ich programowanie podstawowe pojcia ........... 29
C# obiektowy jzyk programowania ....................................................... 31
Organizacja komputera .............................................................................. 32
Sprzt ................................................................................................................... 32
Waciwoci pamici operacyjnej ............................................................. 34
Systemy liczbowe ........................................................................................ 36
Bajty ............................................................................................................... 37
Pliki ................................................................................................................ 38
Oprogramowanie .............................................................................................. 38
Oglny proces wykonywania programu C# ......................................... 38
System operacyjny ...................................................................................... 39
Jzyki programowania i kompilatory ...................................................... 40
Wprowadzenie do .NET ............................................................................ 41
Kompilacja kodu rdowego C# w .NET ............................................. 42
Podsumowanie .................................................................................................. 45
Pytania kontrolne .............................................................................................. 46
Rozdzia 2. Twj pierwszy program C# .............................................................. 47
Rozwj oprogramowania ................................................................................. 48
Proces tworzenia oprogramowania ............................................................... 48
Algorytmy i pseudokod ................................................................................... 50
Trzy rodzaje bdw ......................................................................................... 53
Programowanie obiektowe pierwsze spotkanie ..................................... 54
Programowanie procesowe i jego wrodzone problemy ....................... 55
Programowanie obiektowe i jego zalety ................................................. 55
Ponowne wykorzystanie oprogramowania .................................................. 60
Zestaw, podstawowa jednostka ponownego wykorzystania
kodu w .NET ................................................................................................ 62
Punkt widzenia programisty ..................................................................... 63
Punkt widzenia uytkownika ................................................................... 64
SPIS TRECI
SPIS TRECI
10
SPIS TRECI
11
12
SPIS TRECI
13
14
SPIS TRECI
15
16
SPIS TRECI
17
5
TWJ PIERWSZY PROGRAM
OBIEKTOWY W C#
W tym rozdziale dowiesz si:
z
z
z
z
z
146
Wstp
Dotychczas zapoznalimy si z dwoma programami rdowymi przedstawionymi
w listingach 3.1 w rozdziale 3. i 4.1 w rozdziale 4. Przedstawione tam konstrukcje
jzyka C# w pewnym stopniu zaleay od treci poszczeglnych wierszy kodu
i w rezultacie zajmoway si jednoczenie wieloma rnorodnymi, ale wzajemnie
zwizanymi ze sob aspektami. Aby nadrobi braki tej szybkiej wycieczki po C#,
pierwsza cz tego rozdziau bdzie powicona przegldowi podstawowych elementw C#.
W ostatniej czci rozdziau zobaczymy pierwszy w tej ksice program obiektowy C#.
Jest on oparty na poprzednich teoretycznych dyskusjach obiektowych, a zwaszcza
na omwieniu symulacji windy na pocztku rozdziau 3. Pozwala m.in. zaobserwowa, jak omwiony wczeniej zwizek midzy klasami Elevator i Person jest
implementowany w C#.
Struktura leksykalna
Kiedy kompilator C# otrzymuje kawaek kodu rdowego do kompilacji, staje przed
pozornie zniechcajcym zadaniem rozszyfrowania dugiej listy znakw (dokadniej, znakw Unicode, przedstawionych w dodatku E, Zestaw znakw Unicode)
i przeksztacenia ich na odpowiedni MSIL o znaczeniu dokadnie tym samym, co
oryginalny kod rdowy. Aby znale sens tej masy kodu rdowego, musi rozpozna niepodzielne elementy C# niedajce si rozbi czci tworzce kod rdowy C#. Przykadami takich niepodzielnych elementw s: nawias klamrowy ({),
nawias (() oraz sowa kluczowe, np. class i if. Zadanie, ktre wykonuje kompilator, zwizane z rozrnieniem otwierajcych i zamykajcych nawiasw klamrowych, sw kluczowych, nawiasw itd., nazywa si analiz leksykaln. W zasadzie,
kwestie leksykalne, ktrymi zajmuje si kompilator, odnosz si do tego, jak znaki
kodu rdowego mona przetumaczy na znaki zrozumiae dla kompilatora.
Programy C# s zbiorem identyfikatorw, sw kluczowych, odstpw, komentarzy,
literaw, operatorw i separatorw. Z wikszoci tych elementw C# ju spotkalimy si. W dalszym cigu rozdziau dokonamy ich przegldu, a take wprowadzimy
jeszcze kilka innych aspektw.
147
Wskazwka
Nie wszystkie jzyki komputerowe odrniaj mae i wielkie litery. W takich jzykach sowa Srednia i srednia s identyczne dla kompilatora. W celu uzyskania
kompatybilnoci z tymi jzykami, naley unika sytuacji, w ktrych wielko liter
decyduje o rozrnialnoci identyfikatorw typu public, ktre s dostpne dla
innych jzykw.
Literay
Rozwamy dwa nastpujce wiersze kodu rdowego:
int number;
number = 10;
148
Separatory
W jzyku C# separatory su do oddzielania od siebie rnych elementw. Spotkalimy ju wiele z nich. Przykadem moe by powszechnie stosowany rednik ;,
ktry jest wymagany do zakoczenia instrukcji. W tabeli 5.1 zebrano separatory, ktre
ju poznalimy.
Symbol
Cel
Nawiasy
klamrowe
{ }
Nawiasy
( )
rednik
Koczy instrukcj.
Przecinek
Kropka
149
Operatory
Operatory s przedstawiane za pomoc symboli, takich jak +, =, == i *. Operatory
dziaaj na argumenty, ktre znajduj si obok operatora, np.:
sumTotal + 10
zawiera operator + otoczony dwoma argumentami, sumTotal i 10. W tym kontekcie operator + czy dwa argumenty w celu uzyskania wyniku, a wic jest to operator dwuargumentowy. Niektre operatory dziaaj na tylko jeden argument; nazywa
si je wic operatorami jednoargumentowymi.
Operatory wraz ze swoimi argumentami tworz wyraenia. Sam litera lub zmienna
s rwnie wyraeniami, tak jak kombinacje literaw i zmiennych z operatorami.
W rezultacie wyraenia mog by stosowane jako argumenty pod warunkiem, e s
spenione zasady, ktre maj zastosowanie do kadego operatora, co pokazano na
nastpujcym przykadzie:
sumTotal = a + b;
150
to prawda tylko wtedy, gdy oba wyraenia bd rwne; w przeciwnym razie bdzie
to fasz.
Sowa kluczowe
W dodatku C podano 77 sw kluczowych C# (wszystkie). Dotychczas spotkalimy
sowa kluczowe, takie jak if, class, public, static, void, string, int i return.
Skadnia (zasady jzykowe) operatorw i separatorw poczonych ze sowami kluczowymi tworzy definicj jzyka C#.
151
Statystyka
Liczbowy fakt lub dane, zwaszcza obliczone z prbki, nazywa si statystyk.
Statystyka jest nauk, ktra zajmuje si zbieraniem, klasyfikacj, analiz i interpretacj liczbowych faktw lub danych, i ktra, przy uyciu matematycznych teorii
prawdopodobiestwa, narzuca porzdek i regularno agregatw mniej lub bardziej
odmiennych elementw.
Termin statystyka stosuje si rwnie w odniesieniu do samych liczbowych faktw
lub danych.
152
averageFloorTravelingTime. Kiedy trzeba obliczy kocow statystyk averageFloorTravelingTime, metoda wyliczy redni z liczb przechowywanych
na licie.
Wszystkie te obliczenia wykorzystujce uruchamianie i zatrzymywanie stoperw,
sumowanie liczb, obliczanie rednich itd. nie s w aden sposb interesujce dla
innych obiektw w symulacji i nadmiernie komplikowayby sprawy innym programistom, gdyby je ujawniono. W konsekwencji powinnimy ukry wszystkie zaangaowane tutaj metody przez zadeklarowanie ich jako private.
Rwnie kady obiekt Person musi by w stanie poda swj totalWaitingTime
i averageFloorTravelingTime. Mona to zrobi za pomoc dwch metod
public, nazwanych arbitralnie getTotalWaitingTime() i getAverageFloorTravelingTime(). Kady inny obiekt wywoujcy ktr z tych metod otrzyma
odpowiedni statystyk.
Inny programista, ktry take pracuje nad tym projektem, pisze klas do zbierania
wanych statystyk kadej symulacji. Nazwa t klas StatisticsReporter. Musi
zapewni, aby na kocu symulacji przeprowadzono wywiad z wszystkimi obiektami
Person przez umoliwienie klasie StatisticsReporter zbierania ich statystyk
totalWaitingTime i averageFloorTravelingTime. Teraz StatisticsReporter moe to zrobi po prostu przez wywoanie metod getTotalWaitingTime() i getAverageFloorTravelingTime() kadego obiektu Person biorcego
udzia w danej symulacji.
Podsumowujc:
getTotalWaitingTime() i getAverageFloorTravelingTime() s czci
interfejsu, ktry ukrywa, czyli hermetyzuje wszystkie zoonoci, nieistotne dla
naszego programisty klasy StatisticsReporter.
Podobnie, zmienne instancji obiektw Person powinny by ukryte za pomoc
deklaracji private. Uniemoliwia to innym obiektom, ze StatisticsReporter wcznie, bdn zmian tych wielkoci. Innymi sowy, metody getTotalWaitingTime() i getAverageFloorTravelingTime() przykrywaj
zmienne instancji totalWaitingTime i averageFloorTravelingTime za
pomoc hermetyzacji, jak opakowanie, umoliwiajc klasie StatisticsReporter jedynie uzyskanie ich wartoci, bez moliwoci wprowadzania zmian.
153
Widzielimy par prostych klas w listingach 3.1 w rozdziale 3. i 4.1 w rozdziale 4.,
ale nie zawieray one adnych rzeczywistych obiektw; byy biernymi kontenerami,
utworzonymi jedynie po to, aby zawieray metod Main(). adnego z tych programw nie mona waciwie uwaa za obiektowy. Poniewa maj one tylko metody zawierajce sekwencje instrukcji wykonywanych jedna po drugiej, przypominaj
programy napisane w proceduralnym stylu programowania.
Przez zwyke dodanie wielu metod i instrukcji do klasy SimpleCalculator z listingu 4.1 moglibymy, aczkolwiek wyjtkowo nieefektywnie, napisa prawidow
i skomplikowan aplikacj arkusza obliczeniowego, nie martwic si o pisanie innych
klas, uczenie si teoretycznych zasad obiektowych lub nawet wykorzystanie jakichkolwiek dajcych si wymieni cech obiektowych C#. Struktura tego programu byaby
blisza programowi napisanemu w jzyku proceduralnym, takim jak C lub Pascal,
ni typowemu programowi obiektowemu C#.
I odwrotnie (oraz zadziwiajco), mona by byo rwnie napisa program obiektowy
w C lub Pascalu, ale byoby to niewygodne, poniewa te jzyki, w przeciwiestwie
do C#, nie maj wbudowanej obsugi tego paradygmatu.
Aby nasze dotychczasowe dyskusje obiektowe uczyni bardziej praktycznymi i unikn ryzyka skonstruowania nieobiektowego, duego programu arkusza obliczeniowego, przedstawi przykad ilustrujcy par wanych cech C#, cile zwizanych
z nasz teoretyczn dyskusj o klasach, obiektach i tworzeniu instancji.
Prezentacja SimpleElevatorSimulation.cs
Listing 5.1 zawiera kod rdowy dla prostego programu symulacyjnego windy. Jego
celem jest zilustrowanie, jak obiekt uytkownika wyglda w C# i jak jest tworzona
instancja obiektu klasy uytkownika. Szczeglnie pokazuje on, jak tworzony jest
obiekt klasy Elevator oraz jak wywouje on metod obiektu Person o nazwie
NewFloorRequest() (danie nowego pitra) i jak powoduje, e ta metoda zwraca
numer danego pitra, dziki czemu Elevator moe speni t prob.
Na etapie projektowania kodu rdowego w listingu 5.1 dokonano wielu abstrakcji,
umoliwiajcych uproszczenie programu i skoncentrowanie si na zasadniczych,
obiektowych czciach kodu rdowego.
Poniej podano krtki opis konfiguracji systemu windy, uytej dla tej symulacji,
z podkreleniem gwnych rnic w stosunku do rzeczywistego systemu wind.
Klasa Building (budynek) ma jeden obiekt klasy Elevator o nazwie elevatorA.
Jeden obiekt Person, rezydujcy w zmiennej passenger (pasaer), wykorzystuje elevatorA (wind A).
Obiekt Elevator moe jecha na dowolne pitro znajdujce si w zakresie
okrelonym przez typ int (od 2147483648 do 2147483647). Jednak obiekt Person
jest zaprogramowany na losowy wybr piter od 1 do 30.
154
Uwaga!
Przypomnijmy sobie, e to, jak program jest wykonywany, nie zaley od kolejnoci,
w jakiej metody klasy s zapisane w kodzie rdowym. To samo dotyczy kolejnoci klas w programie. Mona wybra dowoln kolejno pasujc do naszego
stylu. W listingu 5.1 wstawiem klas zawierajc metod Main() jako ostatni,
a mimo to Main() jest pierwsz metod, jaka bdzie wykonana.
Typowy wynik listingu 5.1 jest pokazany pod listingiem. Poniewa numery danych
piter s wybierane losowo, "Odjedam z pitra" i "Jad na" oraz "Ilo
przebytych piter" bd inne przy kadym uruchomieniu programu (z wyjtkiem pierwszego opuszczanego pitra, ktrym zawsze bdzie pitro 1.).
08:
09:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
155
156
57:
58:
59:
60:
61:
62:
63:
64: }
elevatorA.InitiateNewFloorRequest();
elevatorA.InitiateNewFloorRequest();
elevatorA.InitiateNewFloorRequest();
elevatorA.InitiateNewFloorRequest();
elevatorA.InitiateNewFloorRequest();
elevatorA.ReportStatistic();
}
157
RYSUNEK 5.1.
Poczenie
rysunku 3.1
z rzeczywistym
programem C#
158
159
Inicjalizacja zmiennych
Nowa cecha przedstawiona w wierszu 7. jest kombinacj instrukcji deklaracji i instrukcji przypisania. Nazywamy to inicjalizacj. private int currentFloor;
jest prost deklaracj, a przez dodanie na kocu = 1, skutecznie przypisujemy 1 do
currentFloor podczas tworzenia lub zaraz po utworzenie obiektu, do ktrego
naley zmienna instancji.
07:
160
Wskazwka
Mona zadeklarowa skadow klasy bez wyranego podawania jej dostpnoci
dziki opuszczeniu sowa kluczowego public lub private. Wtedy dostpno
jest domylnie ustawiana na private.
Tym niemniej, lepiej uywa sowa kluczowego private w celu zadeklarowania
wszystkich prywatnych skadowych klasy, aby poprawi jej przejrzysto.
Jeszcze nie wstawilimy tutaj szczeglnego obiektu Person; aby to zrobi, potrzebowalibymy instrukcji przypisania, ktr zobaczymy troch pniej w tym rozdziale.
Dotd jedynie stwierdzamy, e obiekt Elevator moe transportowa jeden obiekt
passenger, ktry musi by klasy Person. Przykadowo w Elevator nie mog
by przechowywane obiekty Dog, Airplane czy Submarine, gdybymy kiedy
zdefiniowali takie klasy w naszym programie.
Teraz przeskoczmy na chwil do wierszy od 33. do 47. Przez zdefiniowanie w tych
wierszach klasy Person skutecznie utworzylimy nowy typ uytkownika. A wic,
oprcz moliwoci deklarowania, e zmienna bdzie typu int lub typu string,
moemy rwnie zadeklarowa, e bdzie ona typu Person, co wanie robimy
w wierszu 10.
Uwaga!
int i string s to wbudowane, wstpnie zdefiniowane typy. Klasy, ktre piszemy
i definiujemy w swoim kodzie rdowym, s typami uytkownika (ang. custommade types).
Prosz zwrci uwag, e wiersz 10. jest cile zwizany z wierszami 14., 19. i wierszami od 33. do 47. Wiersz 14. przypisuje nowy obiekt klasy Person do zmiennej
passenger; wiersz 19. wykorzystuje pewn funkcj zmiennej passenger, a wic
161
obiektu Person przez wywoanie jednej z jego metod, a wiersze od 33. do 47 definiuj
klas Person.
Wskazwka
Kolejno deklaracji i definicji skadowych klasy jest dowolna. Jednak warto podzieli
skadowe klasy na sekcje zawierajce skadowe o podobnych modyfikatorach dostpu w celu poprawienia przejrzystoci.
Poniej przedstawiono przykad powszechnie stosowanego stylu:
class NazwaKlasy
{
// deklaracje prywatnych zmiennych instancji
// definicje metod prywatnych
// definicje metod publicznych
}
private
private
private
private
int currentFloor = 1;
int requestedFloor = 0;
int totalFloorsTraveled = 0;
Person passenger;
Stan obiektu Elevator jest opisany przez zmienne instancji zadeklarowane w nastpujcych wierszach:
Wiersz 7. zmienna currentFloor ledzi pitro, na ktrym znajduje si obiekt
Elevator.
Wiersz 8. nowe danie pitra bdzie przechowywane w zmiennej requestedFloor; obiekt Elevator bdzie usiowa jak najszybciej speni to danie
(wiersz 24.), co zaley od szybkoci procesora naszego komputera.
Wiersz 9. kiedy tworzony jest obiekt Elevator, mona uwaa go za fabrycznie
nowy. On jeszcze nigdy nie jedzi do gry ani na d, wic totalFloorsTraveled musi na pocztku zawiera warto 0. Uzyskuje si to przez inicjalizacj
wartoci 0.
Liczba przebytych piter jest dodawana do totalFloorsTraveled (wiersze
od 22. do 23.) tu przed zakoczeniem jazdy (wiersz 24.).
Wiersz 10 pasaer (pasaerowie) windy podejmuje ostatecznie decyzj o numerach piter odwiedzanych przez wind. Obiekt Person rezydujcy w passenger
wybiera pitra, ktre musi odwiedzi nasz obiekt Elevator. danie jest uzyskiwane od passenger w wierszu 19. i przypisywane zmiennej requestedFloor.
162
Ale byoby to cakowicie nieistotne dla celu, ktry prbujemy uzyska w naszej
maej, prostej symulacji, wic jest to nieekonomiczne i niepotrzebnie komplikuje
klas Elevator.
Inny programista mgby doczy zmienn instancji klasy Elevator, ktra
zlicza liczb jazd wykonywanych przez wind; mgby nazwa j totalTrips
i zadeklarowa nastpujco:
Klas Elevator mona by potem tak zaprojektowa, eby metoda dodawaa 1
do totalTrips, za kadym razem gdy danie zostao spenione. Ta zmienna
instancji umoliwiaaby ledzenie innej, by moe wanej statystyki, a wic potencjalnie moe by przydatna.
Jak wida, przy podejmowaniu decyzji, ktre zmienne instancji naley doczy,
mona stosowa wiele rnych sposobw przedstawiania obiektw wiata rzeczywistego. Wybr zmiennych instancji zaley od programisty oraz od tego, co
chce on zrobi z kadym obiektem.
163
Wystpujce w tym wierszu sowo new (nowy) jest sowem kluczowym w C#, stosowanym w celu tworzenia nowego obiektu. Wytworzy ono now instancj (obiekt)
klasy Person. Ten nowy obiekt klasy Person jest nastpnie przypisany do zmiennej passenger. Teraz passenger zawiera obiekt Person, ktry mona wywoa
i zastosowa do wykonania czynnoci.
Uwaga!
Kiedy tworzy si instancj obiektu, czsto potrzebna jest inicjalizacja zmiennych
instancji tego obiektu. Konstruktor jest to metoda specjalnego rodzaju, ktra wykonuje zadanie inicjalizacji.
Metoda okrelana jako konstruktor musi mie tak sam nazw jak jej klasa. Tak
wic konstruktor dla klasy Person nazywa si Person() (patrz wiersz 37.).
Ilekro za pomoc sowa kluczowego new tworzony jest nowy obiekt Person,
automatycznie wywoywany jest konstruktor Person() w celu wykonania niezbdnych inicjalizacji. To wyjania obecno w wierszu 14. nawiasw, ktre s
wymagane zawsze, kiedy wywouje si dowoln metod i dowolny konstruktor.
(Zobacz rysunek na nastpnej stronie).
164
165
gdzie uyty jest operator kropki (.) w celu odwoania si do metody rezydujcej
wewntrz obiektu. Z operatora tego korzystalimy ju wiele razy, np. wystpowa
przy wywoywaniu metody WriteLine() z System.Console za pomoc System.Console.WriteLine("Pa, pa!"). Tym razem jednak, zamiast wywoywa
ju napisan metod z .NET Framework, wywoujemy wasn metod uytkownika
z klasy Person.
Uwaga!
W kodzie rdowym mona zauway sta definicj klasy. Natomiast obiekt
jest dynamiczny i oywia si podczas wykonywania programu.
166
RYSUNEK 5.2.
Wywoywanie
metody innego
obiektu
167
Warto bezwzgldna
Wartoci bezwzgldn liczby dodatniej jest sama liczba.
Wartoci bezwzgldn liczby ujemnej jest liczba bez znaku minus.
Przykady:
Wartoci bezwzgldn (12) jest 12.
Wartoci bezwzgldn 12 jest 12.
W matematyce warto bezwzgldna jest podawana za pomoc dwch pionowych kresek otaczajcych litera lub zmienn, np.:
|-12| = 12
Zastosowanie Math.Abs()
Metoda Abs() klasy Math rezydujcej w .NET Framework zwraca warto
bezwzgldn wysanego do niej argumentu. W rezultacie wywoanie metody
Math.Abs(99) zwraca 99, podczas gdy Math.Abs(-34) zwraca 34.
Obliczajc odlego przebyt przez wind, jestemy zainteresowani dodatni liczb
przebytych piter, bez wzgldu na to, czy winda jedzie do gry, czy na d. Jeeli
liczb przebytych piter obliczymy za pomoc nastpujcego wyraenia:
currentFloor requestedFloor
168
licznikiem odlegoci windy, cay czas ledzcym cakowit ilo przebytych piter.
Ten typ instrukcji bdzie omwiony bardziej szczegowo w rozdziale 6.
Niespodziewanie prosta instrukcja przypisania w wierszu 24. reprezentuje jazd
windy. Spenia danie przekazane od passenger. Przez przypisanie wartoci
zmiennej requestedFloor do currentFloor moemy powiedzie, e winda
przesuna si z wartoci currentFloor, ktr zawieraa przed tym przypisaniem, do requestedFloor.
public Person()
{
randomNumberGenerator = new System.Random();
}
169
NewFloorRequest() zdefiniowana w wierszach od 42. do 46. bdzie po wywoaniu generowaa i zwracaa liczb losow, ktra wskazuje nowe pitro dane przez
passenger. Wiersz 45. znajduje liczb losow z zakresu od 1 do 30 (podanego
w nawiasie .Next(1,30)). Sowo kluczowe return wysya t liczb losow z powrotem do wywoujcego, ktrym w tym przypadku jest metoda InitiateNewFloorRequest() obiektu Elevator. Nie bdziemy tutaj omawia bliszych szczegw
klasy System.Random. Zainteresowanych bliszym zbadaniem tej klasy odsyam
do dokumentacji .NET Framework.
42:
43:
44:
45:
46:
Uwaga!
Programista, ktry implementuje klas Elevator, wykorzystuje metod NewFloorRequest() obiektu Person. Jednak nie musi zna definicji metody, aby j
zastosowa. Najprawdopodobniej nie bdzie go interesowa, w jaki sposb obiekt
Person decyduje o zwracanych wartociach i z powodzeniem moe nie zdawa
sobie sprawy z generatorw liczb losowych i tym podobnych. Nagwek metody
i krtki opis intencji metody w zupenoci mu wystarczy. Na informacje, w jaki
sposb jest realizowana intencja, nie ma tutaj miejsca.
Nagwek metody tworzy umow z jej uytkownikiem. Nadaje metodzie nazw
i decyduje o tym, ile argumentw naley wysa za pomoc wywoania metody.
Nastpnie metoda obiecuje, e albo nie zwrci adnej wartoci (jeeli jest okrelona jako void), albo zwrci jedn warto okrelonego typu.
Take pod warunkiem, e nie majstrujemy przy nagwku metody (nie zmieniamy nazwy metody, liczby ani typu jej parametrw formalnych lub typu zwracania), moemy tworzy wszystkie rodzaje zawiych procesw pozwalajcych
obiektowi Person decydowa o nastpnym pitrze przeznaczenia.
170
61:
62:
63:
elevatorA.InitiateNewFloorRequest();
elevatorA.ReportStatistic();
}
Nawet wtedy, gdy Main() znajduje si, jak w tym przypadku, na kocu programu,
to zawsze zawiera instrukcje, ktre maj by wykonane jako pierwsze po uruchomieniu programu. Na Main() mona spojrze jak na punkt kontrolny caego programu.
Aby kierowa oglnym przebiegiem wykonania, wykorzystuje ona oglne funkcje
innych klas w programie.
W skrcie, metoda Main() tworzy pocztkowo obiekt Elevator i przypisuje go do
elevatorA (wiersz 55.); kae mu wpuci pasaera (wiersz 56.); prosi elevatorA,
aby zada nastpnego pitra i wykona to pi razy (wiersze od 57. do 61.); a na
koniec prosi obiekt Elevator, aby poda statystyk, ktr zebra w czasie tych piciu
jazd (wiersz 62.).
Prosz zwrci uwag, e metoda Main() stosunkowo atwo prowadzi t symulacj.
Wszystkie trudne, szczegowe prace s wykonywane w klasach Elevator i Person.
Zwizek Building-Elevator
Typowy budynek skada si z wielu rnych czci, takich jak pitra, ciany, sufity,
dach i czasami windy. W naszym przypadku mona powiedzie, e Building, ktry
symulujemy, posiada Elevator jako jedn ze swoich czci. Czasami nazywa si
171
Dziki temu Building moe zawiera obiekt Elevator i wywoywa jego metody
public. Klasa moe mie wiele rnych zmiennych instancji zawierajcych wiele
obiektw rnych klas. Moglibymy np. rwnie wyposay Building w zmienne
instancji reprezentujce liczb obiektw Floor. Ta idea konstruowania klasy (Building) za pomoc innych klas (Elevator lub Floor albo obu i wielu innych)
nazywa si oglnie agregacj, a towarzyszce jej zalenoci to zwizki agregacyjne.
Jeeli zwizek agregacyjny (jak w przypadku zwizku Building-Elevator) odzwierciedla sytuacj, gdzie jedna klasa jest integraln czci innej, moemy nazwa t
agregacj kompozycj. (Zaraz zobaczymy, dlaczego zwizek Elevator-Person jest
agregacj, ale nie jest kompozycj.) Zwizek kompozycyjny mona zilustrowa za
pomoc schematu klasy zunifikowanego jzyka modelowania (Unified Modeling
Language UML), pokazanego na rysunku 5.3. Dwie prostoktne ramki symbolizuj
klasy, a czca je linia z czarnym rombem (wskazujcym na ca klas) ilustruje zwizek kompozycyjny midzy klasami. Obie klasy s oznaczone liczb 1, aby wskaza,
e jeden Building (budynek) ma jedn Elevator (wind).
RYSUNEK 5.3.
Diagram UML
symbolizujcy
kompozycj
172
Aby skutecznie zaprezentowa zwizki klas i ca architektur programu obiektowego, potrzebujemy jzyka, ktry umoliwia abstrahowanie od wewntrznych
szczegw metod, a zamiast tego zapewnia rodki do wyraania zwizkw klas
i poj obiektowych na odpowiednim poziomie szczegowoci. W tym celu wikszo programistw obiektowych, bez wzgldu na swj jzyk programowania, stosuje
obecnie jzyk przedstawiania graficznego o nazwie zunifikowany jzyk modelowania
(Unified Modeling Language UML). UML to jzyk o wielu cechach i potrzebna
jest caa ksika, aby go wystarczajco zaprezentowa; tu przedstawiono tylko
may podzestaw UML.
Szczegowe informacje o UML mona uzyska w niedochodowej organizacji Object
Management Group (OMG) (www.omg.org) na stronie www.omg.org/uml. Napisano
wiele dobrych ksiek o UML, m.in. The Unified Modeling Language User Guide,
ktr napisali twrcy UML, Grady Booch, James Rumbaugh i Ivar Jacobson.
Zwizek Elevator-Person
Przycisk jest integraln czci windy, ale pasaer ju nie. (Winda jest czynna bez
pasaera, ale nie bez przyciskw). Wic gdybymy nawet w naszej implementacji
(z powodw abstrakcyjnych) uczynili pasaera permanentn czci Elevator
(obiekt Person pozostaje wewntrz Elevator przez ca symulacj), nie jest to
zwizek kompozycyjny, a jedynie agregacja. Zwizek ten ilustruje UML na rysunku 5.4. Prosz zwrci uwag, e biay romb, w przeciwiestwie do czarnego rombu
na rysunku 5.3, symbolizuje agregacj.
RYSUNEK 5.4.
Diagram UML
symbolizujcy
agregacj
Cay schemat klasy UML dla programu z listingu 5.1 zosta pokazany na rysunku 5.5.
UML umoliwia, tak jak to pokazano, podzielenie prostokta reprezentujcego klas
na trzy przedziay grny przedzia zawiera nazw klasy, w rodkowym mieszcz
si zmienne instancji (lub atrybuty), a w dolnym metody (zachowanie) nalece
do klasy.
Asocjacje
Stae zwizki midzy klasami, takie jak zwizki agregacyjne i kompozycyjne, omwione w poprzednich rozdziaach, s oglnie nazywane zwizkami strukturalnymi lub,
bardziej oficjalnie, asocjacjami. Istniej jednak inne typy asocjacji, ktre nie s agregacjami (a wic nie s rwnie kompozycjami). Aby da przykad takiej asocjacji,
rozwamy nastpujcy scenariusz. Chcemy uczyni nasz symulacj windy bardziej
realistyczn, zatem zmieniamy pokazan wczeniej pocztkow list abstrakcji,
173
RYSUNEK 5.5.
Diagram UML klas
z listingu 5.1
RYSUNEK 5.6.
Asocjacja klas
Elevator/Person
174
Uwaga!
Asocjacje, ktre precyzyjnie cz dwie klasy, nazywaj si asocjacjami binarnymi; jest to najpopularniejszy rodzaj asocjacji.
Podsumowanie
Ten rozdzia skada si z dwch gwnych czci. Pierwsza dotyczy leksykalnej
struktury programu rdowego C#. W drugiej czci zamieszczono przykad programu obiektowego, ktry jest bezporednio zwizany z dyskusj z rozdziau 3.
o abstrakcji i hermetyzacji.
Poniej przedstawiono najwaniejsze zagadnienia omwione w tym rozdziale.
Na program rdowy C# mona popatrze jak na zbir identyfikatorw, sw kluczowych, odstpw, komentarzy, literaw, operatorw i separatorw.
C# jest jzykiem rozrniajcym mae i wielkie litery. Aby kod by klarowniejszy
dla innych czytelnikw, wane jest, aby zachowa pewien styl stosowania maych
i wielkich liter. Preferowanymi stylami, ktre s uywane w rnych konstrukcjach
C#, s style Pascal (ToJestStylPascal) i Camel (toJestStylCamel).
Litera ma warto, ktra jest zapisana w kodzie rdowym (co widzisz, to otrzymasz).
Przykadem literau moe by warto 10 lub warto To jest pies.
Separatory, takie jak redniki (;), przecinki (,) i kropki (.),w C# oddzielaj od siebie rne elementy.
Operatory dziaaj na argumenty. Argumenty cz si z operatorami, tworzc wyraenia.
Zmienne instancji musz by inicjalizowane przy tworzeniu obiektu. Odbywa si
to albo automatycznie, przez rodowisko uruchomieniowe, albo przez inicjalizacj
podczas deklaracji, albo za pomoc konstruktora klasy.
Obiekt moe zawiera referencj do innego obiektu w zmiennej instancji. Taki stay
zwizek nazywa si asocjacj.
Obiekt tworzy si przy uyciu sowa kluczowego new.
W programie obiektowym klasy wsppracuj w celu zapewnienia funkcjonalnoci
programu.
Dwie klasy mog wsppracowa poprzez pozostawanie w zwizku.
Czstymi zwizkami asocjacyjnymi s agregacje i kompozycje.
175
Zunifikowany jzyk modelowania (ang. Unified Modeling Language UML) jest dotd
najpopularniejszym jzykiem modelowania graficznego, stosowanym do wyraania
i ilustrowania projektw programw obiektowych.
Pytania kontrolne
1. Co to jest analiza leksykalna?
2. Jakie s niepodzielne czci programu C#?
3. Co to s style Pascal i Camel? Dla jakich czci programu C# naley je stosowa?
4. Jaka jest gwna rnica midzy zmiennymi a literaami?
5. Co to s operatory i argumenty? Jaki jest midzy nimi zwizek?
6. Czy 50 jest wyraeniem? A (50 + x)? Czy jest typu public?
7. Podaj przykady typowych sw kluczowych w C#.
8. Dlaczego pseudokod nie nadaje si do wyraania oglnej konstrukcji programu
obiektowego?
9. Jakiego rodzaju zwizek istnieje midzy obiektem KlientBanku a obiektem
wiczenia z programowania
Spraw poprzez zmian kodu rdowego, aby program z listingu 5.1 realizowa nastpujce funkcje.
1. Wydrukuj Zacza si symulacja na konsoli polece zaraz po uruchomieniu
programu.
2. Wydrukuj Symulacja skoczya si jako ostatni rzecz, tu przed zako-
czeniem programu.
3. Zamiast wybiera pitra z zakresu od 1 do 30, niech klasa Person wybiera pitra
od 0 do 50.
176
4. Przy pierwszej jedzie winda rusza z pitra numer 0 zamiast z pitra numer 1.
5. Obiekt Elevator wykonuje 10 jazd zamiast obecnych 5.
6. Obecnie Elevator zlicza wszystkie przebyte pitra za pomoc zmiennej to-
powinien drukowa:
WindaA: Odjedam z pitra: 2 Jad na: 24