- Opracowanie: Krzysztof Molenda
- Wersja: 2018-11-03
Celem ćwiczenia jest:
- Utworzenie klasy
Kontoo podstawowej funkcjonalności. Opracowanie testów jednostkowych dla tej klasy. - Rozbudowa klasy
Kontoo dodatkowe funkcjonalności z wykorzystaniem mechanizmów dziedziczenia oraz delegacji i opracowanie odpowiednich testów jednostkowych.
Przed rozpoczęciem ćwiczenia zapoznaj się opracowaniem Unit test basics. W szczególności - zrealizuj zamieszczone tam podobne ćwiczenie (krok po kroku): The MyBank solution example. Dowiesz się, w jaki sposób należy budować testy jednostkowe w środowisku MSTest v2.
Pełne wsparcie dla procesów testowania dostarcza Visual Studio w wersji Enterprise (np. Live testing, Microsoft Fakes).
-
Utwórz solution o nazwie Bank.
-
W ramach solution utwórz projekt typu Class Library o nazwie Bank.
-
W projekcie tym utwórz publiczną klasę
Konto. -
Przyjmij, że polami są:
private string klient; //nazwa klienta private decimal bilans; //aktualny stan środków na koncie private bool zablokowane = false; //stan konta
-
Utwórz konstruktor domyślny, który nic nie robi (pusty), ale prywatny. Dzięki temu nie będzie można utworzyć konta bez podania nazwy klienta.
-
Utwórz konstruktor dwuargumentowy:
public Konto(string klient, decimal bilansNaStart = 0)
inicjujący pola obiektu.
W sumie ten pierwszy konstruktor nie będzie Ci już potrzebny i możesz go usunąć (dlaczego?).
-
Utwórz properties typu read-only, za pomocą których odczytasz nazwę klienta (
Nazwa) oraz aktualny bilans (Bilans) jak również aktualny status konta (czy jest zablokowane, czy nie). -
Opracuj metodę
void Wplata(decimal kwota), która zasila stan środków konta. Rozważ różne sytuacje, zgłaszając wyjątki w sytuacjach niewłaściwych. -
Opracuj metodę
void Wyplata(decimal kwota), która zmniejsza stan środków konta. Rozważ różne sytuacje, zgłaszając wyjątki. Pamiętaj, że nie można dokonać wypłaty z konta, jeśli nie ma na nim odpowiedniej ilości środków. -
Napisz metody
void BlokujKonto()orazvoid OdblokujKonto(), zmieniające stan polazablokowane. -
Opracuj testy jednostkowe dla metod klasy
Konto. -
Przyjmij, że na koncie, które jest zablokowane nie można wykonywać żadnych operacji (wpłata/wypłata). Skoryguj kod poprzednio opracowanych metod.
-
Sprawdź, jak zachowują się testy jednostkowe. Skoryguj je.
-
Rozbuduj kod, wprowadzając następującą funkcjonalność -
KontoPlus:- "Jednorazowy limit debetowy", ustalany indywidualnie podczas tworzenia konta, z możliwością zmiany dla już istniejącego konta (zwiększenie lub zmniejszenie).
- Umożliwia on jednorazowe zrealizowanie wypłaty przekraczającej aktualny stan środków (tzw. debet), ale nie przekraczającej kwoty ustalonego "jednorazowego limitu debetowego".
- Po wykonaniu takiej transakcji konto zostaje zablokowane.
- Konto zostanie odblokowane po wykonaniu wpłaty (wpłat), które podniosą stan środków powyżej
0. Przywrócona zostanie wtedy również funkcjonalność "jednorazowego limitu debetowego".
-
Zadanie to zrealizuj, tworząc klasę
KontoPlus, dziedziczącą z klasyKonto. -
Musisz dodać mechanizmy obsługi koncepcji "jednorazowego limitu debetowego" oraz wystąpienia takiego debetu, zmodyfikować konstruktor, metody
WplataorazWyplata. Zmodyfikuj propertyBilans, zwracający stan konta z uwzględnieniem jednorazowego limitu debetowego (formalnie, są to środki pieniężne do dyspozycji klienta). Pamiętaj o hermetyzacji. -
Opracuj testy jednostkowe dla
KontoPlus.
-
Rozbuduj kod, tworząc klasę
KontoLimit, o tej samej funkcjonalności coKontoPlus, ale tym razem nie wykorzystując mechanizmu dziedziczenia, a delegację:-
Klasa
KontoLimitzawiera prywatny obiekt typuKontooraz polelimit, określające wartość jednorazowego limitu debetowego -
Dla klasy
KontoLimitmusisz utworzyć konstruktor, tworzący obiekt typuKontooraz inicjującylimit, jak również zaprogramować stosowne metody do obsługi takiego konta (o funkcjonalności identycznej zKontoPlus).
Pamiętaj o hermetyzacji.
-
-
Opracuj testy jednostkowe dla publicznych właściwości i metod tej klasy.
Uproszczony diagram klas UML do omawianego problemu:
W projekcie konsolowym zasymuluj działanie opracowanych kont - w Main() napisz sekwencję operacji.
Zastanów się nad realizacją (w kodzie) następującego scenariusza:
-
Użytkownik ma założone
Kontomolenda = new Konto("Molenda", 100);
-
Użytkownik decyduje się na zmianę tego konta na
KontoPlus. Jakim kodem można to zrealizować? -
Użytkownik
KontoPluschce wrócić doKonto(rezygnuje z jednorazowego limitu debetowego). Jakim kodem to można zrealizować? -
Zaproponuj modyfikacje kodu (architektury biblioteki klas) tak, aby te "konwersje" były łatwo programowalne dla programistów wykorzystujących Twoją bibliotekę klas
Bankwe własnych projektach. -
Zastanów się nad analogicznym scenariuszem dla
KontoLimit.
Podpowiedzi: a może jakiś interfejsik, rzutowanie, ...