Abstrakcja
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
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):
1 2 3 4 5 6 7 8 9 10 11 |
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ść.
1 |
Dim MojSamochod As Samochod |
1 |
Set MojSamochod = New Samochod |
1 |
MojSamochod.SpeedUp |
Hermetyzacja
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
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
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 = prvSpeed + 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
- 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.
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.
Comments 2
Witam,
przy opisie hermetyzacji w metodzie PressAccPedal jest chyba błąd w linii:
prvSpeed = pubSpeed + conStepSpeed
Moim zdaniem powinno być prvSpeed zamiast pubSpeed. Czy mam rację czy nie rozumiem?
Author
Dziękuję za uwagę.
Rzeczywiście, wkradła się literówka. Już poprawiam.