Co powinno być w standardzie kodowania? [Zamknięte]

34

Co powinno być w dobrym (czytaj: przydatnym) standardzie kodowania?

  • Rzeczy, które powinien mieć kod.
  • Czego kod nie powinien mieć.
  • Czy standard kodowania powinien zawierać definicje rzeczy, które wymusza język, kompilator lub formatator kodu?
  • Co z danymi takimi jak złożoność cykliczna, liczba wierszy na plik itp.?
Krzyż
źródło

Odpowiedzi:

40

Powody każdego wymagania. W ten sposób przestrzeganie standardu nie staje się kultem ładunków, a ludzie wiedzą, że można zmienić standard, jeśli jego przyczyna już nie obowiązuje, lub naruszać normę w szczególnych przypadkach, w których powód wyraźnie nie ma zastosowania. .

dsimcha
źródło
3
Absolutnie. Każda pozycja w standardzie powinna mieć wyraźnie określone uzasadnienie.
AShelly
4
Czasami nie ma dobrego powodu do wyboru, ale pożądane jest, aby wszyscy zrobili to samo. Nie wiem, dlaczego wszyscy jedziemy po prawej stronie, żeby zastosować analogię do samochodu, ale jest to znacznie lepsze niż połowa z prawej i połowa z lewej.
David Thornley
9
@David: To całkowicie uzasadniony powód posiadania standardu kodowania. Jeśli to jest powód, należy to po prostu określić jako takie, tj. „Powód: Aby poprawić spójność bazy kodu”.
dsimcha
W rzeczywistości, najważniejszą rzeczą w standardzie kodowania jest to, że jest jeden. To, co tam jest, jest naprawdę drugorzędne.
Jörg W Mittag,
20

Tabs vs Spaces! Dostaję szalone aktualizacje, gdy jeden z moich kolegów przez przypadek popycha wiele tabulatorów do spacji przesuwanych do repozytorium

Fede
źródło
1
Zgadzam się z całego serca!
matiash
2
IMHO, to jedyna rzecz, która zasługuje na bycie w standardzie kodowania.
P Shved
2
IMHO to doskonały przykład tego, czego nie powinien obejmować standard kodowania .
Bjarke Freund-Hansen,
@bjarkef, wolisz mieszany kod tabulacji i spacji?
Kolejka Jé
19

Konwencje nazewnictwa

EDYCJA: Rozumiem przez to Nazewnictwo Wytyczne, a nie Nazewnictwo Reguły.

Na przykład Wytyczne byłyby All boolean values should begin with Is/Can/Has/etc when possible. Zasada byłabyAll boolean values must start with Is

Rachel
źródło
3
LPSZ * lppsz_CPP_MrKim_ClassOfStudents [] [];
Mateen Ulhaq
3
-1: To jest dokładnie ten rodzaj niskiego poziomu szczegółów, który powoduje, że programiści ignorują standardy. Równie dobrze możesz nakazać wszystkim noszenie krawatów.
TMN
2
@TMN: Brak konwencji nazewnictwa jest dokładnie tym, co powoduje, że programiści rozpaczają nad zrozumieniem kodu. Nie muszą być wybredni, ale kilka ogólnych wskazówek bardzo pomoże.
David Thornley,
1
@Rachel: Tak, mieliśmy „wszystkie właściwości boolowskie muszą zaczynać się od standardu„ Is ”. Zraniony właściwościami takimi jak IsCanUpdatei IsHasChildren. Jasne, to źle, ale zostało to określone w standardzie. I o to mi chodzi: kiedy zaczniesz sprecyzować te rzeczy, musisz upewnić się, że obejmujesz wszystkie podstawy, w przeciwnym razie ludzie napotkają coś, czego standard nie obejmuje lub źle obejmuje, a następnie albo napiszą coś złego, lub zaczną ignorować standard. Tak czy inaczej, zespół przegrywa.
TMN,
1
Dlatego uważam, że powinien on zawierać Wytyczne, a nie Reguły, jak nazwać swoje obiekty. Dokładne nazwy nadal pozostają w gestii programistów. Zmienię swoją odpowiedź.
Rachel,
10

Standard kodowania dla grupy powinien zawierać opcje kompilatora dla ostrzeżeń i błędów, które należy rozwiązać.

