Dostałem pierwszy kod programu od kolegi i z wielu wymienionych błędów najbardziej rzuca się jeden który powtarza się w każdym projekcie który sprawdzam. W 2 klasach są funkcje do dodawania asocjacji. Wywołanie 'jednej’ wywołuje 'drugą’, ale wywołanie 'drugiej’ nie wywołuje 'pierwszej’.
Przez co w projekcie o np. Schronisku [świetny pomysł do wykorzystania jak nie macie żadnego) obiekt 'Buda’ może wiedzieć jaki 'pies’ powinien w niej siedzieć, ale 'Pies’ nie wie, że ma 'budę’.
Krótki przykład z kodem kolegi przed i po przeróbkach.
UWAGA: to jest kod w pseudokodzie (prawie w C#), ale w niczym się nie odpali, można się tylko wzorować na nim i poprawić samodzielnie błąd w swoim problemie
BAARDZO WAŻNE: w kodzie przykładowym poprawiam kod który przechowuje odniesienia jako 'int’ z ID obiektu (które jest 'gdzieś tam nadawane’ unikalne) i używam 'restauracja.GetID()’, a nie referencji do obiektu (samo 'restauracja’), bo w tym projekcie jest założenie, że dane będą przechowywane w bazie danych i muszą mieć unikalne ID, a w JAVIE której większość używa trzymamy dane w pliku (ObjectPlus za to odpowiada) i powinniśmy trzymać referencje, a nie ID jakieś przechowywane w każdym obiekcie – o to może się baaaardzo czepiać przy sprawdzaniu projektów.
Czyli używamy:
private ArrayList<Student> znajomiStudenci = new ArrayList<Student>();
a nie:
private ArrayList<Integer> idZnajomiStudenci = new ArrayList<Integer>();
Teraz przejdziemy wreszcie do przykładowego kodu:
public void KLIENT.DodajUlubionaRestauracje(Restauracja restauracja)
{
// kompozycja!, zapamietujemy w Directory [HashMap w javie] jakis String unikalny i jakas wartosc/obiekt
LubianeRestauracje.Add(restauracja.GetNazwa(), restauracja.GetID());
// to jest ok, wywoluje metode w drugiej klasie
restauracja.DodajKlienta(this); // this, nie this.GetID()
}
// przekazac trzeba obiekt (Klient klient), a nie 'id' samo (int id), bo chcemy na nim cos wywolac
public void RESTAURACJA.DodajKlienta(Klient klient)
{
// tutaj lipa, nic nie wywolujemy w drugim obiekcie
Klienci.Add(klient.GetID());
/*
Co z tego wynika?
jesli jakis programista wywola:
RESTAURACJA.DodajKlienta(klientStefan);
to restauracja bedzie widziala, ze stefan ja lubi, ale stefan nie bedzie tego wiedzial
*/
}
// KOD POPRAWIONY:
public void KLIENT.DodajUlubionaRestauracje(Restauracja restauracja)
{
// dodajemy tylko jak nie mamy, dzieki temu unikniemy zapetlenia, ze funkcja X wywola Y, a Y wywola X i tak w kolko
if(!LubianeRestauracje.Contains(restauracja.GetID()))
{
LubianeRestauracje.Add(restauracja.GetNazwa(),restauracja.GetID());
// WAZNE, najpierw dodaje do swojej tablicy/listy, a potem wywoluje metode drugiego obiektu [inaczej zapetlenie]
restauracja.DodajKlienta(this);
}
}
public void RESTAURACJA.DodajKlienta(Klient klient)
{
if(!Klienci.Contains(klient.GetID()))
{
Klienci.Add(klient.GetID());
KLIENT.DodajUlubionaRestauracje(this);
}
}
…