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); } }
…