2011-09-01 13 views
7

Próbuję napisać prostą grę w piłkę i jest kilka zwojów (np. Życie w piłkę). Piłka "umiera", gdy przekroczy dolną granicę ekranu. Co mam dotąd działa, ale nie wydaje się być właściwy sposób zrobić rzeczy:Czy obiekt może się sam usunąć? W jaki sposób?

if (ball.getY() > bottomOfScreen) { 
    ball.die(); 
    remove(ball); 
} 

matrycy() metoda w zasadzie zanika kolor piłka powoli (dark_gray -> pauza (50) -> light_gray -> pauza (50)), ale w rzeczywistości nie robi nic użytecznego.

Usunięcie(), oczywiście, pozbywa się piłki z ekranu, co jest tym, czego chcę. To ma sens dla mnie, aby ten remove() był częścią metody Ball(), w przeciwieństwie do oddzielnego wywołania metody w programie głównym - ale nie jestem pewien, jak to zrobić?

Czy obiekt może sam się usunąć? A jeśli tak, to czy samobójstwo przedmiotowe jest lepsze od morderstwa przedmiotowego, z filozoficznego/metodologicznego punktu widzenia?

Dzięki!

+0

Tylko sugestia. Usunięcie powinno najpierw zapewnić, że piłka umrze, jeśli nie, to wywołaj ją metodą(), a następnie usuń. –

Odpowiedz

4

Obiekt może się usunąć, ponieważ ma pewne odniesienie do mechanizmu renderowania widoku. Próbka nie daje wystarczająco dużo informacji, więc będę przykładem jeden sposób, aby to zrobić:

public class Ball { 
    private ViewRenderer view; 

    public void remove() { 
     view.remove(this); 
    } 
} 

Ani samobójstwo ani morderstwa jest lepiej lub gorzej. To zależy od twojego projektu i wymagań.

W tej próbce chociaż, morderstwo może być korzystne ponieważ ten sposób Ball obiekt nie musi wiedzieć, w jakim kontekście jest on używany.

+1

Przepraszam, muszę to potwierdzić. Będzie działać, ale wprowadza odwołanie cykliczne - Ball ma odwołanie do ViewRenderer i (prawdopodobnie) ViewRenderer odwołanie do Ball. Takie rzeczy sprawią, że testowanie będzie bardziej skomplikowane, niż jest konieczne. – DJClayworth

+0

Dziękuję za wyjaśnienie swojego rozumowania. Masz rację, chociaż w bardziej złożonym scenariuszu (tj. Przy użyciu wzorca MVC/Observer) obiekt może zażądać usunięcia, np. Za pośrednictwem zwykłej procedury zmiany. –

2

W znaczeniu usunięcia obiektu z pamięci: nie, w Javie obsługiwanym wyłącznie przez moduł do zbierania śmieci.

Co można zrobić, to usunąć obiekt z kolekcji zawierających go, ale wymagałoby to dostępu obiektu do tych kolekcji (co w większości przypadków nie byłoby możliwe, ponieważ może być dużo zbiorów).

Polecam obiekt zawierający (ekran w twoim przypadku), aby odpytać o stan przedmiotu (kulki) danego przedmiotu i usunąć go po jego śmierci.

3

Możliwe jest stworzenie metody, w której kulka się usuwa, ale jest to złe. Aby usunąć się z ekranu, piłka musi mieć odniesienie do ekranu. Tworzy to cykliczny łańcuch referencji (Ball ma odniesienie do ekranu, ekran ma odniesienie do Ball), co sprawi, że twój projekt będzie bardziej skomplikowany, a twoje testowanie znacznie bardziej skomplikowane.

Samobójstwo jest w porządku - ekran mówi, że piłka umrze, a piłka umiera. Ale chodzi tu o usunięcie związku, a nie śmierć. Rzeczą utrzymującą związek jest ekran, a więc to powinno być rzeczą usuwania.

Pamiętaj też, że te dwie rzeczy niekoniecznie muszą się zdarzyć razem. Ekran może chcieć utrzymać martwą piłkę z jakiegoś powodu, a może zechce usunąć piłkę, która nie jest martwa. Nawet jeśli nie dzieje się to teraz w Twojej aplikacji, pozwól na taką możliwość.

1

Istnieje przypuszczalnie jakiś obiekt (np.Screen lub ViewRenderer w przykładzie Johana), który zawiera odnośnik do Ball, a usunięcie tego odnośnika musi zostać wykonane przez Screen ("morderstwo obiektu"). "Samobójstwo obiektu" oznacza Ball przekazujący wiadomość na ekran z prośbą o "zamordowanie".

Ponieważ jest to Piłka, która wie, kiedy przekroczyła granicę, ma sens (nie znając szczegółów twojego projektu), aby usunięcie zostało rozpoczęte przez Kulę. Następnie ekran może dowiedzieć się o tej zmianie jednym z kilku sposobów:

  • Ekran może odpytywać piłkę.
  • Piłka może zawierać bezpośrednie odniesienie do ekranu, co tworzy niefortunną zależność cykliczną.
  • Piłka może zawierać odniesienie do ekranu poprzez interfejs BallObserver. Jest to aplikacja z observer pattern.

Pierwszy jest najprostszy, a to sprawia, że ​​jest to dobry wybór, jeśli naturalnie wpasuje się w mechanizm malowania ekranu. Trzeci jest z zasady bardziej elastyczny, ale w praktyce może nie być potrzebna ta elastyczność. Środkowa opcja może być OK w prostym programie, ale prawdopodobnie powinieneś traktować to jako krok w drodze do trzeciej.

A jeśli masz , nie ma ma Screen (lub ViewRenderer, lub cokolwiek innego) i naprawdę oznacza "oddzielne wywołanie metody w programie głównym", to powinieneś prawdopodobnie ponownie rozważyć swój projekt.

0

Nie, przedmioty nie mogą popełnić samobójstwa. Wszelkie odniesienia do samego siebie są jedynie odniesieniem.

Aby "wyczyścić" obiekt w sobie, wystarczy wyczyścić wszystkie zmienne instancji.

Aby "wyczyścić" obiekt znajdujący się poza nim, można ustawić zmienną równą zeru.

Powiązane problemy