본문 바로가기
C#

[C#] 코딩 스탠다드(.NET 코딩 규칙)

by RucA 2024. 5. 8.
728x90
반응형

한 외국 블로그의 C# 코딩 스탠다드를 번역 및 정리한다.

 

https://www.dofactory.com/csharp-coding-standards

 

World's #1 .NET Developer Platform

Dofactory is the popular technology platform that offers software engineers the best jobs, products, and tutorials. Monetize your skills today!

www.dofactory.com

 

 

클래스(Class)


클래스의 이름과 메서드 이름에 파스칼(Pascal) 표기법 사용 지향

public class ClassName
{
	public void GetInfo()
    {
    	// ...
    }

	public void PrintInfo()
    {
    	// ...
    }
}

 

사유 : 마이크로소프트의 .NET Core와 일관되며, 읽기 쉽다


 

변수(Variable) 이름


지역 변수와 메서드 인자에 낙타(Camel) 표기법 사용 지향

Public class VariableName
{
	public void GetInfo(UserInfo userInfo)
    {
    	int userId = userInfo.id
        // ...
	}
}

 

사유 : 마이크로소프트의 .NET Core와 일관되며, 읽기 쉽다


 

식별자(Identifiers)


식별자에 헝가리안(Hungarian) 표기법 또는 어떠한 형식 표시자 사용 지양

//지향
int studentNumber
string name

//지양
int iStudentNumber
string strName

 

사유 : 마이크로소프트의 .NET Core와 일관됨. 추가로, Visual Studio IDE가 변수의 타입을 판단하기 매우 쉽게 만들어 줌(툴팁을 통해). 식별자에 타입 표시자를 지양하는 것이 좋음.


 

상수(Constants)


상수 또는 읽기 전용 변수에 대문자 표현(Screaming Caps) 사용 지양

//지향
public static const string GoodType = "GoodType";

//지양
public static const string BADTYPE = "BadType";

 

사유 : 마이크로소프트의 .NET Core와 일관되며, 대문자 표현은 너무 많은 이목을 끈다.


 

약어(Abbreviations)


약어 사용 자제

예외 : Id, Xml, Ftp, Uri와 같은 이름처럼 자주 사용되는 약어

//참고 블로그의 코드

// 지향
UserGroup userGroup;
Assignment employeeAssignment;
 
// 자제
UserGroup usrGrp;
Assignment empAssignment;
 
// 예외
CustomerId customerId;
XmlDocument xmlDocument;
FtpHelper ftpHelper;
UriPart uriPart;

 

사유 : 마이크로소프트의 .NET Core와 일관되며, 다양한 개발자들에 의한 비일관적인 약어를 예방한다.


 

약어 표기법(Abbreviations Casing)


3자 이상의 약어에 대해서는 파스칼(Pascal) 표기법 사용 지향 (2자는 둘다 대문자로)

//참고 블로그의 코드

HtmlHelper htmlHelper;
FtpTransfer ftpTransfer;
UIControl uiControl;

 

사유 : 마이크로소프트의 .NET Core와 일관되며, 대문자들은 시각적으로 너무 많은 이목을 끌 수 있다.


 

밑줄(Underscores : _ ) 사용 지양


식별자에 밑줄 사용 지양

예외 : 밑줄을 비공개(private) 정적(static) 변수의 접두사로 쓸 수 있다.

//참고 블로그의 코드

// 지향
public DateTime clientAppointment;
public TimeSpan timeLeft;
 
// 지양
public DateTime client_Appointment;
public TimeSpan time_Left;
 
// 예외
private DateTime _registrationDate;

 

사유 : 마이크로소프트의 .NET Core와 일관되며, 코드를 읽기 자연스럽게(이음표현(slur) 없이) 해준다. 또한 밑줄 스트레스를 피한다(예. 밑줄 보기 어려움)


 

형식(Type) 이름


Int16, Single, UInt64 등과 같은 시스템 타입 대신 사전정의된(predefined) 타입명 사용 지향

//참고 블로그의 코드

// 지향
string firstName;
int lastIndex;
bool isSaved;
 
// 지양
String firstName;
Int32 lastIndex;
Boolean isSaved;

 

사유 :마이크로소프트의 .NET Core와 일관되며, 코드를 읽기 더 자연스럽게 해준다.


 

암시적(Implicit) 형식


지역 변수 선언에 암시적 형식 var 사용 지향

예외 : 원시(primitive) 형식(int, string, double 등)은 사전정의된 이름을 사용한다.

//참고 블로그의 코드

var stream = File.Create(path);
var customers = new Dictionary();
 
// 예외
int index = 100;
string timeSheet;
bool isCompleted;

 

사유 : 특히 복잡한 제네릭 형식에서 잡다함(clutter)을 제거한다. 형식은 Visual Studio 툴팁으로 쉽게 탐지된다.


 

명사 클래스 이름


클래스를 명명하기 위해 명사 또는 명사 구 사용 지향

//참고 블로그의 코드

public class Employee
{
}
public class BusinessLocation
{
}
public class DocumentCollection
{
}

 

사유 :마이크로소프트의 .NET Core와 일관되며, 클래스를 기억하기 쉽게 한다.


 

인터페이스(Interfaces)


인터페이스의 접두사로 문자 I 사용 지향. 인터페이스의 이름은 명사 (구) 또는 형용사

//참고 블로그의 코드

public interface IShape
{
}
public interface IShapeCollection
{
}
public interface IGroupable
{
}

 

사유 : 마이크로소프트의 .NET Core와 일관됨.


 

파일(File) 이름


메인 클래스에 따른 소스 파일의 이름 명명 지향

예외 : 부분 클래스의 파일 이름은 그들의 소스(source) 또는 목적을 반영한다. (예. designer, generated 등)

//참고 블로그의 코드

// Located in Task.cs
public partial class Task
{
    //...
}
//참고 블로그의 코드

// Located in Task.generated.cs
public partial class Task
{
    //...
}

 

사유 : 마이크로소프트 관습과 일관됨. 파일은 알파벳 순으로 정렬되고, 부분 클래스는 인접하게 유지된다.


 

네임스페이스(Namespaces)


명확하게 정의된 구조로 네임스페이스 구성 지향

//참고 블로그의 코드

namespace Company.Product.Module.SubModule
namespace Product.Module.Component
namespace Product.Layer.Module.Group

 

사유 : 마이크로소프트의 .NET Core와 일관되며, 코드 기반(base)의 좋은 구성을 유지한다.


---

중괄호(Curly Brackets)


중괄호의 수직적인 열거(align) 지향

//참고 블로그의 코드

// 지향
class Program
{
    static void Main(string[] args)
    {
    }
}

 

사유 : 마이크로소프트는 다른 스탠다드를 가지지만, 개발자들은 수직적으로 괄호를 열거하는 것을 압도적으로 선호한다.


 

멤버(Member) 변수


정적 변수를 가장 위에, 모든 멤버 변수를 클래스의 윗부분에 선언 지향

//참고 블로그의 코드

// 지향
public class Account
{
    public static string BankName;
    public static decimal Reserves;
 
    public string Number {get; set;}
    public DateTime DateOpened {get; set;}
    public DateTime DateClosed {get; set;}
    public decimal Balance {get; set;}
 
    // Constructor
    public Account()
    {
        // ...
    }
}

 

사유 : 변수 선언을 찾을 필요를 예방하는, 일반적으로 통용되는 관습이다.


 

열거형(Enums)


열거형에 단수형(singular) 이름 사용 지향

에외 : 비트 필드 열거형

//참고 블로그의 코드

// 지향
public enum Color
{
    Red,
    Green,
    Blue,
    Yellow,
    Magenta,
    Cyan
}
 
// 예외
[Flags]
public enum Dockings
{
    None = 0,
    Top = 1, 
    Right = 2, 
    Bottom = 4,
    Left = 8
}

 

사유 : 마이크로소프트의 .NET Core와 일관되며, 코드를 읽기 더 자연스럽게 한다. 아래의 복수형 플래그는 열거형이 다중의 값을 가질 수 있기 때문이다(비트연산 'OR' 사용).


 

열거형 형식(Enum Types)


열거형의 형식 또는 열거형의 값의 명시적 구체화 지양 (에외 : 비트 필드)

//참고 블로그의 코드

// 지양
public enum Direction : long
{
    North = 1,
    East = 2,
    South = 3,
    West = 4
}
 
// 지향
public enum Direction
{
    North,
    East,
    South,
    West
}

 

사유 : 실제 형식과 값에 의존할때, 혼동이 일어날 수 있다.


 

열거형 접미사(Enum Suffix)


열거형 접미사로 Enum 사용 지양

//참고 블로그의 코드

// 지양
public enum CoinEnum
{
    Penny,
    Nickel,
    Dime,
    Quarter,
    Dollar
}
 
// 지향
public enum Coin
{
    Penny,
    Nickel,
    Dime,
    Quarter,
    Dollar
}

 

사유 : 마이크로소프트의 .NET Core와 일관되며, 식별자에 형식 표시자를 넣지 않는다는 이전의 규칙과 일관된다.


 

728x90
반응형