SlideShare a Scribd company logo
1 of 16
네이밍 관련 이것저것
150816 에그
하드코딩
• 데미지 계산의 예
• 데미지 = 공격력 – 방어력 * 0.5
• 위 0.5는 기획자가 임의로 정한 방어력 보정치
• 이상적인 경우
• 게임 설정 데이터에서 값을 읽어오게 하여 기획자가 바꿔가며 테스트
할 수 있도록 함
하드코딩
• 0.5의 성질을 다시 생각해보자.
• 기획자가 자주 바꿀 값인가?
• 자주 사용되는 값인가?
• 데이터 관리자로부터 값을 가져오게 될텐데, 부하 문제는 없는가?
• 저 숫자 하나를 가져오기 위해 전용 데이터 관리자를 만들어야 하나?
하드코딩
• 함수에 0.5를 박아넣자!
• 대대적인 개편이 아니면 데미지 공식은 자주 안바뀜
• 자주 사용되는 기능임
• 당장 빨리 개발해야함 <- 제일 중요!!
func CaluclateDamage(attack, defense)
{
return attack – defense * 0.5;
}
하드코딩을 하는 건 좋은데…
• 한달 후 다른 개발자가 데미지 계산 함수를 보았을 때
• 0.5의 의미가 뭘까? 절반으로 만들기 위한 건가?
• 그래서 기획자에게 물어보고 아래와 같이 주석을 추가했다.
• 데미지 공식이 개편되면 저 주석도 바꿔줘야 함
func CaluclateDamage(attack, defense)
{
// 0.5는 방어력 보정치
return attack – defense * 0.5;
}
하드코딩을 하는 건 좋은데…
• 하드코딩하려 했던 대상을 다시 생각해보자.
• 데미지 = 공격력 – 방어력 * 0.5
• 데미지 = 공격력 – 방어력 * 방어력 보정치
• 0.5를 하드코딩하는게 아니라 “방어력 보정치” 를 하드코딩 해
야 한다.
• 매우 중요!!
상수
• 프로그램 자체에 박힌 값으로 실행 중에 바뀌지 않는다.
func CaluclateDamage(attack, defense)
{
// 0.5는 방어력 보정치
return attack – defense * 0.5;
}
const var defenseAdjust = 0.5;
func CaluclateDamage(attack, defense)
{
return attack – defense * defenseAdjust;
}
네이밍
• 코드에서 표현하고자 하는 대상에 이름을 붙여주는 것
• 앞의 예에서 적절한 네이밍을 통해 얻을 수 있는 장점은 어떤
것이 있었을까?
네이밍
• 주석 없이 코드 자체만으로 내용을 이해할 수 있다.
• “공격력 – 방어력 * 방어력 보정치” 라는 자연어에 가까운 코드가 됨
• 다른 코드에서도 같은 값을 사용하고 있을 때 한꺼번에 수정하
기 쉬움
• 이건 위 장점을 달성하면서 부차적으로 얻을 수 있는 효과라고 생각함
func CaluclateDamage(attack, defense)
{
// 0.5는 방어력 보정치
return attack – defense * 0.5;
}
const var defenseAdjust = 0.5;
func CaluclateDamage(attack, defense)
{
return attack – defense * defenseAdjust;
}
잘못된 네이밍의 예
• 1001 버프가 걸리면 1002, 1003 버
프가 함께 걸리는 하드코딩
• 코드만 봐서는 어떤 동작이 일어나
는지는 알 수 있지만 왜 이런 코드
가 들어갔는지는 알 수 없다.
var sniperBuff1ID = 1001;
var sniperBuff2ID = 1002;
var sniperBuff3ID = 1003;
func OnBuffApplied(buff)
{
if (buff.ID == sniperBuff1ID)
{
ApplyBuff(sniperBuff2ID);
ApplyBuff(sniperBuff3ID);
}
}
잘못된 네이밍의 예
• 스나이퍼 모드가 되면 공격
력은 높아지지만 속도는 느
려지는 기획이었음
• 네이밍 수정만으로 주석이
필요없는 코드가 됨
• 거듭 강조!
• 하드코딩하려 했던 것은 1001
이라는 숫자가 아니라 “스나이
핑 모드 버프”
var sniperModeBuffID = 1001;
var sniperAttackBuffID = 1002;
var sniperSlowBuffID = 1003;
func OnBuffApplied(buff)
{
if (buff.ID == sniperModeBuffID)
{
ApplyBuff(sniperAttackBuffID);
ApplyBuff(sniperSlowBuffID);
}
}
매우 긴 함수
• 플레이어가 맵에 입장했을 때
현재 맵 상태를 인코딩하는
함수
• 맵의 구성요소가 많을수록 함
수가 길어진다.
func EncodeMap()
{
// 맵 기본정보 인코딩
기상정보 인코딩
재생중인 배경음악 인코딩
// 모든 플레이어 인코딩
for (i = 0; i <= players.count; ++i)
{
i번째 플레이어 인코딩
}
// 드랍되어있는 아이템 인코딩
…
}
매우 긴 함수 – 코드 블록에 네이밍
• 주석을 기준으로 코드
블록을 함수로 묶어냄
• 함수의 전체 흐름을 알
아보기 쉬워짐
• 자연어 문단 읽듯이 읽
을 수 있음
func EncodeMap()
{
EncodeMapInfo();
EncodePlayers();
EncodeDroppedItems();
} func EncodePlayers()
{
for (i = 0; i <= players.count; ++i)
{
i번째 플레이어 인코딩
}
}
func EncodeMapInfo()
{
기상정보 인코딩
재생중인 배경음악 인코딩
}
func EncodeDroppedItems()
{
…
}
매우 긴 라인
func UpdateChargeStack()
{
if ((현재카운트 < 최대카운트) and (현재 시간 >= 마지막 충전 시간 + 충전 주기))
{
카운트++;
마지막 충전 시간 = 현재 시간;
}
}
매우 긴 라인 – 논리 단위에 네이밍
• 거듭 강조하듯, 자연어 읽듯이 코드를 읽을 수 있음
• 논리 단위로 테스트하기 용이함
func UpdateChargeStack()
{
if ((not IsMaxStacked()) and IsChargeInvervalOvered())
{
카운트++;
마지막 충전 시간 = 현재 시간;
}
}
요약
• 대상을 정확히 표현할 수 있는 네이밍 사용
• 주석은 네이밍의 기준이 될 수 있다.
• 주석을 줄이려고 노력하면 명확한 코드 짜기에 도움이 된다.
• 주석에 너무 의존하면 함정 주석에 발목 잡힐 수 있음
• 논리 단위로 뽑아낼 수 있는 코드는 네이밍을 붙여 분리