Programiści powinni mieć swobodę zwiększania ostrzeżeń dla własnego kodu, ale musi istnieć poziom bazowy, aby czytanie i praca z kodem innej osoby nie zaśmiecały wyników uzyskiwanych z kompilatora.

Taki standard musiałby również określać, w jaki sposób programiści mogą wyłączać takie ostrzeżenia dla poszczególnych przypadków, gdyby istniał wyjątkowy fragment kodu, który w innym przypadku nie byłby zgodny.

Macneil
źródło
Zgoda. Inną częścią, którą dodam, jest to, że jeśli pozostawiasz go przy życiu jako ostrzeżenie, należy rozwiązać ten problem, zmieniając go lub tłumiąc ostrzeżenie. W przeciwnym razie ostrzeżenia będą szybko bezużyteczne (zbyt wiele w dużym projekcie) i równie dobrze możesz je wyłączyć. W VS wolę, aby Ostrzeżenia przerywały kompilację i zmuszały cię do radzenia sobie z nimi.
MIA
Czy nie jest to coś, co należy umieścić w swoim makefile, a nie w standardzie?
Bjarke Freund-Hansen
@bjarkef: Ostatecznie opcje przejdą do pliku Makefile, tak. Ale celem wprowadzenia go do normy jest ujednolicenie tego, co należy rozwiązać. Na przykład, czy programiści powinni zawsze tworzyć identyfikatory serializacji? Zespół decyduje, czy należy to upoważnić, czy zignorować.
Macneil,
@bjarkef: Jasne, ale dobrze jest mieć je w standardowej dokumentacji, gdy rozpoczynasz nowy projekt i musisz napisać nowy plik makefile (lub twój nowy projekt używa innego narzędzia niż Make dla swojego narzędzia do budowania).
TMN,
9

Niektóre standardy mi się podobają (wiem, że jest ich dużo, ale takie właśnie preferuję):

  • 80% pokrycia testów jednostkowych
  • Zbiorowa własność kodu (napisz kod do odczytania przez kolegów z zespołu, a nie kompilatora)
  • Napisz komentarze. Napisz, co powiesz nowicjuszowi.
  • Nie komplikuj
użytkownik2567
źródło
Wymagania dotyczące pokrycia testami jednostkowymi są jedną z najlepszych rzeczy, które mogą przejść do standardów kodowania.
Adam Crossland
Odnośnie pokrycia testowego: dlaczego tylko 80%? Czy to znowu przykład reguły 80/20, gdzie według twojego doświadczenia 20% więcej wysiłku wymagałoby 100% więcej wysiłku? Jaki rodzaj ubezpieczenia? [np. zakres wyciągu? Zasięg funkcji? Zakres decyzji? Warunki ubezpieczenia?]
Macneil
@Macneil: tak, coś takiego. Odkryłem, że 80% jest „wystarczająco dobre” dla większości klas i jest to dobra liczba. Kiedyś próbowałem osiągnąć 95% i to była prawdziwa strata czasu. Oczywiście, jeśli dla niektórych klas łatwo jest osiągnąć 100%, śmiało
Więc czy to sprawozdanie obejmuje? Wydaje się, że wiele narzędzi nie daje ci więcej. Jakiego narzędzia używasz?
Macneil
Używam TestDriven.net z wbudowanym nCover
7

Standardy kodowania pomóc trochę podczas pisania kodu po raz pierwszy, one pomóc dużo gdy ty lub twój wymiana, musi 2 lata później zaktualizować kod.

Idealny standard prowadzi do kodu, w którym można przejść do dowolnej dowolnej strony w kodzie i dokładnie zrozumieć, co robi przy pierwszym czytaniu, ponieważ

  • nazwy jasno opisują, jakie dane są manipulowane,
  • szelki sprawiają, że kontrola jest czysta,
  • komentarze wyjaśniają każdy nieoczywisty algorytm itp.

Z drugiej strony zbyt wiele arbitralnych standardów może zakłócać przepływ pisania kodu. Uważam więc, że każdy element proponowanej konwencji kodowania powinien zostać oceniony na podstawie tych 2 kryteriów:

  • Czy ta reguła pomaga upewnić się, że kod jest poprawny ?
  • Czy ta reguła pomaga upewnić się, że kod jest czysty ?

