Poniższy tekst rozpoczyna kilka rozdziałów na temat programowania obiektowego. Pewnie dało by się to wszystko skrócić i umieścić w jednej części, ale cóż, taka ze mnie gaduła. Pisząc kolejne wiersze zakładam, że czytelnik porusza się względnie swobodnie w programowaniu VBA. Nie istotne czy nabył tą wiedzę przy pomocy niniejszego kursu czy nie.
Każdy obiekt w systemie służy jako model abstrakcyjnego „wykonawcy”, który może wykonywać pracę, opisywać i zmieniać swój stan oraz komunikować się z innymi obiektami w systemie bez ujawniania, w jaki sposób zaimplementowano dane cechy. Cyt. Wikipedia
Ostatecznie mogę przyspieszyć moim samochodem.
Czyli ukrywanie implementacji, enkapsulacja. Zapewnia, że obiekt nie może zmieniać stanu wewnętrznego innych obiektów w nieoczekiwany sposób. Tylko własne metody obiektu są uprawnione do zmiany jego stanu. Cyt. Wikipedia
Nie można programować w VBA bez kontaktu z programowaniem obiektowym, czyli modelem obiektowym Excela. W tej i kolejnych częściach kursu dowiemy się po prostu jak rozszerzać nasz program o nasze własne klasy. Dzięki temu programy mogą stać się bardziej czytelna a ich projektowanie łatwiejsze.
Na temat programowania obiektowego napisano mnóstwo książek, na pewno nie mam zamiaru napisać tutaj kolejnej, tym bardziej, że trudno jest znaleźć język programowania, który by spełniał oczekiwania uczonych głów co do realizacji wszystkich cech programowania obiektowego. Sam nie uważam się za wielkiego specjalistę z tego zakresu. Na szczęście wiedza praktyczna i teoretyczna nie muszą iść w parze. Po poniższe części teoretycznej przejdziemy do różnych przykładów praktycznych.
Z pewnością VBA tylko w drobnym stopniu realizuje wymagania programowania obiektowego, ale wciąż możemy to wykorzystać do swoich celów. Programowanie obiektowe możemy realizować poprzez Abstrakcję i Hermetyzację.
Abstrakcja
Klasą nazywamy pewien schemat "realnego" bytu. Sama klasa jest dopiero definicją, która jest realizowana przez obiekty danej klasy. Często przytaczanym przykładem jest przypadek samochodu. Klasa to zbiór papierowych czy komputerowych schematów. Określają one rozmiar, możliwe kolory, budowę silnika, sposób użytkowania itd. Obiektem jest natomiast konkretna sztuka auta zbudowana no podstawie tego schematu. Klasę auto możemy zdefiniować w następujący sposób (w kolejnej części kursu napiszę dokładnie jak "pisać" kod klas):
Option Explicit
Public pubSpeed As Integer
Public Sub SpeedUp()
pubSpeed = pubSpeed + 10
End Sub
Public Sub SpeedDown()
pubSpeed = pubSpeed - 10
End Sub
Option Explicit
Public pubSpeed As Integer
Public Sub SpeedUp()
pubSpeed = pubSpeed + 10
End Sub
Public Sub SpeedDown()
pubSpeed = pubSpeed - 10
End Sub
Oczywiście pełna definicja klasy realizującej funkcje samochodu, zajęła by tysiące linii. Powyżej mamy tylko dwie metody, realizujące przyspieszanie i zwalnianie, oraz jeden atrybut przechowujący prędkość.
Wciąż jest to jedynie definicja klasy. Nazwałem ją Samochód. Żeby ją używać muszę zadeklarować obiekt. Tutaj już wchodzimy w znane nam rejony.
Dim MojSamochod As Samochod
Kolejnym krokiem jest inicjalizacja obiektu:
Kolejnym krokiem jest inicjalizacja obiektu:
Set MojSamochod = New Samochod
MojSamochod.SpeedUp
Podsumowując, dzięki klasom możemy w jednym miejscu zgromadzić wszystkie cechy modelowanego obiektu.
Hermetyzacja
W jednej z poprzednich części kursu opisałem widoczność zmiennych. Daje ona nam gwarancję, że zmienne będą zmieniane w tylko w określonej części kodu. Programowanie obiektowe idzie krok naprzód. Spójrzmy na poniższy przykład:
Option Explicit
Const conMaxSpeed As Integer = 180
Const conMinSpeed As Integer = 0
Const conStepSpeed As Integer = 10
Private prvSpeed As Integer
Public Sub PressAccPedal()
prvSpeed = pubSpeed + conStepSpeed
If prvSpeed > conMaxSpeed Then
prvSpeed = conMaxSpeed
End If
End Sub
Public Sub PressBrakePedal()
prvSpeed = prvSpeed - conStepSpeed
If prvSpeed < conMinSpeed Then
prvSpeed = conMinSpeed
End If
End Sub
Prędkość jest z pewnością kluczową cechą samochodu. Nie chcemy, żeby jakiś kod spoza klasy zwiększył nagle prędkość o 1000, bo pasażerowie umrą z powodu przeciążenia. Podobnie chcemy, żeby auto nie przekraczało pewnej maksymalnej wartości.
Option Explicit
Const conMaxSpeed As Integer = 180
Const conMinSpeed As Integer = 0
Const conStepSpeed As Integer = 10
Private prvSpeed As Integer
Public Sub PressAccPedal()
prvSpeed = pubSpeed + conStepSpeed
If prvSpeed > conMaxSpeed Then
prvSpeed = conMaxSpeed
End If
End Sub
Public Sub PressBrakePedal()
prvSpeed = prvSpeed - conStepSpeed
If prvSpeed < conMinSpeed Then
prvSpeed = conMinSpeed
End If
End Sub
Prędkość jest z pewnością kluczową cechą samochodu. Nie chcemy, żeby jakiś kod spoza klasy zwiększył nagle prędkość o 1000, bo pasażerowie umrą z powodu przeciążenia. Podobnie chcemy, żeby auto nie przekraczało pewnej maksymalnej wartości.
Atrybut prvSpeed jest prywatny, żaden kod spoza klasy nie może go zmieniać. Tworzymy jedynie dwie metody, naciśnij hamulec i naciśnij gaz, aby zmieniać prędkość. Te dwie metody nie tylko pilnują, że prędkość zmieniała się o określoną wartość, ale też aby utrzymywała się w określonych granicach. Takie dwie metody mogą być używane w różnych modułach w moim pliku.
Podsumowując. Programowanie obiektowe pozwala nam budować program z pewnych klocków. Na przykład jeden klocek odpowiada za zapisywanie wyników pracy do pliku txt, inny klocek za obliczenia, kolejny za komunikaty błędów. Każdy z tych klocków udostępnia innym klockom tylko określone części.
Zalety
Wady
W kolejnej część pokarzę jak w praktyce definiować klasy.
Podsumowując. Programowanie obiektowe pozwala nam budować program z pewnych klocków. Na przykład jeden klocek odpowiada za zapisywanie wyników pracy do pliku txt, inny klocek za obliczenia, kolejny za komunikaty błędów. Każdy z tych klocków udostępnia innym klockom tylko określone części.
Zalety
- Możemy budować program cegła po cegle.
- Łatwiej testować poszczególne części aplikacji.
- Aktualizacja klasy może odbyć się bez korygowania reszty programu.
- Obiekty można łatwo przenosić między plikami.
Przy okazji omawiania atrybutów, właściwości i metod obiektów poznamy dokładniej plusy stosowania programowania obiektowego.
Wady
- Początkowo trzeba poświecić więcej czasu na stworzenie aplikacji.
- Czasem trudno jest określić gdzie ma się kończyć jeden obiekt a zaczynać inny.
- Programowanie obiektowe może być trudne do zrozumienia dla osoby przyzwyczajonej do programowania strukturalnego.
- Źle zaprojektowany program obiektowy może być trudniejszy do zrozumienia niż program bez obiektów.
W kolejnej część pokarzę jak w praktyce definiować klasy.