자 우리는 왜 유지보수를 어렵게 만들어야 하는가? 우리는 우리의 코드의 보안을 유지 할 필요가 있다. 그 중에서 가장 큰 이유로는 동료 및 고용주에게 인정을 받기 위함이 클 것이다. 내가 짠 코드를 나만 수정을 할 수 있게 되면 고용주는 나를 해고 하기 어려워지며, 동료들에게는 실력의 격차를 겸허하게 받아들이게 할 수 있을 것이다. 또한 소스가 유출이 된다고 하더라도, 꽤나 시간이 걸려서 해석을 할 수 밖에 없을 것이다.
이 포스팅을 따르게 된다면 단점으로는 동료들에게 수많은 수정 요청을 받아서 회사에서 나만 일하게 되는 상황이 벌어질 테니 주의 바란다.
변수명으로 장난치기
변수명으로 장난치는 것은 꽤나 전통적인 놀이이다. 실제로 당했던 변수명으로는 그 당시에 유행 하였던 아이돌 이름일 것이다.
아이돌 이름
function GirlsGeneration() {
let taeyeon
let sunny
...
}
자 위와 같은 함수를 받아들였다고 치자. 과연 이것을 유지보수 하는 사람은 어떤 정보를 알 수 있을까? 당연하게도 함수 작성자의 취향이다. 하하하하 아주 좋은 변수명이다. 변수명에 그렇게 많은 정보를 넣을 수 있다니 대단 하다.
한 글자 변수
let g = this
이것 또한 참 재미있는 변수명 짓기 이다. 자 여기서 g는 뭐의 약자 일까? 가장 자주 쓸만한 단어는 global일 것이다. 만약에 저 코드에서 this가 window를 가리키고 있다면 global이라는 단어는 꽤 그럴싸 할 수 있다. 한 글자로 변수를 짓는 것은 소스를 컴파일없이 불러와야 하는 브라우저 입장에서는 조금이라도 빠르게 페이지를 로드 할 수 있게 해준다.
뭐 물론 아이돌 이름을 쓰지 말라고 한 동료 개발자에 억압에 못이겨서 girlsGeneration의 약자로 g를 쓴 것일 수 있다.
동의어의 반복
동료 개발자들은 우리의 코드를 보며 한숨을 쉬고 있고, 변수명을 줄이지 말라고 요청을 하였다. 그렇다면 우리는 유지보수를 더욱 어렵게 만들어줘야 한다. 그런 방법으로는 뭐가 있을까?
/**
* 다른 개발자에게 보이지 않는 주석
* arguments로 들어온 문자열을 DOM으로 만들어주는 함수
* */
function render() {
const div = document.createElement('span')
div.innerHTML = arguments[0]
return div.childNodes
}
/**
* 다른 개발자에게 보이지 않는 주석
* arguments로 0번째에 DOM에 1번째에 들어온 DOM을 append하는 함수
* */
function display() {
arguments[0].appendChild(arguments[1])
}
/**
* 다른 개발자에게 보이지 않는 주석
* arguments로 0번째에 DOM을 1번째에 들어온 인자값이 1인 경우 display: none, 0인 경우 display: block
* */
function show() {
arguments[0].style.display = arguments[1] === 1 ? 'none' : 'block'
}
자 우리는 변수명을 생략을 하지 않음으로써 더운 유지보수를 어렵게도 만들 수 있다. 각각의 함수들은 다른 기능을 작동을 하며, 파라미터명을 작성하지 않음으로써 코드를 다 읽어보지 않는이상 이 함수들이 무엇을 하는지 조차도 추측을 못하게 하였다.
이름의 재사용
동료 개발자들은 우리의 코드를 보며 한숨을 쉬고 있고, 변수명을 줄이지 말라고 요청을 하였다. 그렇다면 우리는 유지보수를 더욱 어렵게 만들어줘야 한다. 그런 방법으로는 뭐가 있을까?
let date = new Date()
function doSomething() {
// many code ...
date = date.getDate()
// many code ...
}
console.log(date)
// many code ...
doSomething()
// many code ...
console.log(date)
위와 같이 date가 어떤 함수를 기점으로 변형되는 코드는 적극 추천 할만 하다. 새로운 변수를 만들어서 메모리 낭비도 할 필요 없으며, 다른 동료 개발자에게도 질타 받지 않아도 된다. Date클래스의 인스턴스도 date로 명명해도 되며 일(날짜)에 해당하는 변수명도 date라고 명명해도 되기 때문이다. ㅎㅎㅎ
게다가 외부변수를 바꾼다니 너무너무 설레는 일이다. 과연 누가 이 트랩에 걸릴지 흥미진진 하기까지 하다.
편견 깨부수기
개발자들은 관례라는 이름의 편견을 갖고 있다. _로 시작하는 변수는 private 변수라서 사용하지 말라는 편견을 갖고 있다.
let _GET_LOCAL_VALUE = 0
function doSomeThing() {
_GET_LOCAL_VALUE++
}
export { _GET_LOCAL_VALUE, doSomeThing }
자 나는 위의 코드로 세 가지의 편견을 깨트렸다.
첫째 _는 private변수지만 외부로 노출 함으로써 다른 개발자들이 볼 수 있게 하였고.
두번째 스네이크 케이스이며 전부 대문자인 것은 상수로써 변경되지 않는 플래그와 같이 사용하는 변수명임에도 불구하고 doSomeThinng 함수로 변경 할 수 있게 하였으다.
세번째 get, do와 같은 동사로 시작하는 변수명은 함수에 붙이는 접두사 처럼 편견이 있지만, _GET_LOCAL_VALUE 라는 이름을 사용 함 으로써 편견을 깨보았다.
함수로 장난치기
변수명으로 장난치는 거의다 보았다. 이제는 함수로 장난을 쳐보도록 하자. 가장 간단 한 것은 외부변수 건들이기이다. 이건 위에서 사용례가 있으니 생략하도록 하자.
안전한 함수명 짓기
function checkVacation(vacationSchedule) {
fetch('/api/vacation', {
method: 'POST',
body: JSON.stringify(vacationSchedule)
}).then(() => {
console.log('휴가 요청 성공')
})
}
자 위와 같이 휴가 결재를 올리는 함수를 checkVacation으로 짓자. 나는 해당 함수를 작성하면서 결국 휴가 확인은 결재자들이 하는 것이니, 그냥 checkVacation으로 지었을 뿐이다.
여러 기능 넣기
function checkVacationDate(vacationSchedule) {
if (vacationSchedule.endDate < new Date()) {
vacationSchedule.endDate = new Date()
}
return true
}
과거에 휴가가 들어가는 것을 방지 하기 위하여 휴가종룍 일정이 오늘보다 전이며 그냥 변경 해주기로 하였다. ㅎㅎㅎ 나 착한가봄?
마이너한 특성 사용하기
function uniqSort(list) {
const obj = {}
for (const i of list) {
obj[i] = true
}
return Object.keys(obj)
}
uniqSort([1, 5, 6, 3, 2, 1, 123, 1, 3, 5, 7])
// ['1', '2', '3', '5', '6', '7', '123']
위의 uniqSort는 엄청난 함수이다.
1. 중복을 제거해준다.
2. 숫자에대해서만 정렬을 해준다 ㅎㅎ
3. 리턴값이 문자열 배열이다.
끝내주는 함수아닌가? 게다가 함수명에다가 장난맞 쳐주면? 끝내주는 함수를 만들 수 있다. 코드를 보고 뭐하는 함수인지 확인 하려면 뭐하는 짓이지? 이 생각 들것이다.
마무리
우리 동료 개발자들이 위와 같은 코드를 쓰지 않는 것에 대해서 감사하고 또 감사하자. 만약에 누군가가 사용 하고 있다면, 같은 방법으로 복수해줄 필요는 없고, 옆에 앉혀서 학창시절에 배웠던 페어프로그래밍을 해보자. 뭐 본인이 저혈압이라면, 저혈압 치료제로 사용 해도 될것이다.
댓글
댓글 쓰기