More Related Content

What's hot

병렬 프로그래밍 패러다임
병렬 프로그래밍 패러다임병렬 프로그래밍 패러다임
병렬 프로그래밍 패러다임
codenavy
 
어플리케이션 성능 최적화 기법
어플리케이션 성능 최적화 기법어플리케이션 성능 최적화 기법
어플리케이션 성능 최적화 기법
Daniel Kim
 
[Gpg2권]1.1 c++ 게임의 최적화
[Gpg2권]1.1 c++ 게임의 최적화[Gpg2권]1.1 c++ 게임의 최적화
[Gpg2권]1.1 c++ 게임의 최적화
KyeongWon Koo
 
사례를 통해 살펴보는 프로파일링과 최적화 NDC2013
사례를 통해 살펴보는 프로파일링과 최적화 NDC2013사례를 통해 살펴보는 프로파일링과 최적화 NDC2013
사례를 통해 살펴보는 프로파일링과 최적화 NDC2013
Esun Kim
 
덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012
덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012
덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012
Esun Kim
 

What's hot (20)

Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이 왜 이리 힘드나요? (Lock-free에서 Transactional Memory까지)
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이  왜 이리 힘드나요?  (Lock-free에서 Transactional Memory까지)Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이  왜 이리 힘드나요?  (Lock-free에서 Transactional Memory까지)
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이 왜 이리 힘드나요? (Lock-free에서 Transactional Memory까지)
 
Linux reversing study_basic_4
Linux reversing study_basic_4Linux reversing study_basic_4
Linux reversing study_basic_4
 
병렬 프로그래밍 패러다임
병렬 프로그래밍 패러다임병렬 프로그래밍 패러다임
병렬 프로그래밍 패러다임
 
Pwnable study basic_1
Pwnable study basic_1Pwnable study basic_1
Pwnable study basic_1
 
어플리케이션 성능 최적화 기법
어플리케이션 성능 최적화 기법어플리케이션 성능 최적화 기법
어플리케이션 성능 최적화 기법
 
