- Krzysztof Molenda, 2018-07-30
- Cel dydaktyczny: analiza obcego kodu, tworzenie prostych testów jednostkowych, implementacja indeksera, implementacja interfejsu
IEnumerable
.
W załączonym kodzie zrealizowano implementację struktury danych stos w tablicy.
W folderze src/
znajdują się pliki:
IStos.cs
- interfejs stosuStosEmptyException.cs
- definiujący klasę wyjątku zgłaszanego, gdy stos jest pustyStosWTablicy.cs
- generyczna implementacja stosu, wykorzystująca jako nośnik danych tablicę
W folderze unitTest/
znajduje się plik UnitTest1.cs
, weryfikujący poprawność implementacji stosu - w oparciu o aksjomaty oraz definicje zawarte w IStos<T>
- na przykładzie stosu znaków (StosWTablicy<char>
).
Implementacja ta, aczkolwiek kompletna w sensie teoretycznym, pozbawiona jest funkcjonalności przeglądania zawartości stosu (nie działa pętla foreach
, nie mamy bezpośredniego dostępu do tablicy przechowującej elementy stosu). Dostęp do jego elementów możliwy jest dopiero po jego wyeksportowaniu do tablicy T[]
.
-
Zapoznaj się z kodem, przetestuj, wykonaj refaktoryzację według własnych zasad. Musisz zrozumieć bieżącą implementację.
-
Bieżąca implementacja przewiduje automatyczne rozszerzanie się stosu (2-krotne powiększanie się tablicy) w sytuacji wyczerpania wolnego miejsca do składowania elementów (znajdź stosowny fragment kodu). Zaimplementuj metodę
void TrimExcess()
modyfikującą stos tak, aby zajętych było ok. 90% komórek (ok. 10% było wolnych - gotowych do przyjęcia nowych elementów). Spróbuj napisać testy jednostkowe weryfikujące poprawność zaimplementowanej metody. -
Zaimplementuj indekser umożliwiający przeglądanie elementów stosu w sposób podobny do przeglądania tablic, z użyciem
[ ]
. Dodaj do interfejsu deklarację://indekser - przeciążenie operatora [] T this[int index] { get; } //read-only
Dodaj odpowiednie unit testy weryfikujące poprawność implementacji indeksera.
-
Zaimplementuj w klasie
StosWTablicy<T>
mechanizm umożliwiający przeglądanie w trybie read only elementów stosu za pomocą pętliforeach
. Realizuje się to poprzez implementację interfejsuIEnumerable<T>
. Przyjmij, że elementy będą przeglądane w kolejności od pierwszego wstawionego na stos do ostatniego:-
zrealizuj to, tworząc własny iterator implementujący
IEnumerator<T>
"od zera" - w formie prywatnej klasy wewnętrznej, -
zrealizuj to, wykorzystując indekser oraz słowo kluczowe
yield
.
-
-
Utwórz inny sposób przeglądania stosu - od ostatniego wstawionego do pierwszego, dostarczając stosowną metodę zwracającą
IEnumerable<T>
(w implementacji wykorzystaszyield
). -
Dopisz do implementacji stosu metodę:
public System.Collections.ObjectModel.ReadOnlyCollection<T> ToArrayReadOnly() { return Array.AsReadOnly(tab); }
Porównaj działanie tej metody z metodą
ToArray()
zaimplementowaną wcześniej, dlaT
- typu wartościowego oraz referencyjnego (obiekty mutables). -
Wykonaj implementację interfejsu
IStos<T>
w klasieStosWLiscie<T>
- wykorzystując jako nośnik danych, zamiast tablicy, struktury wiązane (lista węzłów). Twoja implementacja powinna również przechodzić testy jednostkowe zUnitTest1.cs
. Nie wykorzystuj gotowych kolekcji, np.LinkedList
(Twoja implementacja powinna być tzw. pierwszoklasowa).