Programowanie 2 - Ćwiczenia 6
Poprzednie
Następne
Temat: Pisanie programu obiektowego - od projektu do kodu.
Od tej pory przez kilka kolejnych zajęć będziemy rozwijać projekt oprogramowania symulującego pewną rzeczywistość wybraną podczas zajęć. Poniżej został przedstawiony schemat pracy grupy o 9:45, a po nim schemat pracy grupy o 11:30 (różni się tylko tematem projektu).
Grupa 9:45
Wskutek małej aktywności grupy wybrany został temat projektu Księgarnia
Księgarnia
Podczas zajęć ustalono, że księgarnia ma zawierać pola o następujących typach:
private String adres;
private String nazwa;
private int liczbaKsiazek;
private int rokZalozenia;
private String nazwaWlasciciela;
private int liczbaPracownikow;
Słowa kluczowe private oznaczają, iż wszystkie pola tej klasy będą widoczne tylko wewnątrz jej. W przeciwieństwie do pól i metod oznaczonych słowem kluczowym public, do których można się dostać z każdego miejsca w programie.
Konstruktor
Konstruktor to metoda, przy pomocy której tworzy się nowe obiekty danej klasy. Konstruktor jest zawsze metodą publiczną, gdyż obiekt musi być móc utworzony poza tym obiektem, gdyż inaczej nigdy nie mógłby powstać. Konstruktor to metoda o takiej samej nazwie jak klasa.
W przypadku Księgarni konstruktor powinien na wejściu przybierać tylko te parametry, które trzeba ustalić, aby móc stworzyć nową księgarnię. Są to: adres, nazwa, rok założenia i nazwa właściciela. Przyjmujemy, że podczas tworzenia księgarni liczba książek oraz liczba pracowników wynosi 0. Zatem nagłówek konstruktora może być następujący:
public Ksiegarnia(String adres_in, String nazwa_in, int rokZalozenia_in, String nazwaWlasciciela_in)
Get'y i Set'y
Ponieważ, jak już zostało wspomniane, wszystkie pola w klasie są prywatne, zatem nie można z zewnątrz zmieniać, ani nawet pobierać wartości atrybutów obiektów. Jest to oczywiście sytuacja, która może być dość uciążliwa i dlatego w paradygmacie programowania obiektowego pojawiają się tzw. metody dostępowe, czyli inaczej nazywa Get'ami i Set'ami. Są to metody przy pomocy których można pobrać lub ustawić wartości pól, nie robiąc z nimi nic poza tym:
Get - (z ang. pobierz) metoda, która pobiera wartość argumentu. Nie ma wejścia, a na wyjścia zwraca wspomnianą wartość
Set - (z and. ustaw) metoda, która ustala wartość argumentu. Nie ma wyjścia, a na wejściu pobiera wspomnianą wartość
W klasach może się zdarzyć, że nie wszystkie pola możemy chcieć udostępnić do odczytywania bądź dowolnego ustawiania spoza obiaktu. W przypadku Księgarni chcemy mieć możliwość pobrania akurat wartości wszystkich pól, natomiast dowolnie zmieniać chcemy jedynie pola adres, nazwa i nazwaWlasciciela. Pozostałe rzeczy będą się zmieniać przy pomocy innych metod (liczba książek, liczba pracowników), bądź będą niezmienne (rok założenia).
Eclipse, podobnie jak praktycznie wszystkie edytory do tworzenia oprogramowania, mają wbudowany mechanizm automatycznego tworzenia metod get i set. Aby to zrobić należy kliknąć prawym przyciskiem myszy na nazwę klasy, a potem Source->Getters and Setters. Po wybraniu pojawi się okienko, w którym trzeba wyklikać, do których pól chcemy stworzyć jakie metody dostępowe.
Metody
Podczas zajęć ustalono, że do księgarni, na tym etapie rozwoju aplikacji, potrzebne będą 3 metody, których opis i nagłówki znajdują się poniżej:
1. ZrobDostaweKsiazek
Metoda, która zwiększy liczbę książek w księgarni o pewną ustaloną wartość. Na wejściu musi pobrać liczbę książek, które są dokładane do księgozbioru, a na wyjściu nie musi nic zwracać. Nagłówek metody:
public void ZrobDostaweKsiazek(int ile)
2. SprzedajKsiazki
Metoda, która sprzedaje książki, czyli zmniejsza ich liczbę o pewną ustaloną wartość. W przypadku, gdy w księgarni nie ma wystarczającej liczby książek sprzedawane są wszystkie książki z księgarni, ale nie więcej niż taka liczba. Metoda na wejściu musi pobrać liczbę książek, które są sprzedawane, a na wyjściu nie musi nic zwracać, ale może liczbę sprzedanych książek. Przykładowy nagłówek metody:
public int SprzedajKsiazki(int ile)
2. ZatrudnijPracownika
Metoda, która zatrudnia nowego pracownika, czyli zwiększa ich liczbę o jeden. Metoda ta nie musi posiadać wejścia ani wyjścia. Nagłówek metody:
public void ZatrudnijPracownika()
Uruchomienie programu
Do tej pory tworzona była rzeczywistość księgarni, która była jedynie opisem tego, co w księgarni jest i co się może w niej dziać. Oczywiście w tej klasie pod żadnym pozorem nie może się znaleźć metoda main, która uruchamia program. Do stworzenia tej metody musi zostać utworzona oddzielna klasa, która będzie odpowiedzialna za uruchamianie programu.
W funkcji main powinny się znaleźć następujące rzeczy:
1. Sczytanie z klawiatury wszystkich danych niezbędnych do założenia księgarni.
2. Stworzenie księgarni poprzez wywołanie kontruktora.
Szkielet kodu może wyglądać następująco:
public static void main(String[] args) throws IOException
{
java.io.BufferedReader klawiatura = new java.io.BufferedReader(new java.io.InputStreamReader(System.in));
System.out.println("Podaj nazwę Księgarni:");
String nazwa = klawiatura.readLine();
System.out.println("Podaj rok założenia:");
int rok = Integer.parseInt(klawiatura.readLine());
//(...) sczytanie pozostałych zmiennych
Ksiegarnia nowaKsiegarnia = new Ksiegarnia(??? parametry wejściowe konstruktora ???);
}
Zadanie 6 (dla osób z grupy o 9:45)
Napisz program realizujący wszystko, co zostało do tej pory opisane
Grupa 11:30
Podczas zajęć grupa na temat projektu wybrała symulację życia Żachwy (tutaj nieco więcej na ich temat). Cechą charakterystyczną żachw jest to, że jako larwa pływają sobie swobodnie w morzu, a po znalezieniu odpowiedniego miejsca przytwierdzają się do podłoża, po czym zjadają własny mózg i zaczynają się rozmnażać.
Żachwa
Podczas zajęć ustalono, że Żachwa ma zawierać pola o następujących typach:
private int wysokosc;
private int szerokosc;
private String nazwaWlasciciela;
private boolean przytwierdzenie; // true = przytwierdzony, false = nieptrzytwierdzony
private double iloscMozgu; //0 = brak mózgu, 1 = cały mózg
private int liczbaDzieci;
Słowa kluczowe private oznaczają, iż wszystkie pola tej klasy będą widoczne tylko wewnątrz jej. W przeciwieństwie do pól i metod oznaczonych słowem kluczowym public, do których można się dostać z każdego miejsca w programie.
Konstruktor
Konstruktor to metoda, przy pomocy której tworzy się nowe obiekty danej klasy. Konstruktor jest zawsze metodą publiczną, gdyż obiekt musi być móc utworzony poza tym obiektem, gdyż inaczej nigdy nie mógłby powstać. Konstruktor to metoda o takiej samej nazwie jak klasa.
W przypadku Żachwy konstruktor powinien na wejściu przybierać tylko te parametry, które trzeba ustalić, aby móc stworzyć nową Żachwę. Są to: wysokość, szerokość i nazwa właściciela. Przyjmujemy, że podczas tworzenia Żachwy jest ona nieprzytwierdzona, ma cały mózg oraz nie ma dzieci. Zatem nagłówek konstruktora może być następujący:
public Zachwa(int wysokosc_in, int szerokosc_in, String nazwaWlasciciela_in)
Get'y i Set'y
Ponieważ, jak już zostało wspomniane, wszystkie pola w klasie są prywatne, zatem nie można z zewnątrz zmieniać, ani nawet pobierać wartości atrybutów obiektów. Jest to oczywiście sytuacja, która może być dość uciążliwa i dlatego w paradygmacie programowania obiektowego pojawiają się tzw. metody dostępowe, czyli inaczej nazywa Get'ami i Set'ami. Są to metody przy pomocy których można pobrać lub ustawić wartości pól, nie robiąc z nimi nic poza tym:
Get - (z ang. pobierz) metoda, która pobiera wartość argumentu. Nie ma wejścia, a na wyjścia zwraca wspomnianą wartość
Set - (z ang. ustaw) metoda, która ustala wartość argumentu. Nie ma wyjścia, a na wejściu pobiera wspomnianą wartość
Is - (z ang. jest) wyjątek od get, w przypadku argumentów typu boolean zamiast Get używa się czasem metody Is
W klasach może się zdarzyć, że nie wszystkie pola możemy chcieć udostępnić do odczytywania bądź dowolnego ustawiania spoza obiaktu. W przypadku Żachwy chcemy mieć możliwość pobrania akurat wartości wszystkich pól, natomiast dowolnie zmieniać chcemy jedynie pola wysokość, szerokość i nazwę właściciela. Pozostałe rzeczy będą się zmieniać przy pomocy innych metod (przytwierdzenie, ilość mózgu, liczba dzieci).
Eclipse, podobnie jak praktycznie wszystkie edytory do tworzenia oprogramowania, mają wbudowany mechanizm automatycznego tworzenia metod get i set. Aby to zrobić należy kliknąć prawym przyciskiem myszy na nazwę klasy, a potem Source->Getters and Setters. Po wybraniu pojawi się okienko, w którym trzeba wyklikać, do których pól chcemy stworzyć jakie metody dostępowe.
Metody
Podczas zajęć ustalono, że do Żachwy, na tym etapie rozwoju aplikacji, potrzebne będą 3 metody, których opis i nagłówki znajdują się poniżej:
1. Przytwierdz
Metoda, która przytwierdza Żachwę do podłoża. Metoda ta nie musi posiadać wejścia ani wyjścia. Nagłówek metody:
public void Przytwierdz()
2. ZjedzKawalekMozgu
Metoda, która powoduje, że żachwa zjada kawałek swojego mózgu. Należy pamiętać, że Żachwa może zjadać swój mózg tylko w przypadku, gdy jest ona przytwierdzona do podłoża. Również w przypadku, gdy Żachwa nie ma już takiej ilości mózgu, jaką chciałaby zjeść wówczas zjada cały dostępny kawałek mózgu, ale nie więcej niż ma. Metoda na wejściu musi pobrać ilość zjadanego mózgu, a na wyjściu nie musi nic zwracać, ale może ilość zjedzonego mózgu. Przykładowy nagłówek metody:
public double ZjedzKawalekMozgu(double ile)
2. ZrobDzieci
Metoda, dzięki której Żachwa się rozmnaża i robi sobie dzieci, czyli nowe Żachwy. Metoda ta nie musi posiadać wyjścia, natomiast na wejściu powinna posiadać liczbę dzieci, które się rodzą. Nagłówek metody:
public void ZrobDzieci(int ile)
Uruchomienie programu
Do tej pory tworzona była rzeczywistość Żachwy, która była jedynie opisem tego, czym jest Żachwa i co się z nią może dziać. Oczywiście w tej klasie pod żadnym pozorem nie może się znaleźć metoda main, która uruchamia program. Do stworzenia tej metody musi zostać utworzona oddzielna klasa, która będzie odpowiedzialna za uruchamianie programu.
W funkcji main powinny się znaleźć następujące rzeczy:
1. Sczytanie z klawiatury wszystkich danych niezbędnych do stworzenia Żachwy.
2. Stworzenie Żachwy poprzez wywołanie kontruktora.
Szkielet kodu może wyglądać następująco:
public static void main(String[] args) throws IOException
{
java.io.BufferedReader klawiatura = new java.io.BufferedReader(new java.io.InputStreamReader(System.in));
System.out.println("Podaj wysokość żachwy");
int wysokosc = Integer.parseInt(klawiatura.readLine());
System.out.println("Podaj właściciela żachwy");
String nazwa = klawiatura.readLine();
//(...) sczytanie pozostałych zmiennych
Zachwa nowaZachwa = new Zachwa(??? parametry wejściowe konstruktora ???);
}
Zadanie 6 (dla osób z grupy o 11:30)
Napisz program realizujący wszystko, co zostało do tej pory opisane