Które podejście obiektowe jest poprawne

0
//SPOSOB 1
public class Player {
	public void SendMessage(Player receiver, string message) {
		this.SendMessages++;
		receiver.ReceivedMessages++;
	}
}

//SPOSOB 2
public class Player {
	public void SendMessage(Player receiver, string message) {
		this.SendMessages++;
		receiver.ReceiveMessage(this, message);
	}
	
	public void ReceiveMessage(Player sender, string message) {
		this.ReceivedMessages++;
	}
}

Domyślam się, że drugie podejście jest lepsze. Patrząc na kod innych ludzi widziałem, że np. w grach jest metoda DealDamage oraz ReceiveDamage. Czy w moim przypadku nie powinienem używać pierwszego sposobu, a jeśli tak to dlaczego?

0

Nigdy nie powinieneś stosować 1 sposobu, bo utrudni modyfikacje z czasem. Teraz możesz napisać dowolną logikę obsługi zdarzenia przez dany obiekt, a jak zrobisz tak jak w 1) to już nie. Co więcej robi sie jeszcze gorzej jak nagle chciałbyś gdzieś coś dziedziczyć choćby, bo nie da się łatwo nadpisać obsługi zdarzenia.

0

receiver.ReceivedMessages++;

to wchodzenie z butami do drugiego obiektu. Wyobraź sobie, że każdy obiekt to zamknięte pudełko i ma tylko wystające gniazdka. Te gniazdka to są metody (albo komunikaty). Wydając rozkaz receiver.ReceivedMessages++; to tak jakbyś otwierał pudełko i na siłę mu zmieniał coś w środku. Czyli obiekt staje się zależny od drugiego obiektu. Na małą skalę to ma małe znaczenie, ale jak robisz coś większego, to masz chaos.

po to są metody, żebyś tylko wydawał rozkaz do obiektu, albo powiadamiał go o czymś, a nie wciskał się, w jaki sposób on to obsłuży.

zauważ też, że do tego samego celu służą komunikaty, które wysyłasz - w zasadzie wysyłanie komunikatów a wywołanie metod to od strony koncepcji to samo (chociaż komunikaty mają większą moc, wywołania metod to takie komunikaty dla ubogich) co najwyżej w językach programowania, które nie wspierają komunikatów out of the box, trzeba je emulować.

this.SendMessages++;

lepszą nazwą byłoby SentMessages (wysłane komunikaty), teraz zmienna się nazywa SendMessages, czyli "wyślij komunikaty". Jest to mylące, bo sugeruje, że jest to metoda.

1 użytkowników online, w tym zalogowanych: 0, gości: 1