Na tym etapie prac dużą rolę odgrywa
przygotowanie wymagań i przeprowadzenie
oczekuje klient.
odpowiedniej analizy.
2. Zastosuj proste zasady
projektowania obiektowego,
by poprawić elastyczność
oprogramowania.
Kiedy oprogramowanie będzie już
możesz
działać,
odszukać w nim i usunąć
powtarzające się fragmenty kodu
upewnić
oraz
się, że zastosowałeś dobre
projektowania
techniki
3. Staraj się, by projekt
obiektowego.
oprogramowania zapewniał
łatwość jego utrzymania
i pozwalał na jego
Czy uzyskałeś dobrą aplikację obiektową,
wielokrotne stosowanie.
która robi to, co powinna? Nadszedł
czas, by zastosować wzorce i zasady,
dzięki którym upewnisz się, że Twoje
oprogramowanie jest odpowiednio
przygotowane do wieloletniego
użytkowania.
jesteś tutaj 43
Stosowanie przedstawionych wcześniej kroków
Pamiętasz Ryśka? Pamiętasz klientów, których stracił?
Wypróbujmy nasze pomysły i założenie dotyczące tworzenia doskonałego oprogramowania
i przekonajmy się, czy nadają się one do zastosowania w realnym świecie. Rysiek dostał
program do wyszukiwania gitar, który nie działa poprawnie, i to Twoim zadaniem będzie
jego poprawienie i dołożenie wszelkich starań, by stworzyć naprawdę wspaniałą aplikację.
Przyjrzyjmy się jeszcze raz programowi, jakim obecnie dysponuje Rysiek, i zobaczmy,
w czym tkwi problem:
Oto nasz program
testowy, który
uwidocznił problemy
public class FindGuitarTester {
w działaniu narzędzia
public static void main(String[] args) {
do wyszukiwania
Aplikacja Ryśka
gitar pasujących do
// Inicjalizacja magazynu gitar Ryśka
powinna dopasować
kryteriów podanych
te
wymagania…
przez użytkownika.
Inventory inventory = new Inventory();
initializeInventory(inventory);
Guitar whatEveLikes = new Guitar(””, 0, ”fender”, ”Stratocastor”,
...do tej gitary
znajdującej się
”elektryczna”, ”olcha”, ”olcha”);
w magazynie.
Guitar guitar = inventory.search(whatEveLikes);
if (guitar != null) {
inventory.addGuitar(”V95693”,
class
FingGui-
1499.95, ”Fender”, ”Stratocastor”,
tar {
”elektryczna”, ”olcha”, ”olcha”);
main()
}
FindGuitarTester.java
A zatem wykonajmy nasze trzy
podane wcześniej kroki:
1. Upewnij się, że
oprogramowanie robi to,
czego oczekuje klient.
Na razie nie zawracaj sobie
głowy stosowaniem w aplikacji
wzorców ani obiektowych
technik programowania…
skoncentruj
Pamiętaj, że musimy
2. Zastosuj proste zasady projek-
się na tym,
działała
by
tak,
zacząć od zapewnienia, by
jak powinna.
aplikacja robiła to, czego
towania obiektowego, by poprawić
oczekuje Rysiek… a nie
elastyczność oprogramowania.
ma wątpliwości, że obecna
aplikacja nie spełnia tego
warunku.
3. Staraj się, by projekt oprogramowania
zapewniał łatwość jego utrzymania
i pozwalał na jego wielokrotne stosowanie.
44
Rozdział 1.
Dobrze zaprojektowane aplikacje są super
Skoro zaczynamy od funkcjonalności, to sprawdźmy, co
się dzieje z tą niedziałającą metodą search(). Wygląda na
to, że w magazynie Ryśka nazwa producenta jest zapisana
małymi literami, a w wymaganiach klienta nazwa „Fender"
Skorzystajmy
zaczyna się z wielkiej litery. A zatem w metodzie search()
z drobnej pomocy
musimy zastosować wyszukiwanie, które nie będzie
naszych znajomych
uwzględniać wielkości liter.
programistów.
Franek: Oczywiście, to by rozwiązało bieżące problemy Ryśka, niemniej
jednak uważam, że istnieje lepszy sposób zapewnienia poprawnego działania
aplikacji niż wywoływanie metody toLowerCase() we wszystkich miejscach,
gdzie są porównywane łańcuchy znaków.
...do tej gitary
Jerzy: Właśnie, o tym samym pomyślałem. Wydaje mi się, że to całe
znajdującej się
w magazynie.
porównywanie łańcuchów znaków to nie jest najlepszy pomysł. Czy nie
moglibyśmy zastosować jakichś stałych lub jakiegoś typu wyliczeniowego do
określania producentów gitar oraz gatunków drewna?
Julka: Panowie, wybiegacie myślami zdecydowanie zbyt daleko. Krok 1.
miał polegać na poprawieniu aplikacji w taki sposób, by robiła to, czego od
niej oczekuje klient. Sądziłam, że na tym etapie prac nie będziemy zajmowali
się zagadnieniami związanymi z projektem.
Franek: Cóż, to prawda; rozumiem, że mamy się skoncentrować na
kliencie. Ale możemy przynajmniej zastanowić się, jak inteligentnie
rozwiązać aktualnie występujące problemy, nieprawdaż? Chodzi mi o to,
Franek
Julka
Jerzy
by nie tworzyć kolejnych problemów, które w przyszłości znowu będziemy
musieli rozwiązywać.
Julka: Hmm… tak, całkiem słusznie. Na pewno nie chcemy, by
zaproponowane przez nas rozwiązanie bieżących problemów powodowało
pojawienie się nowych problemów projektowych. Jednak pomimo to na razie
nie będziemy zajmowali się innymi fragmentami aplikacji, dobra?
Franek: Dobra. Możemy ograniczyć się do usunięcia tych wszystkich
łańcuchów znaków, porównywania łańcuchów znaków i problemów
Rozwiązując
związanych z wielkościami liter.
Jerzy:
istniejące problemy,
Właśnie. Jeśli zastosujemy typy wyliczeniowe, to zyskamy pewność,
że podczas określania producenta gitary, typu drewna oraz rodzaju
instrumentu będą używane wyłącznie prawidłowe wartości. W ten sposób
nie twórz nowych.
zagwarantujemy, że Rysiek będzie mógł znajdować gitary pasujące do
wymagań i oczekiwań klientów.
Julka: A jednocześnie poprawimy nieco projekt samej aplikacji… super!
A zatem — do roboty, panowie.
jesteś tutaj 45
Krok 1: Zaspokojenie potrzeb klienta
Eliminacja porównywania łańcuchów znaków
Pierwszą poprawką, jaką możemy wprowadzić w aplikacji Ryśka, jest usunięcie porównywania łańcuchów znaków. Choć można by zastosować metodę toLowerCase(), by rozwiązać problem z porównywaniem liter różnych wielkości, to jednak postaramy się w ogóle wyeliminować porównywanie łańcuchów znaków: To wszystko są
wyliczeniowe typy
Javy —
public enum Type {
enum
działają
— które
podobnie
enum
stałych.
do
ACOUSTIC, ELECTRIC;
Type {
Każdy z typów
public String toString() {
to-
wyliczeniowych
String()
switch(this) {
}
zastąpi jedną
z właściwości
case ACOUSTIC: return ”akustyczna”;
klasy Guitar,
Type.java
która jest
case ELECTRIC: return ”elektryczna”;
public enum Builder {
standardowa dla
default: return ”nieokreślona”;
enum
wszystkich jej
FENDER, MARTIN, GIBSON, COLLINGS, OLSON, RYAN, PRS, ANY;
Builder{