종료 됨 이 질문은
주제에서 벗어남 입니다. 현재 답변을 받고 있지 않습니다.
댓글
답변
계속하면 더 많은 코드를 작성하면 코드를 구성하기 어려울 때가 있습니다.
이것이 문제입니다. 조직을 올바르게 설정하고, 스타일이 더 쉽게 흐를 것입니다.
코드 구성을 기다리지 마십시오 . 이동하면서 코드를 정리하십시오. 언어가 당신을 위해 그렇게하지 않더라도, 코드는 결합이 낮고 응집력이 높은 모듈로 구성되어야합니다.
이러한 모듈은 자연스럽게 네임 스페이스를 제공합니다. 충돌을 피하기 위해 모듈 이름 (길이가 긴 경우)을 축약하고 함수 이름에 모듈을 접두사로 붙입니다.
개별 식별자 수준에서 이들은 대략적으로 주관성이 증가하는 순서입니다.
- 규칙을 선택하고 준수하십시오.
- 예 :
function_like_this(struct TypeLikeThis variable)
는 일반적입니다.
-
헝가리 표기법을 사용하지 마세요 (죄송합니다 JNL).
-
원래 의도 한대로 사용하려는 경우가 아니라면 Simonyi의 앱 표기법이 아닌 끔찍한 시스템 버전
왜? 이에 대한 에세이를 쓸 수는 있지만, 대신 Joel Spolsky의 이 기사 를 읽고 관심이 있으시면 좀 더 찾아보실 것을 권 해드립니다. 아래쪽에 Simonyi의 원본 논문에 대한 링크가 있습니다.
-
정말로 불투명 한 쿠키 유형이 아닌 한 포인터 typedef를 피하십시오. 혼동
struct Type *ok; typedef struct Type *TypePtr; TypePtr yuck;
불투명 한 쿠키 유형 이란 무엇을 의미합니까? 모듈 (또는 라이브러리 또는 무엇이든) 클라이언트 코드로 전달되어야하지만 클라이언트 코드는 직접 사용 할 수 없습니다. 다시 라이브러리로 전달합니다.
예를 들어 데이터베이스 라이브러리는
/* Lots of buffering, IPC and metadata magic held in here. No, you don"t get to look inside. */ struct DBContextT; /* In fact, you only ever get a pointer, so let"s give it a nice name */ typedef struct DBContexT *DBContext; DBContext db_allocate_context(/*maybe some optional flags?*/); void db_release_context(DBContext); int db_connect(DBContext, const char *connect); int db_disconnect(DBContext); int db_execute(DBContext, const char *sql);
이제 컨텍스트 내부를 볼 수 없기 때문에 클라이언트 코드에 불투명 합니다. 라이브러리로 다시 전달하기 만하면됩니다. FILE
와 같은 것도 불투명합니다. 정수 파일 설명 자도 쿠키 이지만 “불투명하지는 않습니다.
디자인에 대한 참고 사항
위의 낮은 결합과 높은 응집력 이라는 문구를 설명없이 사용했는데 조금 안타깝습니다. 당신은 그것을 검색 할 수 있고 아마도 좋은 결과를 찾을 수있을 것이다. 그러나 나는 그것을 간략하게 다루려고 노력할 것이다 (다시 말하지만, 나는 에세이를 쓸 수는 있지만 시도하지 않을 것이다).
위에 스케치 된 DB 라이브러리는 낮은 커플 링 은 작은 인터페이스를 외부 세계에 노출하기 때문입니다. 구현 세부 정보 (일부 불투명 쿠키 트릭 포함)를 숨기면 클라이언트 코드가 이러한 세부 정보에 의존하는 것을 방지합니다.
불투명 한 쿠키 대신에 컨텍스트 구조체를 선언하여 내용을 볼 수 있도록하고, 여기에는 데이터베이스에 대한 TCP 연결을위한 소켓 파일 설명자가 포함됩니다. 나중에 공유 메모리 세그먼트 사용을 지원하도록 구현을 변경하면 DB가 동일한 머신에서 실행 중이므로 클라이언트는 단순히 다시 연결하는 것보다 다시 컴파일해야합니다. 더 나쁜 것은 클라이언트가 파일 설명자를 사용 하기 시작했을 수 있습니다 (예 : setsockopt
를 사용하여 기본 버퍼 크기를 변경하고 이제 코드도 변경해야합니다. ils는 가능한 경우 모듈 내부에 숨겨져 야하며, 이는 모듈간에 낮은 결합을 제공합니다.
이 예는 또한 높은 응집력 을 보여줍니다. 모듈의 메서드는 동일한 작업 (DB 액세스)과 관련됩니다. 즉, 구현 세부 정보 (즉, 쿠키의 내용)에 대해 알기 위해 필요한 코드 만 실제로 액세스 할 수 있으므로 디버깅이 간단 해집니다.
또한 하나의 관심사로 인해 이러한 함수를 그룹화 할 접두사를 쉽게 선택할 수 있음을 알 수 있습니다.
이제이 예가 좋다고 말하는 것이 쉽습니다 (특히 그렇지 않기 때문에 “완전하지도 않지만”즉시 도움이되지는 않습니다. 비결은 코드를 작성하고 확장 할 때 유사한 작업을 수행하거나 동일한 유형에서 작동하는 함수 (자체 모듈의 후보가 될 수 있음)와 많은 개별 작업을 수행하는 함수를 관찰하는 것입니다. ” 정말 관련이 있고 헤어질 후보가 될 수 있습니다.
댓글
답변
내 의견으로는 90 세 가지 사항을 염두에두면 이름 지정 문제의 %가 해결됩니다. a) 변수 및 함수 이름을 다음과 같이 설명 적으로 지정합니다. 가능하면 b) 코드 전체에서 일관성이 있어야합니다 (즉, 함수 이름이 addNumbers 인 경우 두 번째 함수의 이름은 multiplyNumbers 여야합니다. numberMul이 아님) 및 c) 이름을 입력해야하므로 가능한 한 짧게 만드십시오.
이 주제에 대한 다른 측면을 살펴 보려면 이름 지정 규칙 에있는 Wikipedia 페이지에해야 할 일 목록이 있습니다. 명심하십시오. 또한 C 및 C ++에 대한 섹션도 있습니다.
C 및 C ++에서 키워드와 표준 라이브러리 식별자는 대부분 소문자입니다. C 표준 라이브러리에서는 축약 된 이름이 가장 일반적이며 (예 : 문자가 영숫자인지 테스트하는 함수의 경우 isalnum), C ++ 표준 라이브러리는 종종 단어 구분 기호로 밑줄을 사용합니다 (예 : out_of_range). 매크로를 나타내는 식별자는 일반적으로 대문자와 밑줄 만 사용하여 작성됩니다 (이는 상수에 대해 모두 대문자 식별자를 사용하는 많은 프로그래밍 언어의 규칙과 관련이 있습니다). 이중 밑줄을 포함하거나 밑줄과 대문자로 시작하는 이름은 구현을 위해 예약되어 있으며 (컴파일러, 표준 라이브러리) 사용해서는 안됩니다 (예 : reserved__ 또는 _Reserved). [5] [6] 이것은 stropping과 표면적으로 유사하지만 의미가 다릅니다. 밑줄은 문자를 인용하는 것이 아니라 식별자 값의 일부입니다 (스트로 핑과 마찬가지로) : __foo의 값은 foo가 아니라 __foo (예약 됨)입니다. 다른 네임 스페이스).
댓글
Answer
C에서 유일한 어려운 제약은 네임 스페이스가 없다는 것입니다. 따라서 파일 시스템 라이브러리의 rename()
기능을 rename()
와 구별 할 수있는 방법을 찾아야합니다. 미디어 라이브러리의 기능. 일반적인 해결책은 filesystem_rename()
및 media_rename()
와 같은 접두사입니다.
다른 일반적인 조언은 다음과 같습니다. 프로젝트 또는 팀 내에서 일관성이 있습니다. 가독성이 향상됩니다.
댓글
답변
전 세계를 찾고있는 경우 허용되는 형식
MISRA / JSF / AUTOSAR는 C / C ++ 코드 이름 지정 및 구성에 대한 모든 산업 표준의 거의 100 %를 다룹니다. 문제는 그들이 무료로 얻을 수 없다는 것입니다. 즉, 각 가이드 북은 약간의 비용이 든다는 것입니다. MISRA 2008 C / C ++ 코딩 표준 서적의 가격은 약 50 달러라는 것을 알고 있습니다.
저널을 쓸 때 참고 문헌 및 추가 읽기에 대한 Harvard Referencing이라고 생각할 수 있습니다. 저는 MISRA를 사용해 왔으며 함수와 변수의 이름을 지정하고 적절한 사용을 위해 구성하는 좋은 방법입니다.
일시적인 것을 찾고있는 경우
Python 및 Java 용으로 제공 한 참조는 괜찮은 것 같습니다. 나는 사람들이 javadoc 스타일의 주석, 이름 지정 및 코드 구성을 채택하는 것을 보았습니다. 사실 지난 프로젝트에서 Java와 유사한 함수 / 변수 이름으로 C ++ 코드를 작성해야했습니다. 두 가지 이유는 다음과 같습니다.
1) 확실히 따르는 것이 더 쉬웠습니다.
2) 생산 코드 요구 사항은 안전에 중요한 소프트웨어 시스템 표준의 기초를 건드리지 않았습니다.
3) 레거시 코드는 (어쨌든) 그 형식이었습니다.
4) Doxygen은 Javadoc 스타일 주석을 허용했습니다. 그 순간, 우리는 doxygen을 사용하여 생산자들을위한 문서를 생성했습니다.
많은 프로그래머들이 이것에 반대 할 것입니다. 그러나 저는 개인적으로 C에서 javadoc 스타일 함수 / 변수 명명을 채택하는 데 아무런 문제가 없다고 생각합니다. / C ++. 물론 그렇습니다. 흐름 제어, 스레드 안전 등을 구성하는 관행은 상관없이 다루어야합니다. 그러나 나는 여기서 지원자가 아닙니다. 또한 프로덕션 코드 형식 요구 사항이 얼마나 엄격한 지 모르겠습니다. 주제를 벗어난 영역으로 전환하지 않고 요구 사항을 검토하고 특정 명명 규칙에 얼마나 의존하는지 알아보고 언급 된 솔루션을 사용하는 것이 좋습니다. in mine and others “답변
도움이 되었으면 좋겠어요!?
댓글
답변
이름을 지정할 때 고려해야 할 중요한 사항은 거의 없습니다.
-
actionObject 또는 ObjectAction 유형을 확인합니다. (Object는 C 용이 아닙니다.하지만 일반적으로 다른 객체 지향 언어로 이동할 때) 이것이 도움이 될 것입니다.
-
나머지는 확실하고 짧고 설명적일 것입니다.
- 또한 정의 된 모든 변수와 함수의 유일한 목적입니다. 예 : 값을 일시적으로 저장하려면 이름을 nTempVal for int
- 변수는 명사로, 메소드는 동사 여야합니다.
주석
답변
대부분의 답변은 좋지만 이름 지정에 대해 몇 가지 말하고 싶습니다. C ++ 또는 Java와 같은 다른 언어에서 네임 스페이스를 사용하는 것과 유사한 라이브러리 및 포함 된 파일에 대한 규칙 :
라이브러리를 빌드하는 경우 내 보낸 기호에 대한 공통 접두사 (예 : 전역 함수, typedef 및 변수)를 찾습니다. 이렇게하면 다른 라이브러리와의 충돌을 방지하고 함수가 사용자의 것으로 식별됩니다. 이것은 약간의 앱 헝가리어 표기법입니다.
더 나아가서 내 보낸 기호를 그룹화 할 수 있습니다. libcurl은 전역 기호에는 curl_ *을 사용하고, 다른 인터페이스에는 curl_easy_ *, curl_multi_ * 및 curl_share_ *를 사용합니다.따라서 모든 함수에 대해 curl_ *을 사용하는 것 외에도 다른 인터페이스에 대해 또 다른 수준의 “네임 스페이스”를 추가했습니다. curl_multi_ * 핸들에서 curl_easy_ * 함수를 호출하는 것은 이제 잘못 보입니다. http://curl.haxx.se/libcurl/c/
내 보낸 기호에 대한 규칙을 유지하면서 ed 파일 : 이러한 함수에 대한 공통 접두사를 찾으십시오. “my_string”이라는 파일에 정적 문자열 유틸리티 함수가있을 수 있습니까? 모든 함수 앞에 my_string_ *를 붙입니다.
Comments