Marcin Barańczak

Marcin Barańczak Programista - tester
automatyzujący

Temat: rozbicie programu na klasy

Witam serdecznie.
Mam problem z podziałem informacji na klasy i niezbyt wiem jak do sprawy prawidłowo podejść. Z założenia każda klasa ma być wyspecjalizowana w robieniu pewnej rzeczy.

Przykład - program pobierający od użytkownika imię, nazwisko, kraj* i język* oraz to wyświetlający.

1. klasa z danymi czyli posiadająca pola imie, nazwisko, kraj, jezyk + setery i getery

2. klasa GuiGlowne jakoś to wszystko wyświetlająca (przykładowo w tabeli).

3. chciałbym aby możliwe kraje i języki były wcześniej zdefiniowane (przykładowo pobierane z jakiegoś pliku zewnętrznego i była możliwość dodania / modyfikacji). Innymi słowy czy potrzebuję dodatkowej klasy, która będzie zawierała dane informacje w listach (lista krajów/języków) oraz funkcje umożliwiające pobranie / modyfikację danych wpisów, czy będzie to zadanie klasy GuiGlowne?

4. dodanie wpisu miałoby pojawiać się w dodatkowym oknie (w głównym gui klikam przycisk dodaj, wyskakuje dodatkowe okno). w oknie miałoby być pole do wpisu imienia i nazwiska oraz dwie listy rozwijane z podanymi wcześniej krajami i językami. Czy to okno powinno być osobną klasą czy częścią GuiGlowne?

5. Czy potrzebuję jakiejś głównej klasy to wszystko łączącej, czy któraś z powyższych będzie spełniała to zadanie?

Z góry dziękuję za informację :)
Marcin Mackiewicz

Marcin Mackiewicz Programista JAVA, RS
Adware Polska

Temat: rozbicie programu na klasy

Pachnie mi to świątecznym piernikiem oraz prezentem w postaci MVC :)
Nie napisałeś tylko czy Java SE czy EE.
Piszę w kontekście SE + SWT...
Przygotowujesz opakowania danych:
1. Klasa przechowująca zestaw danych o osobie
class Osoba {
String IMIE;
String NAZWISKO;
String JEZYK;
String NAZWISKO;

public Osoba() {}

// Sets / Gets
}

2. Klasa przechowująca pozycję słownika
class Slownik {
public Slownik() {}

public Object getValue(Object key) {}
public Object setValue(Object key, Object value) {}
public Object getKey(Object value) {}
public boolean removeItem(Object key) {}
public Map<Object, Object> getList() {}
public List<Object> getKeys() {}
}

Przygotowujesz szereg Modułów:
1. Moduł odpowiedzialny za wczytywanie/zapisywane słowników. Tutaj klasa z parametrem w konstruktorze np. plikiem który ma być zarządzany. Robisz sobie pliki kraje_slownik.txt oraz jezyki_slownik.txt i dwa obiekty tej samej klasy (osobiście wybrałbym jakiś engine db).
class SlownikModule {
public SlownikModule(File file) {}

public Slownik Load();
public boolean Save(Slownik data);

}

SlownikModule kraje_mod = new SlownikModule(new File("kraje_slownik.txt");
SlownikModule jezyki_mod = new SlownikModule(nre File("jezyki_slownik.txt");

Slownik kraje = kraje_mod.Load();
Slownik jezyki = jezyki_mod.Load();
2. Moduł odpowiedzialny za pobieranie/przechowywanie danych o osobach. Tutaj przydałaby się klasa która łatwo integrowałaby się z widokiem tabeli oraz miała funkcje zapisu/aktualizacji danych w źródle w momencie ich dodawania
class Dane implements TableModel {
ArrayList<Osoba> list = new ArrayList<>();

public Dane() {}

// Implementacja interface
}

Teraz powinno nastąpić przygotowanie kontrolera oraz widoków. Tu zależy czy aplikacja pisana jest w modelu dwuwarstwowym czy trójwarstwowym. Przyjmuję, że dwuwarstwowym. Oznacza to, że kontroler odpowiedzialny jest za inicjację odpowiedniego modułu do obsługi danych a następnie przyjmuje dane z UI i robi z nic coś w zależności od akcji zainicjowanej przez użytkownika.

W praktyce często robię tak, że akcja typu Save czy Load znajduje się na widoku i tam przygotowywane/walidowane są dane i przekazywane do kontrolera gdzie następuje opakowanie obiektem i zapisanie przez moduł. Albo robię tak, że opakowanie danych zawiera metode walidujacą i zwraca info jaka dana jest problemem

Następna dyskusja:

dziedziczenie z klasy Socke...




Wyślij zaproszenie do