Zastanawiam się, czy są jakieś powody (poza porządkowaniem kodu źródłowego), dla których programiści używają funkcji „Usuń nieużywane Usings
” w programie Visual Studio 2008?
Zastanawiam się, czy są jakieś powody (poza porządkowaniem kodu źródłowego), dla których programiści używają funkcji „Usuń nieużywane Usings
” w programie Visual Studio 2008?
Odpowiedzi:
Jest kilka powodów, dla których chcesz je usunąć.
using
instrukcje, gdy kod będzie się zmieniał w czasie.Z drugiej strony nie ma wielu powodów, aby je zostawić. Przypuszczam, że oszczędzasz sobie wysiłku związanego z ich usuwaniem. Ale jeśli jesteś taki leniwy, masz większe problemy!
Powiedziałbym wręcz przeciwnie - niezwykle pomocne jest usuwanie niepotrzebnych, niepotrzebnych instrukcji użycia.
Wyobraź sobie, że musisz wrócić do swojego kodu za 3, 6, 9 miesięcy - albo ktoś inny musi przejąć Twój kod i go utrzymywać.
Jeśli masz ogromną, długą listę instrukcji użycia, które nie są naprawdę potrzebne, spojrzenie na kod może być dość mylące. Dlaczego jest tam używanie, jeśli nic nie jest używane z tej przestrzeni nazw?
Wydaje mi się, że jeśli chodzi o długoterminową konserwację w środowisku zawodowym, zdecydowanie sugerowałbym, aby kod był tak czysty, jak to tylko możliwe - i obejmuje to zrzucanie z niego niepotrzebnych rzeczy. Mniej bałaganu oznacza mniej zamieszania, a tym samym wyższą łatwość konserwacji.
Marc
Wydaje mi się, że jest to bardzo rozsądne pytanie, które jest traktowane w dość nonszalancki sposób przez respondentów.
Powiedziałbym, że każda zmiana w kodzie źródłowym musi być uzasadniona. Zmiany te mogą wiązać się z ukrytymi kosztami, a osoba stawiająca pytanie chciała zostać o tym poinformowana. Nie prosili, by nazywano ich „leniwymi”, jak naśladowała jedna osoba.
Właśnie zacząłem używać Resharpera i zaczyna dawać ostrzeżenia i wskazówki dotyczące stylu projektu, za który jestem odpowiedzialny. Wśród nich jest usunięcie zbędnych dyrektyw using, ale także zbędnych kwalifikatorów, kapitalizacji i wielu innych. Mój instynkt polega na uporządkowaniu kodu i rozwiązaniu wszystkich podpowiedzi, ale głowa biznesowa ostrzega mnie przed nieuzasadnionymi zmianami.
Używamy zautomatyzowanego procesu kompilacji, a zatem każda zmiana w naszym repozytorium SVN spowodowałaby zmiany, których nie mogliśmy połączyć z projektami / błędami / problemami, i spowodowałaby automatyczne kompilacje i wydania, które nie wprowadziły żadnych zmian funkcjonalnych do poprzednich wersji.
Jeśli spojrzymy na usunięcie zbędnych kwalifikatorów, może to spowodować zamieszanie wśród programistów, ponieważ klasy nasze domeny i warstwy danych są rozróżniane tylko na podstawie kwalifikatorów.
Jeśli spojrzę na właściwe użycie wielkich liter w anachronimach (np. ABCD -> Abcd), to muszę wziąć pod uwagę, że Resharper nie refaktoryzuje żadnego z plików Xml, których używamy w nazwach klas odniesienia.
Dlatego stosowanie się do tych wskazówek nie jest tak proste, jak się wydaje, i należy je traktować z szacunkiem.
Oprócz podanych już powodów zapobiega niepotrzebnym konfliktom nazw. Rozważ ten plik:
using System.IO;
using System.Windows.Shapes;
namespace LicenseTester
{
public static class Example
{
private static string temporaryPath = Path.GetTempFileName();
}
}
Ten kod nie jest kompilowany, ponieważ oba obszary nazw System.IO i System.Windows.Shapes zawierają klasę o nazwie Path. Mogliśmy to naprawić, używając pełnej ścieżki klas,
private static string temporaryPath = System.IO.Path.GetTempFileName();
lub możemy po prostu usunąć tę linię using System.Windows.Shapes;
.
Mniej opcji w wyskakującym okienku Intellisense (szczególnie jeśli przestrzenie nazw zawierają wiele metod rozszerzenia).
Teoretycznie Intellisense też powinien być szybszy.
Usuń ich. Mniej kodu do obejrzenia i zastanowienia się oszczędza czas i nieporozumienia. Chciałbym, żeby więcej ludzi utrzymywało RZECZY PROSTE, CZYSTE i POKŁADANE. To tak, jakbyś miał w pokoju brudne koszule i spodnie. Jest brzydki i trzeba się zastanawiać, dlaczego tam jest.
Kod kompiluje się szybciej.
Niedawno dostałem kolejny powód, dla którego usuwanie nieużywanych importów jest bardzo pomocne i ważne.
Wyobraź sobie, że masz dwa zestawy, z których jeden odwołuje się do drugiego (na razie nazwijmy pierwszy A
i ten, do którego się odwołuje B
). Teraz, gdy masz kod w A, który zależy od B, wszystko jest w porządku. Jednak na pewnym etapie procesu tworzenia zauważysz, że w rzeczywistości nie potrzebujesz już tego kodu, ale pozostawiasz instrukcję using tam, gdzie była. Teraz masz nie tylko bezsensowną using
-dyrektywę, ale także odniesienie do zestawu,B
które nie jest używane nigdzie, ale w przestarzałej dyrektywie. Po pierwsze, zwiększa to ilość czasu potrzebnego na kompilację A
, która również B
musi zostać załadowana.
Jest to więc problem nie tylko z czystszym i łatwiejszym do odczytania kodem, ale także z utrzymaniem odwołań do zestawów w kodzie produkcyjnym, w którym nie wszystkie z tych zestawów w ogóle istnieją .
W końcu w naszym przykładzie musieliśmy wysłać B i A razem, chociaż B nie jest używane nigdzie w A, ale w sekcji using
. Będzie to znacznie wpłynąć na wykonawczego -przedstawienie się A
podczas ładowania zespół.
Przynajmniej w teorii, jeśli otrzymałeś plik C # .cs (lub dowolny pojedynczy plik kodu źródłowego programu), powinieneś być w stanie spojrzeć na kod i stworzyć środowisko, które symuluje wszystko, czego potrzebuje. Z niektórymi technikami kompilacji / parsowania możesz nawet stworzyć narzędzie, które zrobi to automatycznie. Jeśli przynajmniej weźmiesz to pod uwagę, możesz upewnić się, że rozumiesz wszystko, co mówi ten plik kodu.
A teraz zastanów się, czy otrzymałeś plik .cs z 1000 using
dyrektyw, z których faktycznie użyto tylko 10. Ilekroć spojrzysz na symbol, który został niedawno wprowadzony w kodzie, który odnosi się do świata zewnętrznego, będziesz musiał przejść przez te 1000 linii, aby dowiedzieć się, co to jest. To oczywiście spowalnia powyższą procedurę. Więc jeśli możesz je zmniejszyć do 10, to pomoże!
Moim zdaniem using
dyrektywa C # jest bardzo, bardzo słaba, ponieważ nie można określić pojedynczego symbolu ogólnego bez utraty generyczności i nie można użyć using
dyrektywy aliasu, aby użyć metod rozszerzających. Inaczej jest w przypadku innych języków, takich jak Java, Python i Haskell, w tych językach możesz określić (prawie) dokładnie to, czego chcesz od świata zewnętrznego. Ale w takim razie zasugeruję używanie using
aliasu, gdy tylko będzie to możliwe.