병렬 프로그래밍2
병렬 프로그래밍2병렬 프로그래밍2
병렬 프로그래밍2
 
Introduction to Parallel Programming
Introduction to Parallel ProgrammingIntroduction to Parallel Programming
Introduction to Parallel Programming
 
Java 제어
Java 제어Java 제어
Java 제어
 
[NDC2016] TERA 서버의 Modern C++ 활용기
[NDC2016] TERA 서버의 Modern C++ 활용기[NDC2016] TERA 서버의 Modern C++ 활용기
[NDC2016] TERA 서버의 Modern C++ 활용기
 
Assembly 스터디 1
Assembly 스터디 1Assembly 스터디 1
Assembly 스터디 1
 
[Gpg2권]1.1 c++ 게임의 최적화
[Gpg2권]1.1 c++ 게임의 최적화[Gpg2권]1.1 c++ 게임의 최적화
[Gpg2권]1.1 c++ 게임의 최적화
 
Web hacking introduction
Web hacking introductionWeb hacking introduction
Web hacking introduction
 
Pwnable study basic_3
Pwnable study basic_3Pwnable study basic_3
Pwnable study basic_3
 
사례를 통해 살펴보는 프로파일링과 최적화 NDC2013
사례를 통해 살펴보는 프로파일링과 최적화 NDC2013사례를 통해 살펴보는 프로파일링과 최적화 NDC2013
사례를 통해 살펴보는 프로파일링과 최적화 NDC2013
 
Windows reversing study_basic_8
Windows reversing study_basic_8Windows reversing study_basic_8
Windows reversing study_basic_8
 
System+os study 7
System+os study 7System+os study 7
System+os study 7
 
잘 알려지지 않은 숨은 진주, Winsock API - WSAPoll, Fast Loopback
잘 알려지지 않은 숨은 진주, Winsock API - WSAPoll, Fast Loopback잘 알려지지 않은 숨은 진주, Winsock API - WSAPoll, Fast Loopback
잘 알려지지 않은 숨은 진주, Winsock API - WSAPoll, Fast Loopback
 
덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012
덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012
덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012
 
시즌 2: 멀티쓰레드 프로그래밍이 왜이리 힘드나요?
시즌 2: 멀티쓰레드 프로그래밍이 왜이리 힘드나요?시즌 2: 멀티쓰레드 프로그래밍이 왜이리 힘드나요?
시즌 2: 멀티쓰레드 프로그래밍이 왜이리 힘드나요?
 
GopherCon Korea 2015 - Python 개발자를 위한 Go (이경찬)
GopherCon Korea 2015 - Python 개발자를 위한 Go (이경찬)GopherCon Korea 2015 - Python 개발자를 위한 Go (이경찬)
GopherCon Korea 2015 - Python 개발자를 위한 Go (이경찬)
 

Viewers also liked

Clean code: meaningful Name
Clean code: meaningful NameClean code: meaningful Name
Clean code: meaningful Name
nahid035
 
Kbs 2010 _kw_비전_및_채널전략4
Kbs 2010 _kw_비전_및_채널전략4Kbs 2010 _kw_비전_및_채널전략4
Kbs 2010 _kw_비전_및_채널전략4
loveturkey
 
Project black witch 컨셉기획 초안
Project black witch 컨셉기획 초안Project black witch 컨셉기획 초안
Project black witch 컨셉기획 초안
재민 엄
 
졸전주제 3_01
졸전주제 3_01졸전주제 3_01
졸전주제 3_01
rururuadf
 
2012 디자인전략2020 디자인기술로드맵 보고서
2012 디자인전략2020 디자인기술로드맵 보고서2012 디자인전략2020 디자인기술로드맵 보고서
2012 디자인전략2020 디자인기술로드맵 보고서
USABLE 윤
 

Viewers also liked (20)

브랜드네이밍진단 및 컨셉이미지 제안서
브랜드네이밍진단 및 컨셉이미지 제안서브랜드네이밍진단 및 컨셉이미지 제안서
브랜드네이밍진단 및 컨셉이미지 제안서
 
(싱크탱크)사업소개서(약식)
(싱크탱크)사업소개서(약식)(싱크탱크)사업소개서(약식)
(싱크탱크)사업소개서(약식)
 
