본문 바로가기
애자일(Agile)개발방법론

[4] C# 개발 표준(코딩 규칙) MS 권장

by swconsulting 2015. 2. 26.

오늘은 Microsoft에서 권장하는 코딩 규칙을 정리해 보겠습니다.


개발 코딩 표준을 팀원 모두 따르면 아래와 같은 장점이 있습니다.

 

코드 레이아웃이 아닌 내용에 집중할수 있게 코드를 작성해야 한다.

이전에 작성한 경험을 기초로 새로운 코드를 빠르게 작성할 수 있어야 합니다.

복사변경유지보수가 잘될 수 있도록 코드를 작성해야 합니다.

유용한 예제를 제공하면 좋다. (Best Practice)

 

마지막으로 제가 가장 중요하게 생각하는 개발 표준을 따라서 팀원 모두가 개발하면 전체 프로젝트 코드 통일성, 일관성이 좋아집니다. 만약 여러분이 약 500페이지 책을 5명이어서 같이 쓰게 된다면 일반적으로 100페이지씩 나누어서 500페이지를 책을 쓰실 것입니다. 이 경우 책 레이아웃, 형식, 글자체 등이 통일이 되지 않는다면 책이 정말 두서 없어지고 독자가 이해하기 힘들 것입니다. 


개발(코딩)도 공동 집필하는 책과 같습니다. 그래서 꼭 여러 팀원들이 개발 표준을 따라야 합니다.



*Naming Conventions

var currentPerformanceCounterCategory = new System.Diagnostics.

    PerformanceCounterCategory();

 

- Camel, Pascal 를 유의해서 사용해야 한다.

한줄에 표시하기가 너무 긴 경우 .을 이용해서 몇 줄로 나누어서 처리하면 된다.

 

*Layout 규칙

-띄어쓰기는 4칸을 사용한다.

-한줄에 하나씩만 사용한다.

-여러 괄호 식을 아래 처럼 사용해서 명확하게 구분한다.

if ((val1 > val2) && (val1 > val3))

{

    // Take appropriate action.

}

 

*주석 규칙

-주석은 대문자로 작성하고 글자는 80이내로 한다

-줄 바꿀 경우에는 추가로 //를 하면 된다.

// The following declaration creates a query. It does not run

// the query.

 

*C# 코딩 가이드

-스트링 데이타 타입

string displayName = nameList[n].LastName + ", " + nameList[n].FirstName;

글자가 길 경우에는 StringBuilder를 사용한다.

var phrase = "lalalalalalalalalalalalalalalalalalalalalalalalalalalalalala";

var manyPhrases = new StringBuilder();

for (var i = 0; i < 10000; i++)

{

    manyPhrases.Append(phrase);

}

//Console.WriteLine("tra" + manyPhrases);


-var 지역 변수 사용

오른쪽 변수 형식인 명확하거나 암시적 형식을 사용해도 됩니다주로 로컬 변수일 경우 사용해도 됩니다.

var var1 = "This is clearly a string.";

var var2 = 27;

var var3 = Convert.ToInt32(Console.ReadLine());

 

오른쪽 리턴값등 형식이 명확하지 않는 경우에는 var를 사용하지 않습니다.

int var4 = ExampleClass.ResultSoFar();


변수 이름에 Type을 지정하지 않습니다특히 var일경우 차후 변수 타입이 변경될 경우 코드 디버깅이 어려워집니다.

var inputInt = Console.ReadLine();

Console.WriteLine(inputInt);


for, foreach에서 var 사용합니다.

var syllable = "ha";

var laugh = "";

for (var i = 0; i < 10; i++)

{

    laugh += syllable;

    Console.WriteLine(laugh);

} 

foreach (var ch in laugh)

{

    if (ch == 'h')

        Console.Write("H");

    else

        Console.Write(ch);

}

 

Console.WriteLine();


-배열

간경하고 단순하게 작성합니다.

string[] vowels1 = { "a""e""i""o""u" }; 

var vowels2 = new string[] { "a""e""i""o""u" };

var vowels3 = new string[5];

vowels3[0] = "a";

vowels3[1] = "e";

만약 배열 사이즈를 알고 선언한다면꼭 개별 배열 값에 초기화 값을 넣어주어야 합니다.

 

-Delegate(대리자)

 최대한 간결하게 해야 한다.