Jeśli żadna z nich nie jest prawdziwa, przedmiot jest po prostu arbitralny i prawdopodobnie niepotrzebny


Do standardowego pisma dołączam następujące rzeczy:

Dla jasności:

  • Organizacja plików: Określenie stałej kolejności elementów w pliku pozwala zespołowi łatwo nawigować po innych plikach. Nie powinieneś polować, aby znaleźć #defines lub definicje struktur.

  • Konwencje nazewnictwa: Spójne nazewnictwo poprawia czytelność. Ale unikaj przesadnego określania zbyt wielu reguł, które szkodzą zapisywalności.

  • Struktura kodu. Umieszczenie nawiasów klamrowych, poziomy wcięcia, spacje vs tabulatory itp. Tak, może to być silna osobista preferencja, ale celem jest jasny kod. Znajdź najlepszą opcję dla zespołu i trzymaj się jej.

Dla poprawności:

  • Najlepsze praktyki właściwe dla danego typu problemu: Reguły dotyczące alokacji pamięci lub współbieżności lub przenośności.

  • „Const Correctnesss”, właściwe użycie statici volatileitp.

  • Reguły dotyczące makr preprocesora i innych łatwo nadużywanych funkcji języka.

AShelly
źródło
6

Inspirujące, pragmatyczne pomysły, które skłaniają ludzi do myślenia, zamiast negatywnych ograniczeń, które powstrzymują ludzi od myślenia.

W przeciwnym razie dostaniesz małpy kodowe, które boją się iść za bananami .

Alan Pearce
źródło
4

Co powinno być w standardzie kodowania? Jak najmniej. Mniej raczej więcej. I proszę z uzasadnieniem.

Nie dlatego, że jestem jakimś kowbojskim programistą, który nie chce żadnego procesu, ale dlatego, że widziałem ciężkie specyfikacje kodowania bez logiki poza tym (prawdopodobnie) „Znalazłem to w sieci gdzieś w '95”, co po prostu stało się biurokratyczny koszmar do pracy.

Niektórzy ludzie szczerze wierzą, że po podwyższeniu standardów zauważą odpowiedni wzrost „jakości” kodu i być może dzięki temu osiągną. W międzyczasie będą ignorować architekturę, wydajność, zdrowy rozsądek i kilka innych rzeczy, które w końcu mają znaczenie większe niż liczba linii w pliku.

Rodney Gitzel
źródło
3

Procedura recenzji kodu w celu egzekwowania standardu. Aha, i żeby znaleźć błędy.

Dima
źródło
3

Jakiś dobry, zdrowy rozsądek nie poszedłby źle; jest o wiele za dużo standardowych dokumentów kodujących, które pracują w nieistotnych punktach (elementy takie jak typ i rozmiar czcionki są jednymi z bardziej ekstremalnych, jakie widziałem).

Najlepszą rzeczą do zrobienia, jeśli jesteś w grupie programistów, jest rozmawianie ze sobą i patrzenie na swój kod, wypracowanie konsensusu co do akceptowalnego i jeśli musisz zapisać główne punkty jako wytyczne, ale zachowaj je jako tylko te wytyczne. Jeśli nie możesz uzasadnić rozbieżności w stosunku do wytycznych, naprawdę powinieneś rozważyć, dlaczego to robisz.

Na koniec dnia przejrzysty i zrozumiały kod jest ważniejszy niż jakakolwiek sztywna zasada dotycząca układu lub typografii.

GrumpyMonkey
źródło
W jaki sposób sprawdzany jest rodzaj i rozmiar czcionki?
Jé Queue,
@xepoch, było wizualnie w tym momencie. Powód, dla którego znajdował się w tym czasie, był dwojaki. Menedżerowi łatwiej było wtedy czytać, kiedy został wydrukowany, a krój pisma został określony, aby naprawić problemy z odstępami (wymagana była spacja), więc każda kolumna znaków ustawione w linii.
GrumpyMonkey,
o, panie - przypomina mi standard, który nakazał liczbę pustych linii między wszystkim - między metodami, z których jestem zadowolony (ponieważ wiele białych znaków pomaga odróżnić duże bloki), ale przed i po każdym bloku komentarza i po deklaracji fn, ale przed kodem funkcji itp. ... w końcu zrobiło się trochę głupio.
gbjbaanb
2

