코딩항해기

[리뷰/코딩알려주는누나] 확장성&재사용성 높은 코드 짜는 법 본문

IT tech

[리뷰/코딩알려주는누나] 확장성&재사용성 높은 코드 짜는 법

miniBcake 2024. 9. 29. 09:39

 

 

 

 

 

1. 코드 안에 하드코딩은 줄이고 매개변수를 이용한다.

function timer(){
	setTimeOut(()=>{
		alert("time done");
	}, 3000); //3초 기다렸다가 alert창을 띄운다.
}

//만약 다른 곳에서는 시간 대기가 필요하다면?
// -> 재사용성이 떨어지는 코드이다.

function timer(time){
	setTimeOut(()=>{
		alert("time done");
	}, time); //time만큼 기다렸다가 alert창을 띄운다.
}

 

2. 기본값 반환은 재사용성을 해칠 수 있다.

function setPreferFont(font){
	if(font) return font; //인자로 들어온 font가 있다면 해당 폰트를
	return Font.ARIAL; //없다면 ARIAL을 반환한다.
}

//하지만 다른 페이지에서 기본값이 바탕체라면?
// -> 기본값과 같은 설정은 함수를 호출하는 쪽에서 작성하는 것이 옳다.

 

 

3. 불필요한 가정은 코드 재사용성을 해친다. (=섣부른 최적화)

function getImages(){
	for(section in sections){ //반복문을 돌려서
		if(section.containsImage()) return section.image;
		//만약 이미지가 있다면 바로 해당 이미지를 반환한다.
	}
	return null;
	//하나도 없다면 null을 반환한다.
}

//다른 곳에서 여러 이미지가 필요하다면?
// -> 불필요한 가정은 없애고 함수를 호출하는 쪽에서 하나만 쓰는 편이 낫다.

function getImages(){
	const images = []; //빈 배열을 선언한다.
	for(section in sections){ //반복문을 돌려서
		images.push(section.image); //배열에 이미지를 담는다.
	}
	return images; //배열을 반환한다.
}

 

 

4. 열거형 값을 암묵적으로 처리하지 말아야한다.

function predict(cond){
	if(cond == "BUST") return false; //cond가 BUST라면 false
	return true; //그 외의 모든 경우는 true
}

//만약 종류가 더 추가된다면?
//바로 true를 반환하게 되는 문제가 발생한다. (false를 반환해야하는 값일 수 있음)
// -> 하나하나 대응하는 방식으로 작성해야한다.

function predict(cond){
	switch (cond){
		case "BUST": //cond가 BUST라면
			return false; //false를 반환한다.
		case "OK": //cond가 OK라면
			return true; //true를 반환한다.
		}
	throw new Error("이 케이스가 존재하지 않습니다."); //default로 처리가능하다.
	//BUST도 아니고 OK도 아닌 값이 들어오면 Error를 발생시킨다.
	//해당 케이스를 추가해야함을 개발자에게 알려줄 수 있다.
}

 

 

 

오용하지 않도록 하는 법

1. 값이 없을 때 null을 반환, 또는 에러를 반환하게 해야한다.

⇒ 만약 임의의 기본값이나 아무 것도 반환하지 않는다면 에러찾기가 어려워진다.

function getAge(){
	if(!this.age){ //나이가 없다면 
		return 0; //기본값을 반환한다.
	}
	return this.age; //나이가 있다면 해당 나이를 반환한다.
}

//현재는 문제 없어보이지만 이 함수를 가지고 사용하게 되는 측에서 에러가 발생할 수 있다.

function getAvgAge(userList){
	for(i in userList){ //반복문을 돌며
		sumOfAge += parseInt(userList[i].getAge()) //user들의 나이를 캐스팅해 누적한다.
	}
	return sumOfAge / userList.length; //누적한 값을 userList의 길이로 나눈 값을 반환한다.
}
//없는 경우 0을 반환하기 때문에 정확한 평균값이 나올 수 없다.
//별도의 오류도 발생하지 않아 추가 조치를 해야한다는 것을 알 수 없다.

//수정한 함수
function getAge2(){
	if(!this.age){ //나이가 없다면
		return null; //null을 반환한다.
	}
	return this.age; //나이가 있다면 해당 나이를 반환한다.
}

//null을 반환하면 int로 캐스팅할 수 없으므로 오류가 발생하게 되어 문제를 알 수 있다.

 

 

2. 중요한 값은 옵셔널이면 안된다.

//옵셔널 : 선택적인 값으로 있어도 되고 없어도 된다.

function displayValue(string? text){ //text는 옵셔널
	display({title:text, color:red})
}
displayValue(); //text가 옵셔널이므로 생략이 가능하다.
//실행결과 title을 보여주지 않는 문제가 발생한다.

//중요한 값은 필수값으로 둬야하며 옵셔널로 넣을 경우 별도의 조치를 취해야한다.
//(null값 검증 등)

 

 

3. 웬만하면 const를 사용하고 웬만하면 값 복제를 이용한다. (특히 배열이나 객체 reference 타입)