브랜드와 상품기획 코칭
브랜드와 상품기획 코칭브랜드와 상품기획 코칭
브랜드와 상품기획 코칭
 
[BLT] 비즈니스모델 특허, 네이밍 전략, 정부사업 개괄 1.0
[BLT] 비즈니스모델 특허, 네이밍 전략, 정부사업 개괄 1.0[BLT] 비즈니스모델 특허, 네이밍 전략, 정부사업 개괄 1.0
[BLT] 비즈니스모델 특허, 네이밍 전략, 정부사업 개괄 1.0
 
사업계획서 빈스홀릭
사업계획서 빈스홀릭사업계획서 빈스홀릭
사업계획서 빈스홀릭
 
Clean code: meaningful Name
Clean code: meaningful NameClean code: meaningful Name
Clean code: meaningful Name
 
고창브랜드평가2차보고서 110202
고창브랜드평가2차보고서 110202고창브랜드평가2차보고서 110202
고창브랜드평가2차보고서 110202
 
브랜드 저널리즘의 한계와 가능성
브랜드 저널리즘의 한계와 가능성브랜드 저널리즘의 한계와 가능성
브랜드 저널리즘의 한계와 가능성
 
Kbs 2010 _kw_비전_및_채널전략4
Kbs 2010 _kw_비전_및_채널전략4Kbs 2010 _kw_비전_및_채널전략4
Kbs 2010 _kw_비전_및_채널전략4
 
Naming Standards, Clean Code
Naming Standards, Clean CodeNaming Standards, Clean Code
Naming Standards, Clean Code
 
Timory_BX Design
Timory_BX DesignTimory_BX Design
Timory_BX Design
 
남편에게 보내는 내 생일선물 제안서
남편에게 보내는 내 생일선물 제안서남편에게 보내는 내 생일선물 제안서
남편에게 보내는 내 생일선물 제안서
 
Project black witch 컨셉기획 초안
Project black witch 컨셉기획 초안Project black witch 컨셉기획 초안
Project black witch 컨셉기획 초안
 
01_안드로이드 플랫폼 중심의 T store 사업 전략 소개
01_안드로이드 플랫폼 중심의 T store 사업 전략 소개01_안드로이드 플랫폼 중심의 T store 사업 전략 소개
01_안드로이드 플랫폼 중심의 T store 사업 전략 소개
 
졸전주제 3_01
졸전주제 3_01졸전주제 3_01
졸전주제 3_01
 
싸이월드 Social biz_제안_0208
싸이월드 Social biz_제안_0208싸이월드 Social biz_제안_0208
싸이월드 Social biz_제안_0208
 
Eyes for Children - Final Presentation
Eyes for Children - Final PresentationEyes for Children - Final Presentation
Eyes for Children - Final Presentation
 
DaeWahng 0823
DaeWahng 0823DaeWahng 0823
DaeWahng 0823
 
2012 디자인전략2020 디자인기술로드맵 보고서
2012 디자인전략2020 디자인기술로드맵 보고서2012 디자인전략2020 디자인기술로드맵 보고서
2012 디자인전략2020 디자인기술로드맵 보고서
 
브랜드 스토리북 컨설팅
브랜드 스토리북 컨설팅브랜드 스토리북 컨설팅
브랜드 스토리북 컨설팅
 

Similar to 네이밍 관련 이것저것

카사 공개세미나1회 W.E.L.C.
카사 공개세미나1회  W.E.L.C.카사 공개세미나1회  W.E.L.C.
카사 공개세미나1회 W.E.L.C.
Ryan Park
 
[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)
[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)
[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)
Sang Don Kim
 
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
min woog kim
 
[0618구경원]초보 게임프로그래머를 위한 c++
[0618구경원]초보 게임프로그래머를 위한 c++[0618구경원]초보 게임프로그래머를 위한 c++
[0618구경원]초보 게임프로그래머를 위한 c++
KyeongWon Koo
 

Similar to 네이밍 관련 이것저것 (20)

NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
 
카사 공개세미나1회 W.E.L.C.
카사 공개세미나1회  W.E.L.C.카사 공개세미나1회  W.E.L.C.
카사 공개세미나1회 W.E.L.C.
 
Boost라이브러리의내부구조 20151111 서진택
Boost라이브러리의내부구조 20151111 서진택Boost라이브러리의내부구조 20151111 서진택
Boost라이브러리의내부구조 20151111 서진택
 