Jak wspomnieli inni, ważna jest obsługa testów kodu. Lubię też zobaczyć:

  • Struktura projektu Czy testy są częścią kodu, czy są w osobnym katalogu projektu / pakietu /? Czy kod interfejsu użytkownika działa z elementami zaplecza? Jeśli nie, w jaki sposób jest podzielony na przedziały?

  • Proces rozwoju. Pisać testy przed kodem? Czy naprawianie uszkodzonych wersji ma pierwszeństwo przed rozwojem? Kiedy wykonywane są recenzje kodu i co powinny one obejmować?

  • Zarządzanie kodem źródłowym. Co zostaje zameldowane, kiedy? Czy dokumenty projektowe i plany testów są kontrolowane pod kątem poprawek? Kiedy rozgałęziasz się i kiedy tagujesz? Czy zachowujesz poprzednie wersje, a jeśli tak, to ile / na jak długo?

  • Standardy wdrażania. Jak pakowana jest kompilacja? Co należy znaleźć w uwagach do wydania? W jaki sposób tworzone / kontrolowane / uruchamiane są skrypty aktualizacji?

Zapomnij o tych bzdurach na temat konwencji nazewnictwa, formatowania i liczby wierszy w funkcji / metodzie / module. Jedna zasada: używaj istniejącego stylu w tym, co edytujesz. Jeśli nie podoba ci się czyjś styl, rozróżnij go w recenzji kodu. Jedynym wyjątkiem może być tabulacja w porównaniu do spacji, choćby dlatego, że wielu edytorów / IDE na ślepo konwertuje jeden na drugi, a następnie niszczycie historię zmian, ponieważ każda linia została zmieniona.

TMN
źródło
2

Myślę, że w rzeczywistości są dwie rzeczy, którymi należy się zająć, i tak naprawdę rozważyłbym je oddzielnie, ponieważ nie można do nich podejść w ten sam sposób, chociaż uważam, że obie są ważne.

  • Aspekt techniczny: który ma na celu unikanie ryzykownego lub źle sformułowanego kodu (nawet jeśli został zaakceptowany przez kompilator / tłumacza)
  • Aspekt prezentacji: dotyczy samego przedstawienia programu czytelnikom

Techniczny aspekt kwalifikuję do standardu kodowania , podobnie jak Herb Sutter i Andrei Alexandrescu z ich standardami kodowania C ++ . Prezentacja, którą kwalifikuję w stylu kodowania , która obejmuje konwencję nazewnictwa, wcięcie itp.

Standard kodowania

Ponieważ jest to czysto techniczny standard kodowania może być w większości obiektywny. W związku z tym każda reguła powinna być poparta uzasadnieniem. W książce, o której mówiłem, każda pozycja ma:

  • Tytuł, prosty i na temat
  • Podsumowanie, które wyjaśnia tytuł
  • Dyskusja, która ilustruje problem postępowania w inny sposób, a tym samym przedstawia uzasadnienie
  • opcjonalne Niektóre przykłady, ponieważ dobry przykład jest wart tysiąca słów
  • opcjonalne Lista wyjątków, dla których nie można zastosować tej reguły, czasem z obejściem
  • Lista odnośników (inne książki, strony internetowe), które omawiały ten punkt

Uzasadnienie i wyjątki są bardzo ważne, ponieważ podsumowują dlaczego i kiedy.

Tytuł powinien być na tyle wyraźny, że podczas recenzji wystarczy mieć listę tytułów (ściągawka) do pracy. I oczywiście pogrupuj elementy według kategorii, aby łatwiej było na nie zwrócić uwagę.

Sutter i Alexandrescu udało się mieć listę tylko stu przedmiotów, mimo że C ++ jest uważany za włochatego;)

Styl kodowania

Ta część jest na ogół mniej obiektywna (i może być wręcz subiektywna). Chodzi tutaj o zapewnienie spójności, ponieważ pomaga to opiekunom i nowym osobom.

Nie chcesz przystępować do świętej wojny o tym, który styl wcięcia lub nawiasu klamrowego jest tutaj lepszy, istnieją na to fora: więc w tej kategorii robisz rzeczy na zasadzie konsensusu> głosowanie większością> arbitralna decyzja przywódcy (przywódców).

