미래의 자신을 위해 코드를 작성하다
This code I wrote is perfect! 😎
— You, 1 year ago.
WTF is this? 😡
— You, looking at your code from 1 year ago.
문제는 네가 지금 너를 위해 코드를 쓰고 있다는 것이다.반대로 미래의 자신을 위해 글을 써야 한다.본질적으로 자신에게 이 질문을 하기만 하면'미래의 나는 이 코드의 의도를 이해할 수 있을까?'
다음은 내가 여러 해 동안 읽을 수 없는 코드를 작성하는 과정에서 배운 몇 가지 기교이다.
자신에게 깊은 인상을 남기려 하지 마라
나는 똑똑한 코드를 쓰는 것을 좋아한다.이것은 나를 매우 똑똑하게 느끼게 한다.1년이 지난 후에 나는 똑똑한 코드를 돌이켜보고 그것이 무엇을 하고 있는지, 그리고 왜 내가 더 간단하고 표준적인 방식으로 하지 않았는지 알아내려고 했다.
그래서 인상적인 일을 하고 싶다면 읽을 수 있는 코드를 작성하세요.어쨌든 당신은 자신이 신처럼 느껴지는 것에서 같은 날 무엇을 하는지 모르는 것으로 바뀔 수도 있다.
의미 있는 이름 쓰기.
변수, 함수, 모듈 등의 이름을 생각해 내기가 매우 어렵다. 심지어 유행하는 말도 있다.
There are only two hard things in Computer Science: cache invalidation and naming things.
— Phil Karlton
명명은 배양해야 할 기술이지만, 대다수 사람들은 생각이 부족하거나 과도하게 생각하는 것을 발견했다.다음은 제가 따르는 유용한 조언들입니다.
container
나 data
등 통용되는 명칭.is
이나 has
과 유사한 접두사를 사용하여 입력한 언어에서도 부울 값을 나타냅니다.get
나 create
의 접두사를 사용하여 동작을 나타낸다.min
또는 total
의 접두사를 사용하여 더욱 묘사적인 숫자를 나타낸다.users
또는 e
만 사용하십시오.event
.너의 조건을 떼어놓다
많은 응용 프로그램의 핵심은 논리인데, 실제로는
error
문장으로만 바뀔 뿐이다.이런 진술의 조건은 상당히 복잡해질 수 있다.이 예에서 논리를 이해하는 데 얼마나 걸립니까?
if (users[0] && posts.find(post => post.userId === users[0].id)) {
showUserPost();
}
시간은 이곳의 중요한 부분이다.물론, 나는 최종적으로 이 코드 부분을 이해할 수 있지만, 만약 전체 코드 라이브러리가 이렇게 쓰여 있다면, 미래의 관리자들은 (너 자신을 포함) 모두 그것을 이해하기 위해 머리를 쥐어짜게 될 것이다.주석을 만드는 데 급급할 수도 있지만, 코드 자체를 개선하기 위해 조건을 의미 있는 변수로 옮깁니다.
const isUserPostCreated = users[0] && posts.find(post => post.userId === users[0].id);
if (isUserPostCreated) {
showUserPost();
}
저희가 조건을 하나 더 붙이면요?다른 변수를 생성합니다.const isUserPostCreated = users[0] && posts.find(post => post.userId === users[0].id)
const isReaderLoggedIn = getReaderFromDatabase().isLoggedIn();
if (isUserPostCreated && isReaderLoggedIn) {
showUserPost();
}
현재, 당신이 장래에 이 코드를 볼 때, 당신은 전체 문장을 크게 읽고, 현재 발생하고 있는 일을 정확하게 이해할 수 있을 것이다.단일한 직책을 가진 기능을 창설하다
나는
getTotalDaysSinceLastLogin
함수를 만드는 것에 대해 죄책감을 느꼈다. 이 함수들은 수백 줄의 코드를 포함하고 있어 여러 가지 작업을 수행할 수 있다.이것은 쉽게 할 수 있지만 불행하게도, 이후에 이동할 수 없는 코드를 만들 것이다.간단한 건의는 이른바 단일 책임 원칙을 따르는 것이다.이것은 하나의 함수가 반드시 일부분의 기능만 책임져야 한다는 것을 의미한다.
사용자 이름을 검증하는 것을 예로 들겠습니다.
function validateUsername(username) {
// Invalid if username is over 20 characters.
if (username.length > 20) {
return false;
}
// Invalid if username has non-alphanumeric characters.
if (/[^a-z0-9]/gi.test(username)) {
return false;
}
// Invalid if user already exists in database.
if (db.query('SELECT id FROM users WHERE username = ', username)) {
return false;
}
// Otherwise valid!
return true;
}
어떤 의미에서 보면, 이것은 사용자 이름만 검증하기 때문에 단일 책임 원칙을 따랐다.그러나, 우리는 여기에서 조회 데이터베이스를 포함한 여러 개의 검증을 실행한다.우리도 그것이 효과가 있는지 완전히 확정할 수 없다.우리는 이 함수를 다른 더 작은 함수로 분해할 수 있다.
function validateUsernameLength(username) {
return username.length <= 20;
}
function validateAlphanumeric(string) {
return !/[^a-z0-9]/gi.test(string);
}
function checkUsernameExists(username) {
return db.query('SELECT id FROM users WHERE username = ', username);
}
function validateUsername(username) {
const isLengthValid = validateUsernameLength(username);
const isAlphanumeric = validateAlphanumeric(username);
const isUsernameTaken = checkUsernameExists(username);
return isLengthValid && isAlphanumeric && !isUsernameTaken;
}
이제 이러한 작은 기능들은 변경, 이동, 테스트하기 쉽다.너의 미래에 감사할 거야.
당신이 쓴 코드에서 일할 수 있는 모든 사람들
이 문장은 너의 경력과 관계가 있니?읽을 수 있는 코드에 대해 다른 건의가 있습니까?나는 줄곧 자신을 향상시키려고 노력하고 있으니 언제든지 아래에서 평론을 발표해 주십시오.
Note: This article was originally written for my personal blog. I am republishing it here for the amazing DEV community.
Reference
이 문제에 관하여(미래의 자신을 위해 코드를 작성하다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/sunnysingh/writing-code-for-your-future-self-3da2텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)