프로그래밍

[C++] Philosophy 5 & 6

하루삼십만원 2020. 12. 1. 19:19
반응형

[C++] Philosophy 5: Prefer compile-time checking to run-time checking

 

Reason 코드의 명확성과 성능. compile time에 발견된 error들에 대해서는 error handler를 사용할 필요가 없다.

 

Example

이 예는 (overflow가 정의되지 않았기 때문에) 목표를 달성하지 못하며, 간단한 static_assert로 대체해야 한다.

아니면 여전히 type system을 사용하고 Int를 int32_t type로 변경하는 것이 좋다.

 

Example

보다 아래가 좋다

 

Alternative formulation Compile time에 잘 할 수 있는 것들을 run time으로 미루지 말자.

 

Enforcement

● pointer의 arguments를 확인해라.

● 범위 위반에 대한 run-time checker를 확인해라.

 

원문 출처

isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#p5-prefer-compile-time-checking-to-run-time-checking

 

C++ Core Guidelines

 

isocpp.github.io

 

Philosophy 6: What cannot be checked at compile time should be checkable at run time

 

Reason 탐지하기 어려운 error들을 프로그램에 남기는 것은 crash나 나쁜 결과들을 유발하는 것이다.

 

Note 이상적으로 우리는 (프로그램 로직상 error가 아닌 것을 포함한) 모든 error들을 compile time이나 run time에 잡는다. Compile time에 모든 error를 포착하는 것은 불가능하며 run time에 남아 있는 모든 error를 포착하는 것은 종종 적절하지 않다. 다만, 충분한 자원(분석 프로그램, 런타임 체크, 기계 자원, 시간)을 주어 원칙적으로 체크할 수 있는 프로그램을 작성하도록 노력해야 한다.

 

Example, bad

여기서 중요한 정보(elements의 수)가 너무 철저하게 "obscured(확보)"되어 있어서 정적 분석이 아마도 실행 불가능하게 되고, f()가 ABI의 일부일 때 동적 점검이 매우 어려워져서 우리는 그 포인터를 "instrument" 할 수 없다. 우리는 유용한 정보를 free store에 포함시킬 수 있지만, 그것은 시스템이나 컴파일러에 대한 global changes를 필요로 한다. 여기 우리가 가지고 있는 것은 오류 감지를 매우 어렵게 만드는 디자인이다.

 

Example, bad 우리는 pinter와 함께 elements의 수도 전달할 수 있다.

element의 수를 argument로 전달하는 것이 단순히 pointer를 통과시키고 element의 수를 알거나 발견하기 위해 일부 (선언되지 않은) convention에 의존하는 것보다 더 좋다(그리고 훨씬 더 흔하다). 그러나 (표시된 바와 같이) 단순한 오타가 심각한 오류를 일으킬 수 있다. f2()의 두 인자 사이의 연관성은 명시적이기보다는 관습적(conventional)이다.

또한, f2()는 자신의 인자를 삭제하도록 되어 있다는 것을 암시한다. (혹은 caller가 2번째 실수를 했는가?)

 

Example, bad Standard library resource management pointer가 object를 가리킬 때 size를 전달하지 못함.

Example pointer와 element의 수를 integral object로 전달.

이 설계는 object의 필수적인 부분으로 elements의 수를 전달하기 때문에 오류가 발생할 가능성이 낮고 항상 적절한 것은 아니지만 항상 동적(run-time) 점검이 가능하다.

 

std::span 이란? span이 동적 범위가 있는 경우, T에 대한 pointer와 size라는 두 개의 member가 있다.

en.cppreference.com/w/cpp/container/span

 

std::span - cppreference.com

The class template span describes an object that can refer to a contiguous sequence of objects with the first element of the sequence at position zero. A span can either have a static extent, in which case the number of elements in the sequence is known at

en.cppreference.com

Example 사용 확인에 필요한 모든 정보와 소유권을 어떻게 양도하고 있는가?

Example

polymorphic base classes(다형성 기본 클래스)를 통과하는 인터페이스에 의해 가능한 점검이 어떻게 회피되는지 보여주는가? 그들이 실제로 필요한 것을 알고 있을 때? 또는 문자열을 "자유형" 옵션으로 사용

 

Enformcement

Flags(pointer, count)-style interfaces (호환성 이유로 수정할 수 없는 많은 예제가 flag지정됨)

반응형

'프로그래밍' 카테고리의 다른 글

[C++] Philosophy 9 & 10  (0) 2020.12.03
[C++] Philosophy 7 & 8  (0) 2020.12.02
[C++] Philosophy 3 & 4  (0) 2020.11.30
[C++] Philosophy 1 & 2  (0) 2020.11.29
[C++] shared_ptr, weak_ptr  (0) 2020.10.18