함수를 만들 때, 대부분의 사람들이 고민을 하게 된다. 이 정도로 짧은 라인일 뿐인데 혹은 한번밖에 쓰이지 않는 로직인데, 함수로 정의해야 할까?
이런 고민을 하는 이유는 프로그래밍을 배우면서, 함수에 대한 정의를 배우기 때문(?)일 것 같다.
- 함수(function), 서브루틴(subroutine), 루틴(routine), 메서드(method), 프로시저(procedure)는 소프트웨어에서 특정 동작을 수행하는 일정 코드 부분이다. 즉, '특정한 작업을 위해 재활용할 수 있도록 구현한 코드 블록'을 의미한다.
재활용할 수 있도록 구현한 코드 블록. 솔직히 나는 이 재활용이란 단어를 왜 넣었는지, 이해가 되지 않는다. 재사용도 아니고... 재활용이라니...
한국어가 아닌 영어로도 보자.
- Functions may be defined within programs, or separately in libraries that can be used by many programs. In different programming languages, a function may be called a routine, subprogram, subroutine, or procedure; in object-oriented programming (OOP), it may be called a method. Technically, these terms all have different definitions, and the nomenclature varies from language to language. The generic umbrella term callable unit is sometimes used.
단지 실행 가능한 단위일 뿐이다. recylce이라던지, reuse라던지 우리가 아는 단어가 없다.
자 그러면 잠깐 아래의 코드를 잠깐만 보도록 하자.
async function updateEmail(userId, email) {
const res = await apiCall({
method: 'get',
url: `/user/${userId}/email`,
param: { userId }
})
if (res.payload.email) {
apiCall({
method: 'put',
url: `/user/${userId}/email`,
param: { userId, email }
})
} else {
apiCall({
method: 'post',
url: `/user/${userId}/email`,
param: { userId, email }
})
}
}
위의 코드는 user정보에 email이 있으면, update를 진행하며, 없으면, insert를 진행하는 코드이다. 하지만, 생각해보자. 꽤나 불편하지 않은가?
1. user email을 가져오는지 확인 하기 위해, method: 'get'을 봐야 한다.
2. user email을 update를 하는지 확인 하기 위해, method: 'put'을 봐야 한다.
3. user email을 insert를 하는지 확인 하기 위해, method: 'post'를 봐야 한다.
function getUserEmail(userId) {
return apiCall({
method: 'get',
url: `/user/${userId}/email`,
param: { userId }
})
}
function updateEmail(userId, email) {
return apiCall({
method: 'put',
url: `/user/${userId}/email`,
param: { userId, email }
})
}
function insertEmail(userId, email) {
return apiCall({
method: 'post',
url: `/user/${userId}/email`,
param: { userId, email }
})
}
자 위와 같은 함수를 정의 해보도록 하자.
그러면 아래와 같은 함수를 작성 할 수 있다.
async function onUpdateEmail(userId, email) {
const userEmail = await getUserEmail(userId).payload.email
if (userEmail) {
return updateEmail(userId, email)
}
return insertEmail(userId, email)
}
1. 유저 이메일을 가져오고.
2. 유저 이메일이 있으면, 이메일을 업데이트
3. 없으면 이메일을 추가.
위의 코드는 개발자가 아니라고 해도, 영어만 안다면 함수가 뭘 하는지 알 수 있을 것이다.
댓글
댓글 쓰기