// 선언

public delegate void Del(string message);

// 메소드 이름이 Delegate와 매칭(매핑)되어야 한다.

public static void DelMethod(string str)

{

    Console.WriteLine("DelMethod argument: {0}", str);

}

// 아래 처럼 선언만 하는 것은 피한다.

Del exampleDel2 = DelMethod;

 

// new를 해서 사용해서 Deleagte 사용할 수 있도록 하는게 좋다.

Del exampleDel1 = new Del(DelMethod);

 

-예외 처리 (try catch)

static string GetValueFromArray(string[] array, int index)

{

    try

    {

        return array[index];

    }

    catch (System.IndexOutOfRangeException ex)

    {

        Console.WriteLine("Index is out of range: {0}", index);

        throw;

    }

}


-New 연산자

개체 Initialize를 이용해서 간단하게 초기화 하는게 좋다.

var instance3 = new ExampleClass { Name = "Desktop", ID = 37414,

    Location = "Redmond", Age = 2.3 };

var instance4 = new ExampleClass();

instance4.Name = "Desktop";

instance4.ID = 37414;

instance4.Location = "Redmond";

instance4.Age = 2.3;


-이벤트 처리

나중에 제거가 필요없는 이벤트는 아래 처럼 람다를 이용해도 좋다.

// 생성자에서 바로 이벤트 등록하고 처리하는 함수를 람다식으로 등록한다.

public Form2()

{

 

    this.Click += (s, e) =>

        {

            MessageBox.Show(

                ((MouseEventArgs)e).Location.ToString());

        };

}

위와 다르게 간단하지 않고 복잡할 경우에는 따로 이벤트 함수를 처리하는게 좋다.

// 생성자에서 이벤트를 등록만한다.

public Form1()

{

    this.Click += new EventHandler(Form1_Click);

}

 

void Form1_Click(object sender, EventArgs e)

{

    MessageBox.Show(((MouseEventArgs)e).Location.ToString());

}


-정적 멤버 (Static)

1)ClassName.StaticMember 이러한 형식을 사용하면 됩니다.

2)만약 상속을 통해서 자식 클래스에서 부모 클래스 메소드 함수를 다시 정의하거나 하면 절대 안됩니다차후 디버깅 할때 어느 정적 함수인지 혼동이 오거나 차후 코드 수정때 예상하지 못한 Side Effect  발생할 수 있습니다.

 

-LINQ 쿼리

쿼리 변수 이름을 아래처럼 의미가 있는 것을 사용합니다.

var seattleCustomers = from cust in customers

                       where cust.City == "Seattle"

                       select cust.Name;

 

별칭을 사용할 경우 파스칼 타입을 합니다.(빨간색 글자)

var localDistributors =

    from customer in customers

    join distributor in distributors on customer.City equals distributor.City

    select new { Customer = customer, Distributor = distributor };

 

 

별칭 이름이 모호할 경우 아예 명확하도록 이름을 바꿉니다. (ID ID, 이름도 이름으로 빨간색 글자)

var localDistributors2 =

    from cust in customers

    join dist in distributors on cust.City equals dist.City

    select new { CustomerName = cust.Name, DistributorID = dist.ID };

 

LINQ 쿼리 변수는 var를 이용해서 선언합니다또한 코드는 from 이후 작성해서 가독성을 높입니다.

var seattleCustomers = from cust in customers

                       where cust.City == "Seattle"

                       select cust.Name;

 

 From 다음에 where를 사용해서 필터링 한후 한번 범위를 줄인 후에 쿼리가 동작하도록 해야

가독성과 성능이 좋아집니다.

var seattleCustomers2 = from cust in customers

                        where cust.City == "Seattle"

                        orderby cust.Name

                        select cust;

내부 여러 컬렉션을 액세스 하는 경우라면 join 대신 여러 from절을 사용한다아래 처럼 student 안에 scores를 또 사용해서 처리했습니다.

var scoreQuery = from student in students

                 from score in student.Scores

                 where score > 90

                 select new { Last = student.LastName, score };

 

Microsoft에서 권장하는 C# 코딩 표준에 대해서 알아 보았습니다위 내용을 준수해서 코드를 개발하세요.

 

참고 URL : https://msdn.microsoft.com/en-us/library/ff926074.aspx