본문 바로가기

Coding Skill

[CodingSkill] GNU / K&R / BSD

[해당 포스트는 개인적으로 공부를 하고 차후에 참고용으로 하고자 작성한 것입니다.
따라서 잘못된 부분이나 부족한 부분이 있을 수 있기에 참고하시기 바랍니다.]

개발자들이 코딩을 할 때 각자 개성에 맞게 소스 코드를 작성하는 습관이 있다.

소규모 프로젝트에선 각자 스타일에 맞게 작성을 해도 문제는 없지만, 큰 프로젝트에선 혼동이 발생할 수 있다.

코딩 스타일은 코드 유지보수에 영향을 끼치며, 공동작업에선 혼란이 발생할 수 있기에 서로 공통으로 맞춰 작성해야 할 필요가 있다.

이러한 문제를 해결하기 위해 국제적으로 사용하는 코딩 스타일이 3가지가 존재한다.

 

1. GNU

블록을 if문 아래에 작성하도록 한다. 블록이 if에 속한 블럭임을 표시하기에 구조를 잘 파악할 수 있다는 장점이 있지만, 들여 쓰기를 많이 하기 때문에 코드 줄이 늘어나는 단점이 있다.

 

if (...)
	{
    		todo...;
	}

 

2. K&R

제어문과 같은 행에 Scope를 넣는다. 코드 줄 수를 줄일 수 있으며, 한눈에 많은 코드를 볼 수 있고 많은 코드를 작성할 수 있다. 주로 Java계열의 기본 포맷에서 사용된다.

 

if (...) {
	todo...;
}

 

3. BSD

GNU의 Block의 부분을 분명히 보여준다는 장점과 K&R의 수평으로 많은 코드를 작성할 수 있는 장점을 가져와 결합한 스타일이다. 줄 수는 GNU 스타일만큼 늘어나지만 수평으로는 K&R만큼 많이 쓸 수 있다. Visual Studio에서의 기본 포맷으로 사용된다.

 

if (...)
{
	todo...;
}

 

- K&R과 BSD

같은 코드를 K&R과 BSD로 작성한 것을 비교해보자.

 

K&R

let a = true;
let b = false;

if (true) {
    for (let i = 0; i <= 10; i++) {
        if (a) {
            console.log(a);
        } else if (b) {
            console.log(b);
        }
    }
}

 

BSD

let a = true;
let b = false;

if (true)
{
    for (let i = 0; i <= 10; i++)
    {
        if (a)
        {
            console.log(a);
        }
        else
        {
            console.log(b);
        }
    }
}

 

한 눈에 봐도 BSD의 코드 길이가 길어지는 것을 볼 수 있다. 그래서 주로 출판되는 코딩 교제들은 페이지 길이를 절약하고자 K&R을 주로 쓴다. 따라서 학생들은 K&R 스타일에 자연스럽게 익숙해져 있다. 눈에 보기에도 K&R 스타일이 좋아 보이지만 이후 리펙토링 할 때 귀찮은 점이 발생한다.

 

만약 제어문 for를 제거한다고 해보자.

 

K&R

let a = true;
let b = false;

//한 줄만 지워선 해결이 안 된다.
if (true) {
    // for (let i = 0; i <= 10; i++) {
        if (a) {
            console.log(a);
        } else if (b) {
            console.log(b);
        }
    }
}

 

BSD

let a = true;
let b = false;

//한 줄만 지워도 정상적으로 작동한다.
if (true)
{
    // for (let i = 0; i <= 10; i++)
    {
        if (a)
        {
            console.log(a);
        }
        else
        {
            console.log(b);
        }
    }
}

 

BSD 방식에선 반복문 한 줄만 지워도 문제가 없이 동작하지만, K&R에선 Scope 한 개가 지워지므로 닫히는 Scope까지 같이 지워줘야하는 귀찮은 작업이 발생한다. 따라서 리팩터링이 좀 귀찮아진다.

 

참고: https://namu.wiki/w/%EC%BD%94%EB%94%A9%20%EC%8A%A4%ED%83%80%EC%9D%BC

'Coding Skill' 카테고리의 다른 글

[TDD] 테스트 주도 개발  (0) 2019.09.04
[Coding Skill] 변수 및 함수 명칭 작성 스타일  (0) 2019.08.30