Gcd ppt
Gcd pptGcd ppt
Gcd ppt
 
[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)
[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)
[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)
 
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기
 
ES6 for Node.js Study 2주차
ES6 for Node.js Study 2주차ES6 for Node.js Study 2주차
ES6 for Node.js Study 2주차
 
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
 
NDC11_김성익_슈퍼클래스
NDC11_김성익_슈퍼클래스NDC11_김성익_슈퍼클래스
NDC11_김성익_슈퍼클래스
 
C# Game Server
C# Game ServerC# Game Server
C# Game Server
 
2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여
2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여
2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여
 
Node.js를 사용한 Big Data 사례연구
Node.js를 사용한 Big Data 사례연구Node.js를 사용한 Big Data 사례연구
Node.js를 사용한 Big Data 사례연구
 
Node.js 기본
Node.js 기본Node.js 기본
Node.js 기본
 
About Visual C++ 10
About  Visual C++ 10About  Visual C++ 10
About Visual C++ 10
 
NDC12_Lockless게임서버설계와구현
NDC12_Lockless게임서버설계와구현NDC12_Lockless게임서버설계와구현
NDC12_Lockless게임서버설계와구현
 
[0618구경원]초보 게임프로그래머를 위한 c++
[0618구경원]초보 게임프로그래머를 위한 c++[0618구경원]초보 게임프로그래머를 위한 c++
[0618구경원]초보 게임프로그래머를 위한 c++
 
6 function
6 function6 function
6 function
 
Ji 개발 리뷰 (신림프로그래머)
Ji 개발 리뷰 (신림프로그래머)Ji 개발 리뷰 (신림프로그래머)
Ji 개발 리뷰 (신림프로그래머)
 
안드로이드 빌드: 설탕없는 세계
안드로이드 빌드: 설탕없는 세계안드로이드 빌드: 설탕없는 세계
안드로이드 빌드: 설탕없는 세계
 
7가지 동시성 모델 - 3장. 함수형 프로그래밍
7가지 동시성 모델 - 3장. 함수형 프로그래밍7가지 동시성 모델 - 3장. 함수형 프로그래밍
7가지 동시성 모델 - 3장. 함수형 프로그래밍
 

More from EG Lim

More from EG Lim (10)

칼리굴라 오버도즈의 UE4 데이터 이식 안내서
칼리굴라 오버도즈의 UE4 데이터 이식 안내서칼리굴라 오버도즈의 UE4 데이터 이식 안내서
칼리굴라 오버도즈의 UE4 데이터 이식 안내서
 
메카 액션 게임 『DAEMON X MACHINA』 신념과 피와 강철의 개발사례
메카 액션 게임 『DAEMON X MACHINA』 신념과 피와 강철의 개발사례메카 액션 게임 『DAEMON X MACHINA』 신념과 피와 강철의 개발사례
메카 액션 게임 『DAEMON X MACHINA』 신념과 피와 강철의 개발사례
 
빌드 좀 깨먹지 마라!
빌드 좀 깨먹지 마라!빌드 좀 깨먹지 마라!
빌드 좀 깨먹지 마라!
 
코드네임 이것저것
코드네임 이것저것코드네임 이것저것
코드네임 이것저것
 
MD5 이것저것
MD5 이것저것MD5 이것저것
MD5 이것저것
 
FlatBuffers 를 이용한 안드로이드에서의 페이스북 성능 향상
FlatBuffers 를 이용한 안드로이드에서의 페이스북 성능 향상FlatBuffers 를 이용한 안드로이드에서의 페이스북 성능 향상
FlatBuffers 를 이용한 안드로이드에서의 페이스북 성능 향상
 
Elo 평점 시스템
Elo 평점 시스템Elo 평점 시스템
Elo 평점 시스템
 
디미터의 법칙
디미터의 법칙디미터의 법칙
디미터의 법칙
 
SonarQube 로 Unity 프로젝트 관리
SonarQube 로 Unity 프로젝트 관리SonarQube 로 Unity 프로젝트 관리
SonarQube 로 Unity 프로젝트 관리
 
상속 관련 이것저것
상속 관련 이것저것상속 관련 이것저것
상속 관련 이것저것
 

Recently uploaded

Recently uploaded (7)