Przykład formatowania znajduje się na liście opcji stylu artystycznego . Idealnie byłoby, gdyby reguły były jasne i kompletne, aby program mógł przepisać kod (choć jest mało prawdopodobne, abyś go kodował;))

W przypadku konwencji nazewnictwa starałbym się łatwo odróżnić klasy / typy od zmiennych / atrybutów.

Również w tej kategorii klasyfikuję „miary”, takie jak:

  • wolą metody krótkie od długich: zazwyczaj trudno jest ustalić, jaka jest długość
  • wolą wczesny powrót / kontynuuj / przerwa, aby zmniejszyć wcięcie

Różne?

I na koniec, jest jeden element, który rzadko, jeśli w ogóle, jest omawiany w Standardach kodowania, być może dlatego, że jest specyficzny dla każdej aplikacji: organizacja kodu. Problem architektoniczny jest chyba najbardziej wybitnym problemem, zepsuć początkowy projekt, a będziesz nim nękać za wiele lat. Być może powinieneś dodać sekcję dotyczącą podstawowej obsługi plików: nagłówki publiczne / prywatne, zarządzanie zależnościami, separacja problemów, współpraca z innymi systemami lub bibliotekami ...


Ale to nic, jeśli nie są faktycznie stosowane i egzekwowane .

Wszelkie naruszenia powinny być zgłaszane podczas sprawdzania kodu, a przegląd kodu nie powinien być w porządku, jeśli naruszenie jest nierozwiązane:

  • napraw kod, aby pasował do reguły
  • napraw regułę, aby kod już się nie wyróżniał

Oczywiście zmiana reguły oznacza „pójście naprzód” od liderów.

Matthieu M.
źródło
2

Podoba mi się format w Wytycznych dotyczących projektowania ram, który zawiera ogólną sekcję i uzasadnienia dla wytycznych. Najbardziej użyteczne są szczegóły zaczynające się od Do, Do Not, Unikaj i Rozważ.

Oto przykład w sekcji Implementowanie członków interfejsu. Jawnie zawiera następujące elementy (uwaga, że ​​dla uprzejmości upuściłem uzasadnienie)

Unikaj jawnego wdrażania elementów interfejsu bez wyraźnego powodu

Rozważ wyraźne wdrożenie elementów interfejsu, jeśli elementy mają być wywoływane tylko przez interfejs.

Nie używaj jawnych członków jako granicy bezpieczeństwa.

Podaj chroniony element wirtualny, który oferuje tę samą funkcjonalność, co element jawnie zaimplementowany, jeśli funkcja ma być wyspecjalizowana przez klasy pochodne.

To tworzy dobry ogólny ton. Korzystając z opcji Unikaj i rozważ, możesz pozwolić programistom na wykorzystanie ich oceny. Także dlatego, że są to wytyczne, a nie reguły, które programiści mogą uznać za bardziej smaczne, a tym samym bardziej prawdopodobne, że będą ich przestrzegać.

Conrad Frix
źródło
W miejscu, w którym obecnie pracuję, wszystkie interfejsy muszą zostać zaimplementowane jawnie i jest to duży problem. Gdyby tylko przeczytali Wytyczne dotyczące projektowania ram przed napisaniem standardu kodowania.
Martin Brown
1

Wydaje się, że nikt nie wspominał o bezpieczeństwie - w standardzie kodowania musisz mieć odniesienie do wymagań bezpiecznego kodu (np. Użycie modułów sprawdzania poprawności danych wejściowych, niedozwolenie znanych słabych funkcji, takich jak strcpy, wymagania dotyczące obsługi błędów itp.)

Rory Alsop
źródło
+1: Te i wielowątkowe kwestie są często nieznane lub źle zrozumiane, nawet przez doświadczonych programistów.
TMN
1

Przykłady Starannie ułożone, nietrywialne przykłady zbliżone do świata rzeczywistego, które wykorzystują każdą regułę. Komentarze (niekoniecznie część kodu), która część przykładu podąża za jaką regułą.

Szablony Nie jest to C ++, ale coś do skopiowania-wklejenia i wypełnienia na żywo. O wiele łatwiej jest uzyskać ten 24-liniowy komentarz na płycie, gdy masz odniesienie do kopiowania.

użytkownik 281377
źródło
1

Najważniejsza funkcja: maksymalnie dwie strony.

