본문으로 건너뛰기

C# 코딩 스탠다드

· 약 11분
karais89

김포프님 C# 코딩 스탠다드

포프님이 올리신 C# 코딩 스탠다드의 번역 글입니다.

번역 자체는 구글 번역에서 이상한 부분은 제가 수정 하였습니다. 번역 자체의 문제가 있을 수 있습니다.

코딩 스탠다드는 코드 몽키 레벨에서는 왜 이렇게 작성했는지에 대한 설명을 할 필요도 없고 그냥 코딩 스탠다드에 주어진 내용 대로 코드를 짜면 된다고 합니다.

하지만 아래 45가지의 코딩 스탠다드에는 분명히 그렇게 해야 되는 이유가 존재 합니다.

꼭 아래의 코딩 스탠다드를 사용하여 코드를 작성하실 필요는 없습니다.

경험에 바탕을 둔 방법​

  1. 읽기 좋은 코드가 우선(대부분의 경우 사용 설명서가 항상 문서화되어야 함)
  2. 그렇지 않은 이유가 있는 경우가 아니라면 IDE의 자동 형식 지정 방식을 따르십시오. (VisualStudio의 Ctrl+K+D)
  3. 기존 코드로부터 배우기

참조​

이 코딩 스탠다드는 이러한 코딩 표준에 의해 영감을 받는다.

이름 지정 규칙 및 스타일​

1. 클래스 및 구조체에 파스칼 케이스1 사용​

class SomeClass;    
struct SomeStruct;

2. 지역 변수 이름과 함수 매개 변수에 카멜 케이스2 사용​

void SomeMethod(int someParameter)
{
int someNumber;
}

3. 모든 메소드 이름은 파스칼 케이스 사용​

public uint GetAge()
{
// function implementation...
}

4. 메소드 이름은 동사 + 명사 사용​

public uint GetAge()
{
// function implementation...
}

5. non-public 메서드면 post fix로 "Internal"을 붙인다​

Private uint GetAgeInternal()
{
// function implementation...
}

6. 상수는 ALL_CAPS_SEPARATED_BY_UNDERSCORE를 사용한다.​

const int SOME_CONSTANT = 1;

7. namespaces는 파스칼 케이스를 사용한다.​

namespace System.Graphics

8. boolean 변수 앞에는 b를 붙이고 프로퍼티에는 앞에 is를 붙인다.​

bool bFired;    // for local variable
Private bool mbFired; // for private class member variable
Public bool IsFired { get; private set; }

9. 인터페이스 앞에는 I를 붙인다.​

interface ISomeInterface 
{

}

10. enum 앞에는 E를 붙인다.​

public enum EDirection
{
North,
South
}

11. private 멤버 변수 앞에 m을 붙입니다. 나머지 멤버 변수에는 파스칼 케이스를 사용하십시오.​

Public class Employee
{
public int DepartmentID { get; set; }
private int mAge;
}

12. 반환 값이있는 메소드는 반환 된 값을 설명하는 이름을 가져야합니다.​

public uint GetAge();

13. 설명적인 변수 이름을 사용하십시오. 예를 들어 루프에 사용되는 사소한 변수가 아니라면 i 또는 e 대신 index이나 employee이 될 수 있습니다.​

14. 두개의 문자만 있는 경우 머리 글의 모든 문자를 대문자로 구분합니다.​

public int ID { get; private set; }

15. 두개의 문자 이상인 경우 머리 글자로 된 첫 번째 문자 만 대문자로 표시하십시오.​

public string HttpAddress { get; private set; }

16. getter setter 함수보다 프로퍼티를 선호해라.​

이거 대신에:
public class Employee
{
private string mName;
public string GetName();
public string SetName(string name);
}

이렇게 사용해라:
public class Employee
{
public string Name {get; set;}
}

17. 4 개의 스페이스와 동일하게 탭을 사용해라​

18. 로컬 변수가 사용되는 첫 번째 행에 최대한 가깝게 선언하십시오.​

19. 새로운 줄에 항상 여는 중괄호 "{" 를 넣으십시오.​

20. scope에 단 하나의 줄이 있어도 중괄호를 추가하십시오.​

if (bSomething)
{
return;
}

21. 부동 소수점 값에 대한 정밀도 지정은 명시 적으로 double이 필요하지 않는 한 사용하십시오.​

float f = 0.5F;

22. switch 문에는 항상 default가 있어야 합니다.​

switch (number)
{
case 0:
...
break;
default:
break;
}

