Efektywniejsze przekazanie argumentu/`pola obieku` do funkcji i sposób na czysty kod

0

Mam pytanie co będzie lepsze?

public boolean collision() {
            if(creature1.x > creature2.x ) {
                return true;
            } else {
                return false;
            };
    }

czy

public boolean collision(Creature cr1, Creature cr2) {
            if(cr1.x > cr2.x )) {
                return true;
            } else {
                return false;
            };
    }

Czy po przerobieniu książki ClearCode takie problemy się wyjaśnią czy może macie jakieś źródła z których dowiem się jak pisać naprawdę "poprawny kod"
0

Jeśli już mamy wybierać, to lepsze byłoby drugie rozwiązanie, gdyż nie zależy od stanu obiektu, tylko od argumentów wejściowych do metody - podejście bardziej funkcyjne i lepiej testowalne.

Można oczywiście kilka rzeczy ulepszyć jeszcze:

  • Po co przekazywać całe obiekty Creature, skoro potrzebne tam są tylko pojedyncze pola z każdego tego obiektu - lepiej przekazać same te wartości (załóżmy że to inty)
  • niepotrzebny if, można zwrócić po prostu condition (który to, przyjmie oczywiście wartość true/false)

Także takie coś by było spoko:

public boolean collision(int x1, int x2) {
            return x1 > x2;
    }

można by zmienić jeszcze nazwę parametrów (samo x1, x2 może być potem łatwe do pomylenia się)

1

Pytanie czemu by nie zrobić tego w ten sposób:

(...)
creature1.collidesWith(creature2);
(...)
boolean collidesWith(Creature other) {
    return x > other.x;
}

zakładając, że Creature to pełnoprawny obiekt to czy on nie jest odpowiedzialny za posiadanie wiedzy czy koliduje z innym, jeżeli to jest odpowiednia warstwa abstrakcji? No i tak, clean code jest spoko książką, oczywiscie nie wyczerpie ona wszystkich wątpliwości, ale IMHO warto przeczytać

0

Te źródła to zdrowy rozsądek i praktyka. Nie użyłbym żadnej z wymienionych metod, choćby dlatego że jest to mylące - collision a później liczysz maksa z "x". Czym jest "x"? Jaki jest większy kontekst? Robienie metody która policzy która z liczb jest większa jest trochę bez sensu. Stawiam na to że gdzieś tam jest większy kontekst który można by opakować funkcyjnie czy cuś.

0

Zadna :)

  1. W grze masz przewaznie duuuzo obiektow ktore moga sie zderzac, wiec co zrobisz kilkadziesiat/set takich funkcji?
  2. Spora szansa ze sprawdzenie tylko x nie wystarczy.
  3. Raczej bardziej generyczna metoda, bo oporcz stworkow bedziesz mogl pewnie kolidowac z drzewami/pociskami itp.
  4. Jesli obiekt jest wiekszy musisz sprawdzac czy nie zderza sie ksztalt ktory go otacza (przewaznie prostokat).
  5. Silniki/biblioteki maja metody do tego, jesli to nie w celach rozwoju lepiej uzyc cos gotowego
  6. ... a jak przyjdzie co do czego to i tak kombinujesz by nie sprawdzac wszystkich kolizji chocby grupujac obiekty itp. W gamedevie czesto obiekty sa mozliwie glupie/proste i jest jakis watek robiacy specyficzna akcje co okreslona liczbe klatek (jak np. sprawdzanie kolizji). I po prostu przetwarzasz cala kolekcje obiektow.
  7. sama nazwa funkcji jest mylaca
0

Moja propozycja - tylko w celach edukacyjnych, zgadzam się z tym że powinno się wykorzystywać wykrywanie kolizji wbudowane w framework:

public class GreatCreatureCollider implements CreatureCollider {

	public Optional<Boolean> isCollisionDetected(Creature cr1, Creature cr2) {
        return Optional.of(cr1.x > cr2.x);
    }        
}

Założenia:

  • może być wiele takich klas (implementujących CreatureCollider)
  • każda z tych klas może stwierdzić "nie wiem jak to zrobić" (Optional)

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