[읽기좋은 코드가 좋은 코드다] 루프와 논리를 단순하게 만들기
카테고리: ReadableCode
삼항연산자를 사용하는 조건문
삼항연산자는, 라인수가 길어지는 조건문들을 한줄로 간단하게 나타낼 때 사용한다.
if(hour >= 12)
{
time+="pm";
}
else
{
time+="am";
}
위와 같은 8줄짜리 코드를 삼항연산자를 쓰면 다음과 같이 줄일 수 있다.
hour >= 12 ? time+="pm" : time+="am";
//또는
//time += hour >= 12 ? "pm" : "am";
이렇게 하면, 코드 라인수도 줄이고, 가독성도 좋은 코드가 만들어지는것 같다. 그렇다면 모든 if문에 삼항연산자를 넣으면 좋은걸까? 다음과 같은 코드가 있다.
return exponent >= 0 ? mantissa * (1 << exponent) : (mantissa) / (1 << -exponent);
위 코드는 한눈에 어떤 동작을 하는지를 알기가 힘들다.
따라서, 삼항연산자를 사용하는것이 무조건 가독성에 좋지만은 않다는 것을 알 수 있다. 더 나아가서, C#의 linq 같은 파이프라인 문법들도 마찬가지다.
결국, 가독성이 좋아보이는 방향으로 코드를 짜는것이 좋다. 하지만, 그 가독성이 좋아보이는 방향이 나한테만 그런지, 다른사람한테도 그런지를 생각해야 한다. 그래서 정답이 없는 분야라 경험할 것이 많은것 같다.
goto 문법
c언어에서는 goto 라는 문법이 있다. 이 문법은 프로그램을 짜는데 거의 써서는 안되는 금기사항처럼 여겨진다. 하지만, 여전히 c 프로젝트에서는 해당 문법을 사용한다. goto는 무분별하게 사용하면 아주 안좋은 문법이지만, exit 포인트만을 가르키도록 제한한다면, 괜찮다. (그래도 피할 수 있다면 피하는것이 좋다)
if(p == NULL) goto exit;
exit :
fclose(file1);
fclose(file2);
return;
최근에 많이 사용하는 언어들은, goto보다 더 좋은 방법들이 있어 사용할 일은 없겠지만, goto를 안전하게 사용하는 방법이 있어서 정리하였다.
static 키워드 사용하기
이 방법은 처음 듣고 좀 놀랬다. 내가 아는 static 키워드는 Data영역에 생성되고, 프로그램이 꺼질 때 까지 메모리에 적재되어 있어서, 되도록이면 사용하면 안된다고 알고 있었다. 히지만 책에서는 static 키워드를 사용해서 클래스 멤버로부터 접근을 제한해, 다른사람이 볼 때, 부수효과가 없는 함수라고 인식하도록 하여라 라고 한다.
그래서 찾아보니까, 언어마다 다르겠지만, 내가 많이 사용하는 C#에서는 static field 는 heap (managed)에 들어가고, static method 들은 data 영역에 들어간다고 한다. method의 크기는 그렇게 크지 않아서, data영역에 넣어도 문제가 되지 않는다고 한다.
public class SomeClass
{
private int a = 0;
private int b = 0;
public SomeClass(int _a, int _b)
{
a = _a;
b = _b;
}
public int Add()
{
return a + b;
}
}
위와 같은 클래스는 생성자에서 멤버변수를 받아서, 계산된 결과를 리턴하도록 설계되어 있다. 이렇게 하면, 멤버변수 a, b를 가지고 다른 작업을 하게 될 때, 부수효과가 생기게 된다.
위 클래스를 static 함수를 사용해서 표현하면 다음과 같다.
public class SomeClass
{
public static int Add(int _a, int _b)
{
return _a + _b;
}
}
static 함수 안에는 static이 아닌 멤버변수는 들어갈 수 없기 때문에, 위와 같이 표현이 된다. 물론, static을 빼고, 인자로 숫자들을 받아서 처리하는 방법도 있지만, 저자가 말하는 것은 static으로 명시를 해서, 멤버변수를 넣으려고 하면 컴파일 에러가 뜨도록 하라는것 같다.
변수 클로저 넣기
javascript 같은 언어는 private field를 지원하지 않는다. 하지만, private field는 부수효과를 막는 아주 중요한 개념이다. 그래서, 언어 차원의 키워드는 없지만, private field를 구현할 수 있는 방법이 있다.
const submit_form = (function () {
let submitted = false;
return function (form_name) {
if (submitted) {
return;
}
//실제 로직
submitted = true;
};
})();
인라인 함수를 통해 상태를 숨길 수 있다.
댓글 남기기