MAS – Mini projekt 2 – pierwsze pytanie

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

Ten wpis został opublikowany w kategorii PJWSTK – MAS. Dodaj zakładkę do bezpośredniego odnośnika.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *