2012-06-09 23 views
5

Mam świadomość odwołań cyklicznych (klasa a posiada klasę b i klasa b zawiera klasę a). Ale ponieważ nie zaprogramowałem wystarczająco dużo, trudno mi znaleźć powody, by z nich skorzystać. Zastanawiałem się, czy ludzie mogą podać mi jakieś fajne przykłady i ewentualnie wyjaśnić powody ich używania.Powód odwołań cyklicznych z klasami?

Na przykład teraz zajmuję się samouczkami kodu źródłowego 2D, a użytkownik utworzył klasę Creature i CreatureAi, które się do siebie odwołują. Z jakiego powodu? Jeszcze nie wiem, dlatego szukam przykładów i wciąż czytam.

Odpowiedz

10

Najbardziej oczywistym przypadkiem odwołania cyklicznego jest samo-odniesienie: potrzebujesz go dla połączonych list, drzew i wielu innych struktur rekursywnych.

Kółkowe odniesienia często są niejawne w obrębie hierarchii klas, takich jak elementy interfejsu użytkownika z arbitralnym zagnieżdżaniem lub drzewa wyrażeń.

Wreszcie, częstym przypadkiem odwołania cyklicznego jest dwukierunkowa relacja rodzic-dziecko: rodzic (np. Panel interfejsu użytkownika) zawiera odniesienie do tablicy jego elementów podrzędnych, a każde dziecko (np. Przyciski, tabele itd.) Zatrzymuje odniesienia do rodzica. Rodzic musi przesłać swoim dzieciom wnioski, aby powiedzieć im, że zostały włączone, wyłączone, widoczne lub niewidoczne; dziecko może powiadomić rodzica o konieczności zmiany rozmiaru, zmiany stanu wizualnego itp.

Ten ostatni przykład jest prawdopodobnie podobny do twojej pary Creature-CreatureAI: są one oddzielne, ponieważ ich obawy są różne, ale mają odniesienia do każdego z nich. inne, ponieważ muszą współpracować przy różnych zadaniach.

11

Masz klasę Firma zawierającą listę osób, które nad nią pracują. Każda instancja klasy Individual w kolekcji zawiera odniesienie do firmy, dla której pracują.

W ten sposób można łatwo sprawdzić, które osoby pracują, dla których firm. Należy zauważyć, że niekoniecznie jest to najlepszy projekt, szczególnie jeśli klasy są przechowywane w bazie danych przy użyciu ORM lub bazy danych dokumentów.

+0

Może to być projekt * tylko *, jeśli używasz polecenia OrmLite, w którym musisz określić relacje zagraniczne w samym kodzie. Ale tak, też tego nie lubię. – Voo

0

Często nie jest to bezwzględnie konieczne, ale zapewnia wysoki poziom wygody kodu działającego z obiektami.

Innym razem jest to naprawdę potrzebne. Na przykład niektóre relacje muszą być reprezentowane w kodzie jako struktura danych, a relacja jest refleksyjna.

2

tam dowolną ilość przyczyn cykli odniesienia własnym lub referencyjnych

  • Mogą być nieodłącznym elementem modelu domeny; na przykład ludzie mają dzieci, które są również ludźmi, foldery zawierają inne rzeczy, w tym inne foldery. Odniesienie do siebie lub cykl to naturalny sposób na wdrożenie tych rzeczy.

  • Mogą one być nieodłączne od ogólnej struktury danych lub aplikacji; na przykład. połączona lista składa się z węzłów, które zawierają odniesienia do "następnego" i "poprzedniego" węzła na liście, a to wymaga od klasy węzła odwołania się do samej siebie.

  • Uzasadnienie odwołania cyklicznego może być podstawową częścią projektu aplikacji.

  • Może to być po prostu wygoda realizacji lub historyczny artefakt poprzednich refaktur lub ewolucji kodu.

Zasadniczo trzeba szukać (całościowo) w kodzie aplikacji, aby dowiedzieć się, dlaczego istnieją te cykliczne zależności ... a jeśli są one naprawdę potrzebne.