Jaka jest możliwa wada umieszczania deklaracji w wewnętrznych blokach zamiast na początku funkcji?

9

W miejscu, w którym pracuję, istnieją wyraźne wytyczne dotyczące umieszczania deklaracji zmiennych. Zgodnie z tym wymagane jest umieszczenie ich na poziomie globalnym i / lub na początku funkcji, a nie w blokach wewnętrznych (takich jak pętla for). Ponieważ zostały one określone przez osoby bardziej doświadczone niż ja, jestem pewien, że musi to być dobry powód, ale nie mogę zrozumieć, co to może być. Byłoby miło wiedzieć, czy istnieją jakieś korzyści w czasie kompilacji / w czasie, gdy są zadeklarowane w większym zakresie.

TCSGrad
źródło

Odpowiedzi:

8

Widzę dwie główne zalety:

  • Ponowne użycie nazw zmiennych z innym typem jest niemożliwe.
  • Wcześniej stało się jasne, że rutyna wymaga refaktoryzacji. Zmienne u góry dość szybko stają się dużym bałaganem, a ten bałagan jest łatwy do rozpoznania.

Każdy kompilator wart swojej soli i tak zoptymalizuje zakres zmiennych, więc jest to wyłącznie kwestia formatowania.

W przypadku moich dwóch centów wolałbym najbardziej wewnętrzną deklarację zmiennej, aby przenieść zamiar zakresu do kompilatora. Jeśli chcesz, aby zmienna była dostępna tylko w pętli, możesz złapać dowolne późniejsze odwołanie w czasie kompilacji, kiedy deklarujesz zmienną w pętli.

Thiton
źródło
3

Jedyną dotychczasową zaletą jest prostota kodu. Zawsze wiesz, gdzie szukać zmiennych deklaracji i wszyscy w zespole stosują ten sam styl kodowania. Te rzeczy ułatwiają utrzymanie kodu, ale nie jestem pewien, czy ułatwiają pisanie lepszego kodu. Nie chodzi mi o to, że piszesz gorszy kod, tylko że czasami trudniej jest napisać kod tak dobry. Niemniej jednak, jeśli zespół programistów jest duży lub jego członkowie często się zmieniają, korzystanie ze standardów kodu jest pomocne.

Gus
źródło
3

To brzmi jak decyzja o zachowaniu spójności. Zapobiega również użyciu tych samych nazw dla różnych zmiennych w sąsiednich zakresach i zwiększa czytelność. Jak wskazuje Gus, będziesz również wiedział, gdzie szukać zmiennych. Myślę, że zasada najwęższego zakresu jest lepsza, ponieważ zapobiega bałaganowi zmiennej u góry. Deklaracja najbardziej oddalona przypomina deklarowanie prywatnych członków pierwszej IMO klasy.

perreal
źródło
3

Każdy język może różnić się preferencjami stylu i praktyki. Poniżej podano zasady JSF-AV , które Stroustrup wskazuje jako preferowane przez siebie standardy kodowania.

Reguła AV 136
Declarations should be at the smallest feasible scope

Uzasadnienie tego jest opisane jako

This rule attempts to minimize the number of live variables that must be simultaneously considered. Furthermore, variable declarations should be postponed until enough information is available for full initialization

Jeśli jesteś w C ++, preferowane jest deklarowanie zmiennej, gdy jej potrzebujesz.

Clark Gable
źródło
3

Nie jestem pewien, czy możesz nazwać to najlepszą praktyką. Kiedy ustanawiam wytyczne dla nowego projektu C, zawsze stwierdzam, że lepiej jest zadeklarować zmienne blisko miejsca, w którym są używane. Z dwóch powodów ułatwia to później refaktoryzację kodu (tj. Podczas wypakowywania metody). Pomaga także kompilatorowi w lepszej optymalizacji.

Nie jestem sam z tą opinią. Oto pytanie, które rozwiązuje ten sam problem: /software/56585/where-do-you-declare-variables-the-top-of-a-method-or-when-you-need -Them Odpowiedź tutaj polega na zadeklarowaniu ich tam, gdzie ich używasz. Ta sama praktyka została opisana w książce „Clean Code” Roberta C. Martina.

Jeśli jednak używasz starszego standardu C (C-89), musisz zdefiniować zmienne lokalne u góry funkcji. Więc może wytyczna jest pozostałością z czasów, gdy używano C-89? Prawdopodobnie lepiej zapytać osobę, która napisała wytyczne, dlaczego reguła nadal tam jest.

Johan
źródło
2

Jeśli deklaracja znajduje się w klauzuli if, która jest wykonywana tylko rzadko (jeśli w ogóle), ale potrzebuje dużej ilości pamięci, twój ślad pamięci jest mniejszy (przez większość czasu) niż wtedy, gdy przydzielasz wszystko na początku funkcji.

Jeśli znajduje się w pętli, musisz wielokrotnie przydzielać pamięć, co może być kosztowne pod względem wydajności.

Istnieją powody, by robić to na dwa sposoby.

NWS
źródło
1

Stary standard C z 1989 roku dopuszcza tylko zmienne deklaracje na początku bloku.

Tylko dlatego, że deklaracje C99 są dozwolone w dowolnym miejscu. Może Twoje miejsce nie przeszło jeszcze na C99.

Patrick
źródło
Używamy C99 - ale, co ważniejsze, szukałem, jakie są implikacje zadeklarowania go w najbardziej wewnętrznym bloku, a nie na początku funkcji. Być może nie byłem wystarczająco jasny ...
TCSGrad 11.11.11
1

Wydaje się, że ci, którzy podjęli tę decyzję, są przyzwyczajeni do czasu, gdy umieszczanie deklaracji na szczycie było normą i zdecydowali się nie przełączać na preferencje, aby zadeklarować bliżej miejsca, w którym są używane.

Nie jestem pewien, jak pomocny jest ten poziom spójności. Niektóre IDE prawdopodobnie ułatwiają wyszukiwanie rzeczy niż inne. W przypadku zmiennych globalnych ma to sens, ale jeśli twoja funkcja jest tak długa, że ​​trudno jest znaleźć deklaracje zmiennych, masz większe problemy.

JeffO
źródło