기본 콘텐츠로 건너뛰기

유지보수 어렵게 프로그래밍 하기

  자 우리는 왜 유지보수를 어렵게 만들어야 하는가? 우리는 우리의 코드의 보안을 유지 할 필요가 있다. 그 중에서 가장 큰 이유로는 동료 및 고용주에게 인정을 받기 위함이 클 것이다. 내가 짠 코드를 나만 수정을 할 수 있게 되면 고용주는 나를 해고 하기 어려워지며, 동료들에게는 실력의 격차를 겸허하게 받아들이게 할 수 있을 것이다. 또한 소스가 유출이 된다고 하더라도, 꽤나 시간이 걸려서 해석을 할 수 밖에 없을 것이다.

 이 포스팅을 따르게 된다면 단점으로는 동료들에게 수많은 수정 요청을 받아서 회사에서 나만 일하게 되는 상황이 벌어질 테니 주의 바란다.

 변수명으로 장난치기

 변수명으로 장난치는 것은 꽤나 전통적인 놀이이다. 실제로 당했던 변수명으로는 그 당시에 유행 하였던 아이돌 이름일 것이다.

 아이돌 이름


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. 리턴값이 문자열 배열이다.

끝내주는 함수아닌가? 게다가 함수명에다가 장난맞 쳐주면? 끝내주는 함수를 만들 수 있다. 코드를 보고 뭐하는 함수인지 확인 하려면 뭐하는 짓이지? 이 생각 들것이다.

 마무리

 우리 동료 개발자들이 위와 같은 코드를 쓰지 않는 것에 대해서 감사하고 또 감사하자. 만약에 누군가가 사용 하고 있다면, 같은 방법으로 복수해줄 필요는 없고, 옆에 앉혀서 학창시절에 배웠던 페어프로그래밍을 해보자. 뭐 본인이 저혈압이라면, 저혈압 치료제로 사용 해도 될것이다.


댓글

이 블로그의 인기 게시물

아이콘 폰트 (icomoon 사용법)

 장난감 프로젝트를 만들다 보면, 아이콘이 필요한 경우가 있다. 간단하게 아이콘을 인터넷에서 검색하여, 이미지로 넣어두고 이미지 태그를 이용하여, 사용하는 경우가 일반적이였지만...  요즘에는 대부분 폰트를 이용하여 아이콘을 노출 한다. 나 같은 경우에도 기본적으로  https://material.io/resources/icons 를 참고하여 아이콘 폰트를 이용할 수 있도록 처리하고, 추가적으로 필요한 아이콘이고, 일상적으로 사용 되지 않는 아이콘의 경우에는  https://icomoon.io 에서 제작하여, 아이콘 폰트로 이용 하곤 한다.  그래서 이번에는 아이콘  https://icomoon.io 의 사용법을 간단히 공유하고자 한다.   들어가자 마자 위의 icoMoonApp버튼을 누르면 아래와 같은 화면이 나타난다.  icomoon에서 무료로 제공하는 아이콘들이 보이면 위에 파란색으로 표시 되어있는 집 모양 세가지를 선택한 후, 아래의 빨간색으로 표시되어있는 Generate Font를 눌러보자.  그리고 나서 바로 다운로드를 요청해보자. icomoon.zip이 다운로드가 될텐데, 압축을 해제해 보면, 아래의 폴더 및 파일들이 있다. 아래에서 중요한 것은 font 폴더와 style.css이다. demo-files fonts demo.html Read Me.txt selection.json style.css <!doctype html > <html> <head> <link rel ="stylesheet" href ="style.css" ></head> </head> <body> <span class ="icon-home" ></span> <span class ="icon-home2" ></span> <span class ="icon-home3"

javascript 압축 파일 다운로드