JMP를 활용한 전자/반도체 산업 Yield Enhancement Methodology
JMP를 활용한 전자/반도체 산업 Yield Enhancement MethodologyJMP를 활용한 전자/반도체 산업 Yield Enhancement Methodology
JMP를 활용한 전자/반도체 산업 Yield Enhancement Methodology
 
JMP를 활용한 가속열화 분석 사례
JMP를 활용한 가속열화 분석 사례JMP를 활용한 가속열화 분석 사례
JMP를 활용한 가속열화 분석 사례
 
JMP 기능의 확장 및 내재화의 핵심 JMP-Python 소개
JMP 기능의 확장 및 내재화의 핵심 JMP-Python 소개JMP 기능의 확장 및 내재화의 핵심 JMP-Python 소개
JMP 기능의 확장 및 내재화의 핵심 JMP-Python 소개
 
JMP가 걸어온 여정, 새로운 도약 JMP 18!
JMP가 걸어온 여정, 새로운 도약 JMP 18!JMP가 걸어온 여정, 새로운 도약 JMP 18!
JMP가 걸어온 여정, 새로운 도약 JMP 18!
 
공학 관점에서 바라본 JMP 머신러닝 최적화
공학 관점에서 바라본 JMP 머신러닝 최적화공학 관점에서 바라본 JMP 머신러닝 최적화
공학 관점에서 바라본 JMP 머신러닝 최적화
 
실험 설계의 평가 방법: Custom Design을 중심으로 반응인자 최적화 및 Criteria 해석
실험 설계의 평가 방법: Custom Design을 중심으로 반응인자 최적화 및 Criteria 해석실험 설계의 평가 방법: Custom Design을 중심으로 반응인자 최적화 및 Criteria 해석
실험 설계의 평가 방법: Custom Design을 중심으로 반응인자 최적화 및 Criteria 해석
 
데이터 분석 문제 해결을 위한 나의 JMP 활용법
데이터 분석 문제 해결을 위한 나의 JMP 활용법데이터 분석 문제 해결을 위한 나의 JMP 활용법
데이터 분석 문제 해결을 위한 나의 JMP 활용법
 

