우리는 많은 코딩 스타일이나 코딩 사양을 가지고 있습니다. 그러나 이 항목은 종종 우리가 잊어버릴 수 있습니다. 즉, 함수 매개변수에 bool 매개변수를 자주 사용하므로 코드의 가독성이 크게 떨어집니다. 믿을 수 없나요? 먼저 아래 코드를 살펴보겠습니다.
다음 코드를 읽을 때 이 코드가 무엇을 의미한다고 생각하시나요?
widget->repaint(false); 다시 칠하시겠습니까? 아니면 다른 뜻인가요?
문서를 읽은 후 우리는 이 매개변수가 즉각적이라는 것을 알게 되었습니다. 즉, false는 즉시 다시 그리지 않음을 의미하고 true는 코드가 즉시 다시 그려짐을 의미합니다.
Windows API에도 InvalidateRect라는 함수가 있습니다. 다음 코드를 보면 이것이 무엇을 의미한다고 생각하시나요?
InvalidateRect(hwnd, lpRect, false); InvalidateRect의 함수 이름이 얼마나 나쁜지는 먼저 이야기하지 않겠습니다. 무효화는 "XXX 무효화"를 의미합니다. 거짓은 무엇을 의미합니까? 이중 부정? 긍정적이라는 뜻인가요?
이런 코드를 보면 상당히 혼란스러울 것입니다. 따라서 문서나 InvalidateRect의 함수 정의를 살펴봐야 합니다. 매개 변수가 BOOL bErase라는 것을 알 수 있습니다. 이는 "배경을 다시 그릴지 여부"를 의미합니다.
다음 코드를 보면 str의 "%USER%"를 실제 사용자 이름으로 바꾸고 싶습니다.
str.replace("%USER%", user, false); // Qt 3TNND, false는 무엇을 의미하나요? 교체하지 않습니까? 아니면 다른 뜻인가요?
문서를 읽은 후 false가 "대소문자를 구분하지 않는 대체"를 의미한다는 것을 알았습니다.
실제로 bool 변수 대신 enum 변수/상수를 사용하면 다음과 같이 코드를 더 읽기 쉽게 만들 수 있습니다.
다음과 같이 코드 코드를 복사합니다 .
위젯->repaint(PAINT::immediate);
위젯->다시 그리기(PAINT::defer);
InvalidateRect(hwnd, lpRect, !RepantBackground);
str.replace("%USER%", user, Qt::CaseInsensitive); // Qt 4 이에 동의하지 않으면 다음 코드를 추측해 보겠습니다.
component.setCentered(true, false);
이게 대체 뭐야?
문서를 읽은 후에는 이것이 setCentered(centered, autoUpdate)라는 것을 알게 될 것입니다.
new Textbox(300, 100, false, true); 이것은 무엇입니까?
문서를 읽은 후 이것이 텍스트 상자를 만드는 것이라는 것을 깨달았습니다. 세 번째 매개 변수는 "스크롤 막대를 원하는지 여부"이고 네 번째 매개 변수는 "자동 줄 바꿈을 원하는지 여부"입니다. TNND!
이 상황이 최악은 아닙니다. 아래 이중 부정을 살펴보세요.
다음과 같이 코드 코드를 복사합니다 .
컴포넌트.setDisabled(false);
filter.setCaseInsensitive(false) 여기에 또 다른 코드가 있습니다. 다음 코드를 읽으면 여러분도 저처럼 겁에 질리거나 지저분해질 것이라고 믿습니다.
event.initKeyEvent("keypress", true, true, null, null,false, false, false, false, 9, 0);
이 글을 읽고 나면 다시는 bool을 함수 매개변수로 사용하지 않기를 바랍니다. 두 가지 이유가 없는 한:
Java의 setVisible(bool)과 같은 읽기 문제가 발생하지 않을 것이라고 100% 확신합니다.
당신은 신비한 코드를 작성하고 싶다고 100% 확신합니다.
좋은 API를 디자인하고 싶다면 Nokia의 Qt의 "API 디자인 원칙"을 읽어보시길 적극 권장합니다. 이 글은 그 안에 있는 "Boolean Trap"입니다.