2024-04-02 (이전에 안올렸던거 채우기!)
깃허브! |
---|
https://github.com/ChangJin-Lee/ARproject |
★ https://github.com/ChangJin-Lee/ToonTank |
느낀점
언리얼 코딩표준에 대해서 조사해보았다. 접두사가 매우 신기했고 네임스페이스를 두 번 이상 사용하는 것도 신기했다. 언리얼의 코딩 표준에 대해 알 수 있는 시간이었다. 생각보다 양이 많은데 매일 읽어보면서 정리해나가야겠다.
명명 규칙을 사용할 때, 모든 코드 및 코멘트는 미국 영어의 철자법 및 문법을 사용해야 합니다.
이는 다른 오브젝트 지향 프로그래밍 언어에 익숙한 사용자를 위한 PascalCase 포맷입니다.
타입 이름에는 추가적으로 대문자로 이루어진 접두사를 포함하여 변수 이름과 구분합니다. 예를 들어 FSkin 은 타입 이름이고, Skin 은 FSkin 타입의 인스턴스입니다.
템플릿 클래스에는 접두사 T를 포함합니다.
class TAttribute
class UActorComponent
class AActor
class SCompoundWidget
class IAnalyticsProvider
template <typename Concept, typename... Ts>
enum class EColorBits
{
ECB_Red,
ECB_Green,
ECB_Blue
};
bPendingDestruction
bHasFadedIn.
그 외 대부분의 클래스는 접두사 F를 포함합니다. 그러나 일부 서브시스템은 다른 글자를 사용하기도 합니다.
Typedef의 경우 다음과 같이 해당 타입에 적합한 접두사를 사용합니다.
- 구조체의 typedef인 경우 F
- UObject 의 typedef인 경우 U
특정 템플릿 인스턴스화의 typedef는 더 이상 템플릿이 아니며, 알맞은 접두사를 붙여야 합니다.
typedef TArray<FMytype> FArrayOfMyTypes;
C#에서는 접두사가 생략됩니다.
언리얼 헤더 툴의 경우 대부분 올바른 접두사가 필요하므로, 접두사를 제공하는 것이 중요합니다.
이러한 템플릿 파라미터를 기반으로 하는 타입 템플릿 파라미터 및 중첩된 타입 에일리어스는 타입 카테고리를 알 수 없으므로 상기 접두사 규칙의 대상이 아닙니다.
설명적인 용어 뒤에는 Type 접미사를 사용하는 것이 좋습니다.
In 접두사를 사용하여 다음과 같이 템플릿 파라미터를 에일리어스와 구분합니다.
template <typename InElementType>
class TContainer
{
public:
using ElementType = InElementType;
};
타입 및 변수 이름은 명사입니다.
메서드 이름은 메서드의 이펙트를 설명하거나, 이펙트가 없는 메서드의 반환 값을 설명하는 동사입니다.
매크로 이름은 모두 대문자로 구성되고, 단어가 언더스코어로 분리되며, 접두사 UE_ 가 사용되어야 합니다.
#define UE_AUDIT_SPRITER_IMPORT
변수, 메서드, 클래스 이름은 다음과 같아야 합니다.
명확함
확실함
내용을 파악할 수 있음
이름의 범위가 넓을수록 올바르고 내용을 파악할 수 있는 이름을 사용해야 합니다. 과도한 약어는 피합니다.
각 변수의 의미에 대해 코멘트를 제공할 수 있도록 모든 변수는 자체적인 줄에서 선언해야 합니다.
이는 JavaDocs 스타일에 필요한 부분입니다.
변수 앞에 여러 줄 또는 한 줄의 코멘트를 사용할 수 있으며, 변수 그룹화를 위한 빈 줄은 선택사항입니다.
부울을 반환하는 모든 함수는 IsVisible() 또는 ShouldClearBuffer() 등의 true/false 질문을 해야 합니다.
프로시저(반환 값이 없는 함수)는 강한 동사 뒤에 오브젝트를 붙여 써야 합니다. 메서드의 오브젝트가 그 안에 있는 오브젝트일 때는 예외이며, 이 경우 오브젝트는 컨텍스트에서 이해됩니다. 'Handle' 및 'Process' 등의 모호한 동사로 시작하는 이름은 피해야 합니다.
다음과 같은 경우 함수 파라미터 이름에 접두사 'Out'을 추가할 것이 좋습니다.
함수 파라미터가 레퍼런스로 전달되는 경우
함수를 그 값에 쓸 것으로 예상되는 경우
이렇게 하면 이 실행인자에 전달되는 값이 함수로 대체된다는 것을 확실히 알 수 있습니다.
In 또는 Out 파라미터도 부울인 경우 bOutResult 와 같이 In/Out 접두사 앞에 'b'를 붙입니다.
값을 반환하는 함수는 반환 값을 설명해야 합니다. 함수가 어떤 값을 반환하는지 이름을 보고 정확히 알 수 있어야 합니다. 특히 부울 함수의 경우 이는 매우 중요합니다. 예시로 다음 두 가지 방법을 확인해 보세요.
// true일 경우 무슨 의미일까요?
bool CheckTea(FTea Tea);
// 이름을 통해 true일 경우 차가 신선하다는 것을 명확히 알 수 있습니다.
bool IsTeaFresh(FTea Tea);
float TeaWeight;
int32 TeaCount;
bool bDoesTeaStink;
FName TeaName;
FString TeaFriendlyName;
UClass* TeaClass;
USoundCue* TeaSound;
UTexture* TeaTexture;
해당하는 경우 네임스페이스를 사용하여 클래스, 함수 및 변수를 구성할 수 있습니다. 네임스페이스를 사용하는 경우에는 아래 규칙을 따릅니다.
대부분의 UE 코드는 현재 글로벌 네임스페이스에 래핑되어 있지 않습니다.
UnrealHeaderTool에는 네임스페이스가 지원되지 않습니다.
UCLASS , USTRUCT 등이 아닌 새 API는 UE:: 네임스페이스에 배치해야 하며, 이상적으로는 중첩된 네임스페이스(예: UE::Audio:: )를 사용하는 것이 좋습니다.
전역 범위에는 .cpp 파일에서도 using 선언을 넣지 않습니다('unity' 빌드 시스템에 문제가 생깁니다).
다른 네임스페이스 안이나 함수 바디 안에는 using 선언을 넣어도 괜찮습니다.
네임스페이스 안에 using 선언을 넣는 경우, 동일 이동 단위 내 해당 네임스페이스의 다른 곳으로 이어지게 됩니다. 일관성만 있으면 괜찮을 것입니다.
위의 규칙을 따라야만 헤더 파일에서 using 선언을 안전하게 사용할 수 있습니다.
-전방 선언된 타입은 각각의 네임스페이스 안에서 선언해야 합니다.
하나의 네임스페이스 안에 다수의 클래스 또는 타입을 선언할 경우 다른 전역 범위의 클래스에서 사용하기 어려울 수 있습니다(예를 들면, 함수 시그니처는 클래스 선언에 나타날 때 명시적 네임스페이스를 사용해야 합니다).
using 선언을 사용하여 네임스페이스 안의 특정 변수만 자신의 범위로 에일리어싱할 수 있습니다.
매크로는 네임스페이스 내에 있을 수 없습니다.