네이밍 관련 이것저것

  • 2. 하드코딩 • 데미지 계산의 예 • 데미지 = 공격력 – 방어력 * 0.5 • 위 0.5는 기획자가 임의로 정한 방어력 보정치 • 이상적인 경우 • 게임 설정 데이터에서 값을 읽어오게 하여 기획자가 바꿔가며 테스트 할 수 있도록 함
  • 3. 하드코딩 • 0.5의 성질을 다시 생각해보자. • 기획자가 자주 바꿀 값인가? • 자주 사용되는 값인가? • 데이터 관리자로부터 값을 가져오게 될텐데, 부하 문제는 없는가? • 저 숫자 하나를 가져오기 위해 전용 데이터 관리자를 만들어야 하나?
  • 4. 하드코딩 • 함수에 0.5를 박아넣자! • 대대적인 개편이 아니면 데미지 공식은 자주 안바뀜 • 자주 사용되는 기능임 • 당장 빨리 개발해야함 <- 제일 중요!! func CaluclateDamage(attack, defense) { return attack – defense * 0.5; }
  • 5. 하드코딩을 하는 건 좋은데… • 한달 후 다른 개발자가 데미지 계산 함수를 보았을 때 • 0.5의 의미가 뭘까? 절반으로 만들기 위한 건가? • 그래서 기획자에게 물어보고 아래와 같이 주석을 추가했다. • 데미지 공식이 개편되면 저 주석도 바꿔줘야 함 func CaluclateDamage(attack, defense) { // 0.5는 방어력 보정치 return attack – defense * 0.5; }
  • 6. 하드코딩을 하는 건 좋은데… • 하드코딩하려 했던 대상을 다시 생각해보자. • 데미지 = 공격력 – 방어력 * 0.5 • 데미지 = 공격력 – 방어력 * 방어력 보정치 • 0.5를 하드코딩하는게 아니라 “방어력 보정치” 를 하드코딩 해 야 한다. • 매우 중요!!
  • 7. 상수 • 프로그램 자체에 박힌 값으로 실행 중에 바뀌지 않는다. func CaluclateDamage(attack, defense) { // 0.5는 방어력 보정치 return attack – defense * 0.5; } const var defenseAdjust = 0.5; func CaluclateDamage(attack, defense) { return attack – defense * defenseAdjust; }
  • 8. 네이밍 • 코드에서 표현하고자 하는 대상에 이름을 붙여주는 것 • 앞의 예에서 적절한 네이밍을 통해 얻을 수 있는 장점은 어떤 것이 있었을까?
  • 9. 네이밍 • 주석 없이 코드 자체만으로 내용을 이해할 수 있다. • “공격력 – 방어력 * 방어력 보정치” 라는 자연어에 가까운 코드가 됨 • 다른 코드에서도 같은 값을 사용하고 있을 때 한꺼번에 수정하 기 쉬움 • 이건 위 장점을 달성하면서 부차적으로 얻을 수 있는 효과라고 생각함 func CaluclateDamage(attack, defense) { // 0.5는 방어력 보정치 return attack – defense * 0.5; } const var defenseAdjust = 0.5; func CaluclateDamage(attack, defense) { return attack – defense * defenseAdjust; }
  • 10. 잘못된 네이밍의 예 • 1001 버프가 걸리면 1002, 1003 버 프가 함께 걸리는 하드코딩 • 코드만 봐서는 어떤 동작이 일어나 는지는 알 수 있지만 왜 이런 코드 가 들어갔는지는 알 수 없다. var sniperBuff1ID = 1001; var sniperBuff2ID = 1002; var sniperBuff3ID = 1003; func OnBuffApplied(buff) { if (buff.ID == sniperBuff1ID) { ApplyBuff(sniperBuff2ID); ApplyBuff(sniperBuff3ID); } }
  • 11. 잘못된 네이밍의 예 • 스나이퍼 모드가 되면 공격 력은 높아지지만 속도는 느 려지는 기획이었음 • 네이밍 수정만으로 주석이 필요없는 코드가 됨 • 거듭 강조! • 하드코딩하려 했던 것은 1001 이라는 숫자가 아니라 “스나이 핑 모드 버프” var sniperModeBuffID = 1001; var sniperAttackBuffID = 1002; var sniperSlowBuffID = 1003; func OnBuffApplied(buff) { if (buff.ID == sniperModeBuffID) { ApplyBuff(sniperAttackBuffID); ApplyBuff(sniperSlowBuffID); } }
  • 12. 매우 긴 함수 • 플레이어가 맵에 입장했을 때 현재 맵 상태를 인코딩하는 함수 • 맵의 구성요소가 많을수록 함 수가 길어진다. func EncodeMap() { // 맵 기본정보 인코딩 기상정보 인코딩 재생중인 배경음악 인코딩 // 모든 플레이어 인코딩 for (i = 0; i <= players.count; ++i) { i번째 플레이어 인코딩 } // 드랍되어있는 아이템 인코딩 … }
  • 13. 매우 긴 함수 – 코드 블록에 네이밍 • 주석을 기준으로 코드 블록을 함수로 묶어냄 • 함수의 전체 흐름을 알 아보기 쉬워짐 • 자연어 문단 읽듯이 읽 을 수 있음 func EncodeMap() { EncodeMapInfo(); EncodePlayers(); EncodeDroppedItems(); } func EncodePlayers() { for (i = 0; i <= players.count; ++i) { i번째 플레이어 인코딩 } } func EncodeMapInfo() { 기상정보 인코딩 재생중인 배경음악 인코딩 } func EncodeDroppedItems() { … }
  • 14. 매우 긴 라인 func UpdateChargeStack() { if ((현재카운트 < 최대카운트) and (현재 시간 >= 마지막 충전 시간 + 충전 주기)) { 카운트++; 마지막 충전 시간 = 현재 시간; } }
  • 15. 매우 긴 라인 – 논리 단위에 네이밍 • 거듭 강조하듯, 자연어 읽듯이 코드를 읽을 수 있음 • 논리 단위로 테스트하기 용이함 func UpdateChargeStack() { if ((not IsMaxStacked()) and IsChargeInvervalOvered()) { 카운트++; 마지막 충전 시간 = 현재 시간; } }
  • 16. 요약 • 대상을 정확히 표현할 수 있는 네이밍 사용 • 주석은 네이밍의 기준이 될 수 있다. • 주석을 줄이려고 노력하면 명확한 코드 짜기에 도움이 된다. • 주석에 너무 의존하면 함정 주석에 발목 잡힐 수 있음 • 논리 단위로 뽑아낼 수 있는 코드는 네이밍을 붙여 분리