23. case 문에 코드가없는 경우를 제외하고는 switch case에 대한 fallthrough 설명을 추가하십시오.​

switch (number)
{
 case 0:
   DoSomething();
   //fallthrough
 case 1:
   DoFallthrough();
   break;
 case 2:
 case 3:
   DoNotFallthrough();
break;
 default:
   break;
}

24. 스위치 문에서 default 문이 발생해야되지 않아야 되는 경우에는 항상 Assert(false)를 더해라. assert 구현에서, 이것은 릴리즈 빌드를위한 최적화 힌트를 추가 해라.​

switch (type)
{
case 1:
...
break;
Default:
Debug.Fail("unknown type");
break;
}

25. 재귀 함수의 이름은 "Recursive"로 끝내라.​

void FibonacciRecursive();

26. 클래스 변수와 메소드의 순서는 다음과 같아야합니다.​

  1. public variables
  2. internal variables
  3. protected variables
  4. private variables
  5. public methods
  6. Internal methods
  7. protected methods
  8. private methods

27. 함수 오버로딩은 대부분의 경우 피해야합니다.​

이거 대신에:
Anim GetAnim(int index);
Anim GetAnim(string name);

이렇게 사용해라:
Anim GetAnimByIndex(int index);
Anim GetAnimByName(string name);

28. 여러 개의 작은 클래스를 그룹화하는 것이 합리적이지 않으면 각 클래스는 별도의 소스 파일에 있어야합니다.​

29. 파일 이름은 대문자와 소문자를 포함한 클래스의 이름과 동일해야합니다.​

class Anim {}

Anim.cs

30. 너가 가지고 있는 주장에는 assert를 사용해라. (예, 모든 함수는 Debug.Assert( not null parameters) 를 가져야 한다.)​

31. bigflag 열거 형의 이름은 Flags로 끝나야합니다.​

public enum EVisibilityFlags
{
}

32. 기본 매개변수보다 오버로딩을 더 선호한다.​

33. 기본 매개 변수가 사용되면 null, false 또는 0과 같은 자연스러운 상수로 제한하십시오.​

34. 지역 변수 숨김은 허용하지 않는다.​

public class SomeClass
{
public int Count {get;set;}
public void Func(int Count)
{
for (int count = 0; count != 10; ++count)
{
// Use Count
}
}
}

35. 항상 System.Collections의 컨테이너보다 System.Collections.Generic의 컨테이너를 사용하십시오. 순수 배열을 사용하는 것도 좋습니다.​

36. var 키워드 대신 실제 타입을 사용하는 걸 선호합니다. Enumerator같은 경우에는 var를 사용할 수 있습니다.​

37. 싱글톤 패턴이 아닌 static class를 사용해라.​

38. async void 보다 async Task를 사용해라. async void는 오직 이벤트 핸들러에서만 사용해라.​

39. 경계에서 외부 데이터의 유효성을 검사하고 데이터를 함수에 전달하기 전에 반환하십시오. 즉,이 시점 이후에 모든 데이터가 유효하다고 가정합니다.​

40. 따라서 우리 함수 내부에서 예외를 던지지 마십시오. 이것은 경계에서만 처리되어야합니다.​

41. public 함수에서는 특히 매개 변수에 null을 허용하지 않는 것이 좋습니다.​

42. 만약 매개변수에 null을 사용해야 하는 경우라면, 매개변수 이름의 postfix로 OrNull을 붙이십시오.​

43. 어떤 함수, 특히 public 함수에서는 null을 반환하지 않기를 바랍니다. 하지만 예외를 throw 하지 않도록 null을 반환해야 하는 경우가 있습니다.​

44. 만약 함수에서 null을 반환해야 된다면, 함수 이름에 Postfix로 OrNull을 붙입니다.​

public string GetNameOrNull();

45. 객체 initializer를 사용하지 말자. 대신에 명명 된 매개 변수와 함께 명시적 생성자를 사용합시다. 아래 두가지 예외 상황은 제외 합니다.​

a. 오브젝트가 한 곳에서만 작성된 경우. (예를 들어, 1 회의 DTO)
b. 객체가 소유 클래스의 정적 메서드 내에서 만들어 질 때 (예 : 팩토리 패턴)

  1. 첫 단어를 대문자로 시작하는 표기법. 예) BackgroundColor, TypeName, PowerPoint↩
  2. 각 단어의 첫문자를 대문자로 표기하고 붙여쓰되, 맨처음 문자는 소문자로 표기함. 예) backgroundColor, typeName, iPhone↩