2017-07-19 15 views
5

Niedawno kodowałem przy pomocy API Bukkit, jednak moje pytanie nie jest bezpośrednio z nim związane.Przekazywanie instancji przez konstruktory lub uzyskiwanie do niej dostępu statycznego?

W interfejsie API Bukkit można mieć jedną instancję klasy głównej (new MainClass() podaje błąd), więc zastanawiałem się, czy lepiej dla mnie przekazać główną klasę do wszystkich moich klas przy użyciu konstruktora, LUB czy powinienem po prostu użyć statycznej metody, która zwraca instancję (MainClass.getInstance())

Jestem ciekawy, który z nich jest lepszy (pod względem wydajności i praktyki).

+0

Powinieneś [przekazać] (https://en.m.wikipedia.org/wiki/Dependency_injection), ale powinieneś [przekazywać tylko to, co jest potrzebne] (https://en.m.wikipedia.org/wiki/Law_of_Demeter) zamiast przekazywać swój "główny" obiekt do wszystkich innych instancji, a następnie wywoływanie tych instancji w wewnętrznych obiektach głównego obiektu. –

+0

@VinceEmigh Lepiej wdrożyć singleton? –

+0

@SureshAtta To wprowadziłoby stan globalny, który sprawia, że ​​kod jest trudniejszy do sprawdzenia (https://softwareengineering.stackexchange.com/questions/148108/why-is-global-state-so-evil). Byłoby to nadużyciem wzorca (dlatego jest teraz [uważane za anty-wzór] (https://stackoverflow.com/questions/12755539/why-is-singleton-considered-an-anti-pattern)). [Zalecaną alternatywą będzie DI] (https://stackoverflow.com/questions/1300655/whats-alternative-to-singleton), a konkretnie przekazanie tylko tego, co jest potrzebne (a nie samego samego) do zmniejszenia ekspozycji –

Odpowiedz

3

lepszym rozwiązaniem, jeśli chodzi o praktykę, będzie Twoja pierwsza sugestia:

Hasło główne klasy dla wszystkich moich klas przy użyciu konstruktora

To się nazywa dependency injection, i jest preferred alternative over global access.

Zniechęca to nadmierne naświetlanie (zachęca encapsulation, co jest dobre) i ułatwia testowanie, zezwalając na natural mocking (w przeciwieństwie do korzystania z frameworka takiego jak PowerMock). Zaleca się stosowanie tego podejścia, jeśli to możliwe.


Co do drugiego sugestia:

powinienem po prostu użyć statycznej metody, która zwraca instancję

Takie podejście wydaje się być mile widziana, zwłaszcza jeśli Main jest zmienny.

Jeśli wystawiasz globalną zmienną instancję, wprowadzasz stan globalny, który tends to be a pain.

Każdy moduł, który się na nim opiera, może zostać połączony z innymi modułami, które się na nim opierają. Jest to nazywane common coupling i powinno się tego unikać, jeśli to możliwe, ponieważ jest to jedna z najściślejszych form sprzężenia.

Globalny dostęp ułatwia dostęp, ale za cenę potencjalnego zaplątania kodu. Powinno być używane tylko wtedy, gdy jest to wymagane.

Powiązane problemy