Czy wiele instrukcji użycia / importu wskazuje na nieprzyjemny zapach lub zapach kodu?

13

Zazwyczaj widzę kilka instrukcji using na górze pliku klasy. Przykład:

using System.Collections.Generic;
using System.IO;
using System.Xml.Linq;

Ale w projekcie, nad którym pracuję, kilkakrotnie widzę 20 lub więcej zastosowań / importów w jednym pliku klasy. Czy to zły projekt? Wydaje się, że klasy zaprojektowane do wykonywania jednej rzeczy powinny polegać tylko na kilku elementach.

Jon Raynor
źródło
1
Visual Studio ma opcję usuwania nieużywanych usinginstrukcji. Możesz chcieć zobaczyć, ile z tych 20 jest faktycznie używanych.
Dan Pichelman
@ Dan - Oni wszyscy są w użyciu, ponieważ użyłem ReSharpera, aby usunąć nieużywane.
Jon Raynor
Czy próbowałeś już dodać IoC, przekonwertować na iniekcję konstruktora i / lub przekonwertować niektóre punkty integracji na wbudowane lambdy, aby zobaczyć, czy zmniejszy to liczbę usinginstrukcji bez konieczności zwiększania liczby klas? Należy pamiętać, że zwiększenie liczby klas lub plików źródłowych spowoduje zwiększenie kosztów zarządzania kodem źródłowym.
rwong
2
IoC po prostu ukrywa problem.
Telastyn
1
Niektóre z tych rzeczy są prawie tylko częścią języka i stylu programowania, który zachęca, takich jak Collections.Generic i LINQ, więc niekoniecznie musiałbym się tym martwić. Prawdopodobnie skupiłbym uwagę na innych. Większość klas prawdopodobnie nie powinna wykonywać bezpośrednio operacji wejścia / wyjścia, więc być może wszędzie można znaleźć połączenie obowiązków lub słabe nakładanie warstw, ale zależy to od aplikacji.
Erik Eidt

Odpowiedzi:

21

Może to wskazywać na zły projekt, tak. Może się zdarzyć, że klasa, na którą patrzysz, robi zbyt wiele rzeczy, ale może to również oznaczać, że importowane przestrzenie nazw są naprawdę bardziej sprzężone, niż sugeruje to separacja przestrzeni nazw. Może to wynikać z nadmiernej inżynierii lub nadmiernej abstrakcji, ale może to być również projekt, który nie jest dobrze dopasowany do użycia.

To powiedziawszy, to zapach - czasami prowadzi cię do czegoś złego, a czasem jest to tylko fałszywy alarm.

Telastyn
źródło
Myślę, że prawdziwy „zapach kodu” byłby, gdyby wszystkie zaimportowane przestrzenie nazw były, lub przeważnie, miały zupełnie inny cel. Szczerze mówiąc, rzadko miałem więcej niż 6 do 8 usingw jednym pliku C #.
Greg Burghardt
2
Chciałbym dać ci drugą +1, gdybym mógł, tylko za prawidłowe użycie terminu „zapach kodu”!
Jörg W Mittag
! @Greg - Zgadzam się, że zwykle „zastosowania” są powiązane. Myślę, że w tym przypadku chodzi o abstrakcję, ponieważ około 15-20 „zastosowań” pochodzi z przestrzeni nazw aplikacji, a reszta z .NET.
Jon Raynor
2

Klasa nie powinna być większa i nie mniejsza niż to, co jest potrzebne do zapewnienia zamierzonej funkcji.

W jednej aplikacji mam klasę szyfrowania, która ma jedno zadanie: szyfrowanie danych. Pomiędzy podstawową funkcjonalnością, rejestrowaniem i obsługą wyjątków środowisko wymaga 11 różnych importów przestrzeni nazw, aby wykonać to jedno zadanie.

Trudno mi powiedzieć sobie „zminimalizuj import”. Lub ocenić sukces mojej klasy wyłącznie na podstawie liczby zaimportowanych przestrzeni nazw. Nie mogę tego słusznie wykorzystać w oderwaniu, jako wskaźnika sukcesu klasy. Dla mnie „import” oznacza środek do końca klasy. Jeśli zadanie klasy jest dobrze zdefiniowane, wszystko inne w systemie wspierającym, w tym import, załatwi się samo.

paulstgeorge
źródło