C 프로그래머들이 C++를 쓰기 시작한 나쁜 습관은 무엇입니까?
최근 한 토론은 다른 언어로 프로그래밍을 시작할 때 한 언어에 너무 많이 노출된 프로그래머들의 나쁜 습관을 비웃으며 끝이 났습니다.가장 좋은 예는 파스칼 프로그래머가 시작하는 것일 것입니다.#define begin {
그리고.#define end }
C를 쓰기 시작할 때.
C++를 사용하기 시작할 때 C 프로그래머의 나쁜 습관을 잡는 것이 목표입니다.
당신이 마주친 큰 일에 대해 말해보세요.답변으로 한 가지 제안을 드리자면, 최선을 다하도록 노력해 주십시오.
좋은 습관에 관심이 있는 사람들은 이 질문에 대해 받아들여진 답을 살펴보세요.
RAI 개체 대신 원시 포인터 및 리소스 사용.
- std:: 문자열 대신 char* 사용
- std::container(또는 다른 컨테이너) 대신 배열 사용
- 적절한 경우 부스트와 같은 다른 STL 알고리즘이나 라이브러리를 사용하지 않음
- 상수, 유형 데프 또는 템플릿이 더 나았을 때 전처리기 사용
- SESE 스타일(단일 항목 단일 출구) 코드 작성
사용되는 위치에 최대한 가까운 대신 함수의 맨 위에 모든 변수를 선언합니다.
STL, 특히 std::string을 사용하지 않음,
및/또는
std::baseling을 사용하고 타이트한 코너에서 이전 c 문자열 함수로 되돌립니다.
- 2000줄 코드인 클래스 정의 쓰기.
- 클래스 정의를 12개의 다른 장소에 복사하여 붙여넣기.
- 간단한 가상 방법을 사용하는 경우 스위치 문을 사용합니다.
- 생성자에서 메모리를 할당하지 못하고 생성자에서 할당을 해제합니다.
- 선택적 인수를 사용하는 가상 메서드입니다.
- char* 문자열을 조작하기 위해 루프를 사용하는 동안 쓰기.
- 한 페이지 길이의 거대한 매크로를 작성하는 중입니다. (대신 템플릿을 사용할 수 있음.
using
수 std::string
활자로 된 선언합니다.
참조 대신 포인터 사용
캐스팅이나 심지어 객체 지향 프로그래밍을 이해하지 못하는 매우 숙련된 개발자:
프로젝트를 도와주기 시작했는데 선배 중 한 명이 예전에는 작동했지만 지금은 작동하지 않는 코드에 문제가 있었습니다.
(순수자 보호를 위해 학급명이 변경되었고, 정확한 이름은 기억나지 않습니다.)그는 수신 메시지 수업을 듣고 읽는 C++ 코드를 가지고 있었습니다.과거에는 메시지 클래스가 전달되어 어떤 유형의 메시지인지 알아보기 위해 메시지 클래스에 변수를 통합하는 방식이었습니다.그런 다음 C 스타일로 메시지를 자신이 작성한 메시지에서 상속받은 또 다른 전문 클래스로 메시지로부터 물려받은 것입니다.이 새로운 수업은 그가 원하는 데이터를 추출하는 기능을 가지고 있었습니다.지금은 그에게 효과가 있었지만 지금은 효과가 없었습니다.
몇 시간 동안 그의 코드를 살펴 보았지만 그는 문제를 발견할 수 없었고 저는 그의 어깨 너머를 보았습니다.즉시 저는 그에게 메시지를 파생된 클래스에 C 스타일로 캐스팅하는 것은 좋지 않다고 말했습니다.그는 저의 의견에 동의하지 않고 몇 년 동안 그것을 해왔고 만약 그것이 틀렸다면 그가 하는 모든 행동은 잘못된 것입니다. 왜냐하면 그는 이런 접근법을 자주 사용하기 때문입니다.그는 제가 틀렸다고 한 계약자에 의해 더욱 뒷받침을 받았습니다.그들은 둘 다 이것이 항상 효과가 있고 코드가 바뀌지 않았기 때문에 이 접근법이 아니라 그의 코드를 깬 다른 것이라고 주장했습니다.
저는 조금 더 멀리서 그 차이점을 발견했습니다.메시지 클래스의 최신 버전에는 가상 기능이 있으며 이전에는 가상 기능을 사용하지 않았습니다.저는 그들의 쌍에게 이제 가상 테이블이 생겼고 기능이 검색되고 있다고 등의 말을 했고, 이것이 그들의 문제를 야기하고 있다고 등의 말을 했습니다.그들은 결국 동의했고 저는 "가상은 다형성과 객체 지향 프로그래밍을 완전히 망친다"는 제게 평생 잊지 못할 말을 했습니다.
기존 클래스에 함수를 추가하는 방법에 대한 예시로 데코레이터 패턴의 복사본을 전달했지만 아무런 답변을 듣지 못했습니다.그들이 어떻게 그 생각을 고쳤는지 나는 전혀 모릅니다.
매크로라는 단어가 있습니다.매크로가 C++에 전혀 자리가 없다는 것은 아니지만, 이전 C 프로그래머들은 C++로 전환한 후 너무 많이 사용하는 경향이 있습니다.
C 스타일 깁스로.
이 없는 유형 와 C++를 사용하여 변경을 허용할지 여부를 독립적으로 할 수 있습니다.const
그리고.volatile
C와 비교하여 컴파일 타임 유형 안전성에 상당한 개선을 제공하는 수식어.또한 런타임 검사 비용으로 완전히 안전한 캐스트를 제공합니다.
거의 모든 유형 간의 확인되지 않은 변환인 C 스타일 캐스트는 보다 제한적인 캐스트에 의해 쉽게 식별될 수 있는 오류 클래스 전체를 허용합니다.또한 의심스러운 변환에 대한 버그 코드를 감사하려면 구문을 사용하면 검색하기가 매우 어렵습니다.
프로그래머들이 이미 C++ 학습을 시도하는 실수를 저질렀다고 가정하면,
실수들
- STL을 사용하지 않습니다.
- 수업시간에 모든 걸 정리하려고 노력하는 중.
- 모든 것에 템플릿을 사용하려고 합니다.
- Boost를 사용하지 않습니다. (Boost가 실제 PITA가 될 수 있고 학습 곡선이 될 수 있다는 것을 알고 있지만 C++는 그것이 없으면 C+입니다.부스트는 C++에 배터리를 제공합니다.).
- 똑똑한 포인터를 사용하지 않습니다.
- RAI를 사용하지 않습니다.
- 예외를 과도하게 사용합니다.
논란의 여지가 있는
- C++로 이동합니다.하지 마세요.
- Cstio를 iostream으로 변환해 봅니다.아이오스트 스트림 SUX.쓰지 마요.본질적으로 고장난 겁니다.여기 보세요.
- libstdc++ 라이브러리의 다음 부분을 사용합니다.
- 줄들 (나를 위해 그것들을 자유롭게 해줘, 지옥에나 가버려)
- 현지화 (도대체 이것이 c++와 무슨 상관이 있습니까? 더 나쁜, 끔찍한 일입니다.)
- 입력/출력(64비트 파일 오프셋?들어보셨나요?)
- 명령 줄에서 디버그를 할 수 있다고 순진하게 믿고 있습니다.코드 크레인(IDE) 없이 C++를 광범위하게 사용하지 마십시오.
- C++ 블로그를 따라 합니다.C++ 블로그는 본질적으로 메타데이터와 설탕으로 귀결되는 것에 대해 이야기합니다.좋은 FAQ와 경험 외에 유용한 C++ 블로그를 아직 보지 못했습니다.(이는 어려운 과제입니다.좋은 C++ 블로그를 읽고 싶습니다.)
쓰기 using namespace std
왜냐하면 모든 사람들은 그렇게 하고 그 의미에 대해 절대로 반성하지 않기 때문입니다.또는 그것이 무엇을 의미하는지를 알고 있지만 "라고 말하는 것.std::cout << "Hello World" << std::endl;
꼴사납다."
참조 대신 포인터로 개체를 전달합니다.네, 아직 C++에서 포인터가 필요할 때가 있지만 레퍼런스는 더 안전하기 때문에 가능할 때 사용해야 합니다.
교실의 모든 것을 공개하는 것.따라서 비공개가 되어야 하는 데이터 구성원은 그렇지 않습니다.
포인터와 참조의 의미론 및 하나 또는 다른 하나를 사용할 시기를 완전히 이해하지 못하는 경우.포인터와 관련된 문제는 할당된 동적 메모리를 올바르게 관리하지 않거나 이를 위해 "스마트" 구성을 사용하지 못하는 문제(예: 스마트 포인터)입니다.
제가 가장 좋아하는 사람은 여러 개의 선택적인 인수로 하나의 방법을 쓰는 C 프로그래머입니다.
기본적으로 함수는 인수의 값 및/또는 무효성에 따라 다른 작업을 수행합니다.
알고리즘 및 데이터 구조를 작성할 때 템플릿을 사용하지 않습니다(예).너무 지역화되거나 너무 일반적인 것처럼 보입니다.
글짓기
void qsort(MyStruct *begin, size_t length); //too localized
void qsort(void *begin, size_t length,
size_t rec_size, int(compare*)(void*,void*)); //too generic
대신에
template <class RA_Iter>
void qsort(RA_Iter begin, size_t length);
//uses RA_Iter::value_type::operator< for comparison
음, 나쁜 프로그램 설계는 언어를 초월합니다. (캐스팅, 경고 무시, 불필요한 사전 컴파일러 마법, 불필요한 비트 트월링, 문자 분류 매크로 사용 안 함) 그리고 C 언어 자체는 "나쁜 습관"을 너무 많이 만들지 않습니다. (오케이, 매크로, 특히 석기시대의) 그리고 많은 관용구들이 직역됩니다.하지만 몇 가지 고려할 수 있는 사항은 다음과 같습니다.
C++에 있다는 이유만으로 기능을 사용하는 것이 올바른 방법임에 틀림없습니다.일부 프로그램에는 상속, MI, 예외, RTTI, 템플릿(있는 그대로의 훌륭한...)이 필요하지 않습니다.디버깅 로드가 가파름) 또는 가상 클래스 항목입니다.
C++가 더 나은 방법을 가지고 있는지 생각하지 않고 C의 코드 조각을 고수하는 것. (이제 클래스, 프라이빗, 퍼블릭, 컨스트(C89를 넘어 확장됨), 정적 클래스 기능, 참조가 있는 이유가 있습니다.
C++ i/ollib(그 BIG, 당신은 그것을 알아야만 함)에 익숙하지 않고, C++ i/o와 Ci/o를 섞는 것.
그는 C++가 C와 조금 더 다른 언어일 뿐이라고 생각합니다.그는 C++로 가면을 쓴 C 프로그램을 계속할 것입니다.클래스를 고급으로 사용하지 않고, 클래스, 네임스페이스, 새 헤더, 템플릿보다 구조가 덜 강력한 것으로 간주되며, 이러한 새 요소는 사용되지 않습니다.그는 int 없이 정수 변수를 계속 선언할 것이고, 기능 프로토타입을 제공하지 않을 것입니다.그는 malloc와 자유롭고 안전하지 않은 포인터와 전처리기를 사용하여 인라인 함수를 정의할 것입니다.이것은 단지 작은 목록입니다 ;)
구조체 대 클래스의 혼동된 사용, 객체 포인터를 인수로 사용하는 전역 메서드의 과도한 사용, 전역적으로 액세스 가능한 인스턴스 포인터, la:
extern Application* g_pApp;
void RunApplication(Application* app, int flags);
또한 (완전히 쓸모없다고 말하는 것은 아니지만):
const void* buf;
함수 자체를 시작할 때 변수를 100줄 정도만 사용하더라도 모든 변수를 선언합니다.
함수 내부에 선언된 로컬 변수에 대해 특히 발생합니다.
건강보험과 401K 혜택을 보장받을 수 있는 계층 기반의 흉악함을 만드는 대신 문제를 해결하는 것.
하나의 파일에 리스프를 구현하고 그 안에서 디자인을 하는 것입니다.
연산자를 우선시하는 대신 정상적으로 읽을 수 있는 기능을 쓰는 것?
좋은 연습을 "C++로 쓰지 않는 것"으로 보는 후배 프로그래머들이 이해할 수 있는 스타일로 글을 쓰는 것.
자체 언어로 OS와 대화하는 것.
충분히 혼자 두지 않고, 대신 C를 사용하는 것.
언급URL : https://stackoverflow.com/questions/3501653/what-are-the-bad-habits-of-c-programmers-starting-to-write-c
'it-source' 카테고리의 다른 글
이 Google Play APK 게시 오류 메시지의 의미는 무엇입니까? (0) | 2023.09.18 |
---|---|
빠른 소리 생성 및 재생 (0) | 2023.09.18 |
테마 및 플러그인 설치를 시도하는 바인딩 마운트 볼륨에 대한 도커/워드프레스/디코딩 권한 (0) | 2023.09.18 |
클래스 사용 시기 vs.PHP에서의 기능 (0) | 2023.09.18 |
사용자 지정 작업 창은 어떻게 UI의 반응성을 유지하면서 가시성을 전환할 수 있습니까? (0) | 2023.09.18 |