이번에는 전 게시글의 응용판? 이라고 해야하나....? 어쨋든! 우리는 각각의 파일들을 다운로드 해보았다. 그런데 생각보다 귀찮음?을 느꼇을 것이다. 파일을 각각 다운 받아야 한다는 현실때문에! 그래 파일 두개야 뭐 그렇다 치지... 하지만, 개발자도 사용자도 게으름뱅이이다. 자 결국, 우리가 해야 하는 것은 파일을 한 번에 둘다! 다운 받는 것이다. 물론, 클릭 한번에 여러개의 함수를 엮어서 다운받게 하면 되지만! 크롬에서 자주 봤듯이, 여러개의 파일을 다운로드를 시도하면 <- 여러개의 파일을 다운로드 합니다. 허용 합니까? 하고 물어보는 것을 볼 수 있다. 게다가 다운로드 한 파일들을 찾기도 귀찮다는 것. 자 해결책을 제시해보자면, https://github.com/Stuk/jszip 클라이언트 단에서 파일을 zip파일로 압축을 할 수가 있다! 필요한 작업은 아래와 같다. 0. 데이터 준비 1. BLOB(binary large object)를 만든다. 2. Blob을 URL.createObjectURL을 사용하여, 해당 binary의 주소를 생성. 3. 다운로드가 필요한 파일들을 Zip 객체에 셋팅! 4. a태그를 이용하여, 해당 url 셋팅 하고, 다운로드. 전 게시물과 별로 달라진게 없네... 자 그럼 샘플! 샘플을 보자! http://embed.plnkr.co/NMprnRxqYG0fkHa2J55D/ var util = {} function fixBinary(bin) { //binary to arrayBuffer var length = bin.length var buf = new ArrayBuffer(length) var arr = new Uint8Array(buf) for (var i = 0; i < length; i++) { arr[i] = bin.charCodeAt(i) } return buf } window.onload = function() {

Chart js와 amchart 비교

Chart js 특징은 위의 그림으로 대체 할 수 있을 듯 하다. 오픈 소스이고, 기본으로 제공하는 차트 종류가 8가지 Canv a s를 이용해서 차트를 그리고, 반응형을 지원한다. amchart amchart는 기본적으로 유료이며, 기본으로 제공하는 차트 종류가 기본적인 차트 + 주식 처럼 보이는 차트 + 지도에 관련된 차트(?) 까지 하면, 기본 제공 하는 종류가 20개 내외 이려나, 일일이 세기에는 양이 좀 많아 보인다. 렌더링은 svg를 통하여 그려지고, 당연 반응형도 지원이 된다. 그러면, 이 둘중에 어떤것이 내 프로젝트에 적합 하냐는 것이 문제이다. 일단, 주식 처럼 보이는 차트나 지도에 관련된 차트(?)가 필요하면, amchart를 선택해야 되는 것은 맞다. 그건 당연한 것이니 빼고 얘기 해보자! 여러 종류의 차트가 필요하다면, 일단은 amchart를 염두해 두는 것이 좋다. 돈 낸 만큼은 하는 듯 하다. 하지만, 기본적인 막대 그래프, 도넛 차트 등, 아주 기본적인 차트들인데, Chart js도 amchart도 그러한 차트가 없을 때가 문제가 된다. 그렇다면, 조금이라도 커스텀이 용이한 것을 찾는 것이 좋을 것이다.  일단 amchart에서 custom이라고 검색 하였을 때, 검색 결과가 61가지가 나온다. 차트의 종류도 많고, 각 차트마다 들어가는 속성이 매우 많기 때문에, 웬만한 내용들은 속성 값을 어떻게 주느냐에 따라서 변경이 가능 하게 된다. 커스텀의 예를 들면, 기본적으로 도넛 파이의 형태를 띄면서, 화살표로 목표를 표시해주는 차트가 필요하다고 생각 해보자. 이것은 amchart로 만든 그래프이고 이것은 chart js로 만든 그래프이다. 모양이 살짝 다르긴 하지만, 완벽하게 똑같이 구현 할 수도 있다. amchart로 만든 그래프의 경우, 저것은 도넛그래프가 아닌 guage 그래프이다. 원래 게이지 그래프는 이와 같은 모약