2015-01-15 11 views
9

mam dziedziczenie Kod ktoś inny napisał w pracy i okazało się, że istnieje wiele „nowych” instancji bez faktycznie przypisanie do zmiennej:instancji bez przypisania do zmiennej

new MyCoolClass().MyCoolMethod(); 

jestem tylko zastanawiasz się, czy ktokolwiek ma z tym jakieś doświadczenie i czy jest to anty-wzorzec, czy nie.

+4

Nie ma w tym nic złego technicznie, ale 'MyCoolMethod' powinien prawdopodobnie być metodą statyczną, ponieważ jedynym celem instancji' MyCoolClass' jest prawdopodobnie wywołanie tej metody. –

+0

@ 500-InternalServerError true. Może się jednak zdarzyć, że MyCoolMethod jest używany jako właściwa metoda instancji w innym miejscu. – usr

+0

Dla mnie jest to bardziej anty-wzór, że "MyCoolMethod" wydaje się powodować skutki uboczne na stan globalny. Nie pobiera żadnych danych wejściowych i niczego nie zwraca. Musi odczytywać i zapisywać stan globalny. – usr

Odpowiedz

9

Cóż, jeśli często nazywasz to tak, metoda powinna być prawdopodobnie metodą static, ponieważ wydaje się, że instancja nie jest używana lub co najmniej istotna. Jeśli tworzysz instancję, powinieneś jej użyć.

Chciałbym spróbować napisać tego rodzaju kod na zewnątrz. Dla wydajności i zrozumienia.

+0

Skąd wiadomo, że instancja nie jest używana wewnątrz konstruktora lub 'MyCoolMethod'? – Alex

+1

Nie, ale dlaczego to obchodzi? Dlaczego nie 'MyCoolClass.MyCoolMethod()'? –

5

W zależności od metody MyCoolMethod(). Jeśli zwróci pustkę, nie ma sensu przypisywać jej do zmiennej. Nie wiem o innych, ale używam tego dość często. Niezależnie od tego, czy jest to dobra praktyka, to jest na debatę :)

Edytuj: Zgadzam się z @Patrick Hofman. Moja odpowiedź jest właściwie wyłączona. Myślałem, że OP pyta, dlaczego nie mamy zmiennej do przechowywania tego, co MyCoolMethod() zwraca. Zobacz odpowiedź @ Patricka :)

+4

Nawet jeśli zwraca zmienną, nie ma to znaczenia. Jeśli tworzysz instancję, powinieneś jej użyć. –

+0

@PatrickHofman Jeśli metody robią [Metoda łańcuchowa] (http://en.wikipedia.org/wiki/Method_chaining) i pracujesz tylko z końcowym obiektem z łańcucha, nie ma żadnego powodu, aby zachować początkowy obiekt wokół . –

+0

@Scott: to pierwsze powinno być 'statyczne', prawda? A przy łańcuchowaniu ma cel i jest używany, ale natychmiast traci zasięg. –

1

Jeśli konstruktor lub metoda używa utworzonej instancji, nie ma w tym nic złego. Na przykład konstruktor lub metoda może przydzielać wartości do pól lub wywoływać inne metody instancji lub przekazywać instancję do innej metody, która jej używa. Jeśli instancja nigdy nie jest naprawdę używana, można ją refakturować statyczną metodą, tak jak sugerują inne odpowiedzi.

O zadaniu, dlaczego przypisałbyś instancję do zmiennej, jeśli nie będziesz potrzebować jej używać ponownie po tym wywołaniu jednej metody? Jedynym powodem, dla którego mogę myśleć, jest to, że może poprawić czytelność (lub może nie), jeśli nadasz zmiennej użyteczną nazwę.