Jest to coś, co każdy programista powinien przeczytać i zapamiętać. Nie powinieneś szukać standardu za każdym razem, gdy musisz napisać nową funkcję (lub, co gorsza, nową linię). Tak więc, zwięźle i przestrzegaj tylko tych zasad, które naprawdę zwiększają wartość produktu końcowego.

bjarkef
źródło
1

Standardy kodowania to tak naprawdę kilka elementów:

Konwencje kodowania

  • te rzeczy nie potrzebują innego powodu niż „spójność bazy kodu” np. używać „_” w zmiennych prywatnych członków lub nie.
  • może istnieć kilka poprawnych podejść. Wystarczy wybrać jeden dla zachowania spójności. na przykład obsługa błędów przy użyciu wyjątków lub kodów błędów.

Najlepsze praktyki

  • te elementy zawsze wymagają dobrego uzasadnienia z kilkoma wyraźnymi przykładami

na przykład Nigdy nie zostawiaj pustego połowu po próbie

try { Foo(); } catch { //do nothing }

1) Jeśli istnieje wyjątek zgłoszony przez Foo (), może to powodować inne problemy z następującymi funkcjami, które zakładają, że foo się powiodło.

2) Globalny moduł obsługi błędów nie powiadomi zespołu wsparcia o wyjątku, gdy zdarzy się to na prod

  • obejmuje praktyki „Defensywnego kodowania”, takie jak używanie Asertów do testowania swoich założeń.

Środowisko kodowania

  • narzędzia, z których korzysta cały zespół. na przykład VS 2010, Resharper, piec itp.
Mag20
źródło
0

Standardy kodowania zapisane na papierze są tylko tak skuteczne. Podoba mi się to, jak Go publikuje swój standard kodowania. Ma narzędzie gofmtdo formatowania tekstu programu do formatu. Każda debata na temat formatu kodowania będzie po prostu skutkiem łatki do źródeł gofmt.

Co do tego, jaki format powinien mieć,

  • jak nazwać zmienne, makra, stałe, literały, funkcje itp
  • jak umieszczać {,}, (,), [,], jeśli chodzi o if, treść funkcji, bloki instrukcji do jakichkolwiek innych celów,
  • jak szerokie powinny być wcięcia,
  • ile znaków dozwolony jest wiersz tekstu
  • ile poziomów wcięć jest dozwolonych, zanim kod zostanie odrzucony / wysłany do refaktoryzacji
  • ile wierszy kodu jest dozwolonych na funkcję przed wysłaniem jej z powrotem do refaktoryzacji
  • maksymalna liczba argumentów, które funkcja może przyjąć, zanim zostanie odesłana do refaktoryzacji
  • Kilka linii komentarzy, zanim funkcja zacznie krótko wyjaśniać, co robi, jeśli treść ma przekroczyć jedną stronę kodu ekranowego; pozostawiając sposób osiągnięcia obiektu do kodu w ciele funkcji

Kiedy czytam kod innych (głównie język C), jeśli nazwy zmiennych / funkcji nie są intuicyjne w kontekście projektu lub jeśli przekraczają pięć poziomów wcięcia lub funkcje wymagają więcej niż sześciu lub siedmiu argumentów lub funkcja działa ponad dwie lub trzy strony na ekranie, bardzo trudno jest odczytać i zrozumieć kod. Zapytany o ulepszenia / prace konserwacyjne, tylko zwiększa trudność. To sprawia, że ​​żałuję, gofmtże program nie powinien być napisany dla każdego projektu (a nawet języka) i każdy plik kodu źródłowego powinien być uruchomiony przez ten program, zanim zostanie on zatwierdzony w projekcie.

vpit3833
źródło
od lat istnieją programy upiększające kod. Google jeden dla twojego języka, znajdziesz jeden.
gbjbaanb
0

Lubię Google JavaScript Style Guide .

Jest zwięzły w swoich wytycznych, ale zawiera szczegółowe informacje, jeśli ich potrzebujesz.

Sam Farmer
źródło
czy mógłbyś wyjaśnić więcej na temat tego, co robi i dlaczego polecasz to jako odpowiedź na zadane pytanie? „Tylko odpowiedzi” nie są mile widziane na Stack Exchange
gnat
-1

Kod samo dokumentujący (komentarze, nazwy zmiennych, nazwy funkcji itp.)

aggietech
źródło