Podczas kodowania dużego projektu w CI pojawił się problem. Jeśli będę nadal pisać więcej kodu, nadejdzie czas, kiedy będzie mi trudno go zorganizować. Mam na myśli, że nazewnictwo funkcji i zmiennych dla różnych części programu może wydawać się pomieszane.
Zastanawiałem się więc, czy istnieją użyteczne konwencje nazewnictwa, których można użyć dla zmiennych C i funkcji?
Większość języków sugeruje konwencję nazewnictwa. Ale dla C jedyną rzeczą, którą do tej pory przeczytałem, jest to, że nazwy powinny być opisowe dla czytelności kodu.
EDYTOWAĆ:
Przykłady niektórych przykładów sugerowanych konwencji nazewnictwa:
Czytałem gdzieś więcej konwencji nazewnictwa dla Java, ale nie pamiętałem gdzie.
order.c
, można wymienić funkcjeorder_add()
,order_del()
i takie. Mogą istnieć stare systemy, które mówią, że nazwa musi być unikalna w ciągu pierwszych 8 znaków. Kiedy później przypadkowo przełączysz się na c ++, pokochasz pisanie,order::add()
aorder::del()
potem.Odpowiedzi:
To jest twój problem: popraw organizację, a styl powinien płynąć łatwiej.
Nie czekaj, aby uporządkować kod: utrzymuj swój kod uporządkowany na bieżąco. Chociaż język tego nie robi, kod powinien być nadal zorganizowany w moduły o niskim sprzężeniu i wysokiej spójności.
Moduły te następnie naturalnie zapewniają przestrzeń nazw. Skróć nazwę modułu (jeśli jest długi) i prefiks nazwy funkcji w module, aby uniknąć kolizji.
Na poziomie indywidualnych identyfikatorów są one z grubsza w porządku subiektywnym:
function_like_this(struct TypeLikeThis variable)
jest powszechnezdecydowanie unikać notacji węgierskiej (przepraszam JNL)
chyba że chcesz go używać zgodnie z pierwotnym przeznaczeniem, co oznacza notację aplikacji Simonyi zamiast strasznej wersji systemowej
Dlaczego? Mógłbym napisać esej na ten temat, ale zamiast tego zasugeruję, abyś przeczytał ten artykuł Joela Spolsky'ego, a następnie polował na więcej, jeśli jesteś zainteresowany. Na dole znajduje się link do oryginalnej pracy Simonyi.
unikaj typowania wskaźników, chyba że są to naprawdę nieprzejrzyste typy plików cookie - tylko mylą
Co rozumiem przez nieprzezroczysty typ pliku cookie ? Mam na myśli coś używanego wewnątrz modułu (lub biblioteki, czy cokolwiek innego), co musi zostać przekazane do kodu klienta, ale tego kodu klienta nie można użyć bezpośrednio. Po prostu przekazuje go z powrotem do biblioteki.
Na przykład biblioteka bazy danych może ujawniać interfejs podobny do tego
Teraz kontekst jest nieprzejrzysty dla kodu klienta, ponieważ nie można zajrzeć do środka. Po prostu przekaż go z powrotem do biblioteki. Coś podobnego
FILE
jest również nieprzezroczyste, a deskryptor pliku liczb całkowitych jest również plikiem cookie , ale nie jest nieprzejrzysty.Uwaga dotycząca projektu
Użyłem powyższego wyrażenia niskie sprzężenie i wysoka kohezja bez wyjaśnienia, i czuję się z tym trochę źle. Możesz go wyszukać i prawdopodobnie znaleźć dobre wyniki, ale postaram się krótko rozwiązać (ponownie, mógłbym napisać esej, ale spróbuję tego nie robić).
Naszkicowana powyżej biblioteka DB pokazuje niskie sprzężenie, ponieważ odsłania mały interfejs dla świata zewnętrznego. Ukrywanie szczegółów implementacji (częściowo przy pomocy nieprzezroczystej sztuczki cookie) zapobiega uzależnieniu kodu klienta od tych szczegółów.
Wyobraź sobie, że zamiast nieprzezroczystego pliku cookie deklarujemy strukturę kontekstu, aby jego zawartość była widoczna i zawiera deskryptor pliku gniazda dla połączenia TCP z bazą danych. Jeśli następnie zmienimy implementację na obsługę segmentu pamięci współdzielonej, gdy baza danych działa na tym samym komputerze, klient musi zostać ponownie skompilowany, a nie tylko ponownie połączony. Co gorsza, klient mógł zacząć korzystać z deskryptora pliku, na przykład wywołując
setsockopt
zmianę domyślnego rozmiaru bufora, a teraz również potrzebuje zmiany kodu. Tam, gdzie jest to praktyczne, wszystkie te szczegóły powinny być ukryte wewnątrz naszego modułu, co zapewnia niskie sprzężenie między modułami.Przykład pokazuje również wysoką spójność , ponieważ wszystkie metody w module dotyczą tego samego zadania (dostęp do bazy danych). Oznacza to, że tylko kod, który musi wiedzieć o szczegółach implementacji (tj. Zawartości naszego pliku cookie) faktycznie ma do nich dostęp, co upraszcza debugowanie.
Widać również, że posiadanie jednego problemu ułatwiło wybranie prefiksu do grupowania tych funkcji razem.
Powiedzenie, że ten przykład jest dobry, jest łatwe (zwłaszcza, że nie jest nawet kompletne), ale nie pomaga natychmiast. Sztuczka polega na tym, aby podczas pisania i rozszerzania kodu obserwować funkcje, które robią podobne rzeczy lub działają na tych samych typach (które mogą być kandydatami na własny moduł), a także funkcje, które wykonują wiele różnych rzeczy, które nie są naprawdę powiązane i mogą być kandydatami do podziału.
źródło
with low coupling and high cohesion
. Co to znaczy? I proszę wyjaśnić nieprzejrzyste typy plików cookie. Nie mam pojęcia co to znaczy.low coupling and high cohesion
. Oznacza to więc przede wszystkim enkapsulowanie rzeczy, kiedy mogę, i powinno się to odbywać w taki sposób, aby funkcje, które faktycznie potrzebują, miały dostęp. Niektóre rzeczy przeszły mi przez głowę, ale myślę, że rozumiem.Moim zdaniem 90% problemu z nazewnictwem zostanie rozwiązane, jeśli weźmiesz pod uwagę trzy rzeczy: a) ustaw nazwy zmiennych i funkcji tak opisowo, jak to możliwe, b) spójne w całym kodzie (tj. Jeśli funkcja nazywa się addNumbers, a druga funkcja powinna mieć nazwę multiplyNumbers, a nie numbersMul) ic) staraj się skracać nazwy, jeśli to możliwe, ponieważ musimy je wpisać.
Biorąc to pod uwagę, jeśli chcesz spojrzeć na inne aspekty tego tematu, strona Wikipedia na temat konwencji nazewnictwa ma dobrą listę rzeczy, o których powinieneś pamiętać. Ma także sekcję dotyczącą C i C ++:
źródło
Jedynym trudnym ograniczeniem w C jest brak przestrzeni nazw. Dlatego musisz znaleźć sposób, aby odróżnić
rename()
funkcję biblioteki systemu plików odrename()
funkcji biblioteki multimediów . Zwykłym rozwiązaniem jest przedrostek, taki jak:filesystem_rename()
imedia_rename()
.Inne ogólne porady to: bądź konsekwentny w ramach projektu lub zespołu. Czytelność zostanie poprawiona.
źródło
JEŚLI SZUKASZ GLOBALNIE ZAAKCEPTOWANEGO FORMATU
MISRA / JSF / AUTOSAR obejmuje prawie 100% wszystkich standardów branżowych dotyczących nazewnictwa i organizowania kodu C / C ++. Problem polega na tym, że nie będą one dostępne za darmo, tzn. Każdy przewodnik kosztuje trochę pieniędzy. Wiem, że standardowa książka MISRA 2008 C / C ++ kosztuje prawdopodobnie około 50 USD.
Możesz myśleć o nich jak o Harvard Referencing dla bibliografii i dodatkowej lektury podczas pisania dziennika. Użyłem MISRY i jest to dobry sposób na nazwanie funkcji i zmiennych oraz uporządkowanie ich w celu właściwego wykorzystania.
JEŻELI SZUKASZ CZASU TYMCZASOWEGO
Podane przez ciebie odniesienia do Pythona i Javy są w porządku. Widziałem ludzi stosujących komentowanie, nazewnictwo i organizowanie kodu w stylu javadoc. W rzeczywistości w moim ostatnim projekcie musiałem napisać kod C ++ w funkcjach / nazwach podobnych do języka Java. Dwa powody tego:
1) Najwyraźniej było to łatwiejsze do naśladowania.
2) Wymagania dotyczące kodu produkcyjnego nie dotknęły podstaw krytycznych dla bezpieczeństwa standardów oprogramowania systemowego.
3) Stary kod był (jakoś) w tym formacie.
4) Doxygen pozwolił komentować Javadoc sytle. W tym momencie używaliśmy doxygen do generowania dokumentacji dla pracowników produkcji.
Wielu programistów będzie temu przeciwnych, ale osobiście uważam, że nie ma nic złego w przyjmowaniu funkcji / zmiennych w stylu javadoc w C / C ++. TAK OCZYWIŚCIE, niezależnie od tego należy zająć się praktykami organizacji kontroli przepływu, bezpieczeństwa wątków itp. Jednak nie jestem tutaj wnioskodawcą. Nie wiem też, jak rygorystyczne są wymagania dotyczące formatu kodu produkcyjnego. Nie przekierowując go do tematu nie na temat, proponuję przejrzeć swoje wymagania, dowiedzieć się, jak jesteś uzależniony od konkretnej konwencji nazewnictwa i wybrać rozwiązanie wspomniane w moich i odpowiedziach innych
Mam nadzieję, że to pomogło !?
źródło
Byłoby kilka ważnych rzeczy, które należy wziąć pod uwagę podczas nazywania;
Spójrz na typ actionObject lub ObjectAction. (Obiekt nie dla C. Ale ogólnie, gdy idziesz do innych języków zorientowanych obiektowo) To powinno pomóc
Reszta byłaby ZGODNA, krótka i opisowa na pewno.
źródło
Większość odpowiedzi jest dobra, ale chcę powiedzieć kilka rzeczy na temat konwencji nazewnictwa dla bibliotek i dołączonych plików, podobnie jak przy użyciu przestrzeni nazw w innych językach, takich jak C ++ lub Java:
Jeśli budujesz bibliotekę, znajdź wspólny przedrostek dla eksportowanych symboli, tj. Funkcje globalne, typy typef i zmienne. Zapobiegnie to konfliktom z innymi bibliotekami i zidentyfikuje funkcje jako pochodzące od twoich. To jest trochę aplikacji Notacje węgierskie.
Może pójdź jeszcze dalej i pogrupuj wyeksportowane symbole: libcurl używa curl_ * dla symboli globalnych, curl_easy_ *, curl_multi_ * i curl_share_ * dla różnych interfejsów. Oprócz używania curl_ * dla wszystkich funkcji, dodali kolejny poziom „przestrzeni nazw” dla różnych interfejsów: wywoływanie funkcji curl_easy_ * na uchwycie curl_multi_ * wygląda teraz źle, zobacz nazwy funkcji na http: // curl. haxx.se/libcurl/c/
Zachowując reguły dla eksportowanych symboli, powinieneś ich używać do funkcji statycznych w
#include
plikach ed: Spróbuj znaleźć wspólny prefiks dla tych funkcji. Może masz funkcje narzędzia ciąg statyczny w pliku o nazwie „my_string”? Poprzedź wszystkie te funkcje my_string_ *.źródło