SlideShare una empresa de Scribd logo
1 de 21
Descargar para leer sin conexión
Clean Code
     Ch.2 의미 있는 이름

     chois79




12년 7월 22일 일요일
이장에서 다룰 내용

     • 소프트웨어에서 이름은 어디나 쓰인다


         • 변수, 함수, 인수, 클래스, 파일, package, jar, war 등...


     • 이러한 이름을 잘 짓는 것이 중요하다


         • 이해도를 높인다.


     • 이름을 잘 짓는 방법은 무엇인가?




12년 7월 22일 일요일
의도를 분명히 밝혀라

     • 의도가 분명한 이름을 사용하는 것이 중요하다


         • 좋은 이름을 짓는데 걸리는 시간 < 좋은 이름으로 인해 절약하는 시간


         • Why? 코드의 이해와 변경이 쉬워짐


     • 변수, 함수, 클래스의 이름을 짓는 가이드


         • 다음의 질문에 답할 수 있는 이름을 사용


             • 존재 이유는?


             • 수행 기능은?


             • 사용 방법은?


         • 만약 주석이 필요하다면, 의도를 제대로 표현하지 못한 것



12년 7월 22일 일요일
의도를 분명히 밝혀라 - 예제

                       의도가 모호한 코드                                                  의도가 분명한 코드

                                                             	   int elapsedTimeInDays;
                                                             	   int daysSinceCreation;
     
    int d; // 경과 시간 (단위: 날짜 수)
                                                             	   int daysSinceModification;
                                                             	   int fileAgeInDays;

     
    // 각 이름이 충분한 정보 제공을 하지 않음                          
   // 이름을 명확히 변경
     	    public List<int[]> getThem() {                     	   public List<int[]> getFlaggedCells() {
     	       List<int []> list1 = new ArrayList<int []>();   	      List<int []> flaggedCells = new ArrayList<int []>();
     	       for(int [] x: theList) {                        	      for(int [] cell: gameBoard) {
     	          if(x[0] == 4)                                	         if(cell[STATUS_VALUE] == FLAGGED)
     	              list1.add(x);                            	             flaggedCells.add(cell);
     	       }                                               	      }
     	       return list1;                                   	      return flaggedCells;
     	    }                                                  	   }

                                                             
   // int []을 Cell Class로 변환
                                                             	   public List<Cell> getFlaggedCells() {
                                                             	       List<Cell> flaggedCells = new ArrayList<Cell>();
                                                             	       for(Cell cell: gameBoard) {
                                                             	          if(cell.isFlagged())
                                                             	              flaggedCells.add(cell);
                                                             	       }
                                                             	       return flaggedCells;
                                                             	   }



12년 7월 22일 일요일
그릇된 정보를 피하라

     • 프로그래머는 코드에 그릇된 단서를 남겨서는 안된다


         • 일반적으로 사용되는 의미와 다르게 사용하면 안됨


             • ex) 여러 계정을 그룹으로 묶을때 실제로 List 컨테이너가 아닌데 accountList 로 칭할 경우


                 • accountGroup, bunchOfAccounts 혹은 Accounts로 명명


         • 서로 흡사한 이름을 사용하지 않도록 주의


             • XYZControllerForEfficientHandlingOfStrings, XYZControllerForEfficientStorageOfString


         • 유사한 개념은 유사한 표기법 사용


         • 알파벳에 의한 모호성 주의


             • 소문자 L과 숫자 1: l, 1


             • 대문자 O와 숫자 0: O, 0




12년 7월 22일 일요일
의미 있게 구분하라

     • 읽는 사람이 차이를 알도록 이름을 지어라


         • 연속된 숫자를 사용하여 이름을 짓지마라
            
     // a1, a2보다 source, destination 을 사용하여 가독성을 높일수 있음
            	     public static void copyChars(char a1[], char a2[]) {
            	     	    for(int i = 0; i < a1.length; i++) {
            	     	    	     a2[i] = a1[i];
            	     	    }
            	     }


         • 불용어를 사용하여 구분하지마라


                • ex1) Info나 Data는 a, an, the와 마찬가지로 의미가 불분명


                   • ProductInfo, ProductData (차이점이 모호함)


                • ex2) NameString과 Name, moneyAmount와 money, customerInfo와 customer



12년 7월 22일 일요일
발음하기 쉬운 이름을 사용하라

     • 발음하기 어려운 이름은 의사 소통을 힘들게 한다


         • ex) genymdhms (generate date, year, month, day, hour, minute, second)


             • 이 이름에 대해 어떻게 의사 소통 해야 하는가?


                     • “젠 와이 엠 디 에이취 엠 에스”, “젠 야 무다 힘즈”
                                 발음하기 어려운 이름                                      발음하기 쉬운 이름

                                                                 
   /* 코드를 통한 지적인 대화가 가능 */
                 	   class DtaRcrd102{		
                                                                 	   class Customer {
                 	   	    private Date genymdhms;
                                                                 	   	    private Date generationTimestamp;
                 	   	    private Date modymdhms;
                                                                 	   	    private Date modificationTimestamp;
                 	   	    private final String pszqint = "102";
                                                                 	   	    private final String recordId = "102";
                 	   	    /* ... */
                                                                 	   	    /* ... */
                 	   }
                                                                 	   }




12년 7월 22일 일요일
검색하기 쉬운 이름을 사용하라

     • 변수나 상수를 코드 여러 곳에서 사용한다면 검색하기 쉬운 이름이 바람직


         • 문자 하나를 사용하는 이름과 상수는 가독성을 떨어뜨린다


              • 간단한 메소드에서 로컬 변수만 한 문자를 사용


         • 이름을 의미 있게 지으면 함수가 길어지지만 찾기가 쉽다

                   검색하기 어려운 이름                                            검색하기 쉬운 이름

                                                     int readDaysPerIdealDay = 4;
                                                 	    final int WORK_DAYS_PER_WEEK = 5;
                                                 	    int sum = 0;
          	      for(int j = 0; j < 34; j++) {
                                                 	    for(int j = 0; j < NUMBER_OF_TASKS; j++) {
          	      	     s += (t[j] * 4) / 5;
                                                 	    	     int realTaskDays = taskEstimate[j] * readDaysPerIdealDay;
          	      }
                                                 	    	     int realTaskWeeks = (realTaskDays / WORK_DAYS_PER_WEEK);
                                                 	    	     sum += realTaskWeeks;
                                                 	    }




12년 7월 22일 일요일
인코딩을 피하라

     • 부담을 더하지 않아도 이름에 인코딩할 정보는 아주 많다


     • 인코딩한 이름은 발음하기 어렵다


     • 헝가리안 표기법 (윈도우 C API 표기법)


         • 특징: 당시 컴파일러가 타입을 점검하지 않았기 때문에 타입을 변수명에 명시한 표기법


         • 현대적 IDE는 컴파일 하지 않아도 타입을 감지하기 때문에 오히려 방해가 됨


             • 클래스 이름이나 타입을 바꾸는 것이 어렵고, 읽기도 어렵다


     • 멤버 변수 접두어


         • 멤버 변수에 m_ 이라는 접두어를 붙이는 것보다 다른 색으로 표시해 주는 IDE 툴 사용


     • 인터페이스 클래스와 구현 클래스


         • 인터페이스에 접두어 ‘I’를 붙이는 것 보다 구현 클래스에 ‘C’ or 접미어 ‘Imp’ 를 추가하는 것이 낫다




12년 7월 22일 일요일
자신의 기억력을 자랑하지 마라

     • 기억력을 믿고, 의미 없는 이름을 사용하지 마라


     • 코드를 읽으면서 변수 이름을 자신이 아는 이름으로 변환해야 한다면 그 이름은
       바람직하지 못한 것이다


         • 문제 영역이나 해법 영역에서 사용하지 않는 이름을 선택했기 때문




12년 7월 22일 일요일
클래스 이름

     • 클래스 이름과 객체 이름은 명사나 명사구가 적합


         • Customer, WikiPage, Account, AddressParser


     • 불용어는 피해라


         • Manager, Processor, Data, Info...




12년 7월 22일 일요일
메소드 이름

     • 메소드 이름은 동사나 동사구가 적합


         • ex) postPayment, deletePage, save ...


     • 접근자, 변경자, 조건자는 자바 빈 표준에 따른 표기법 사용


         • get, set, is


     • 생성자를 중복해 정의할 때는 정적 팩토리 메소드를 사용

                                   생성자                                      정적 팩토리 메소드


                                                             	   Complex fulcrmPoint =
          	      Complex fulcrmPoint = new Complex(23.0);	   	   	  	    	    Complex.FromReadlNumber(23.0);




12년 7월 22일 일요일
기발한 이름은 피하라

     • 이름이 너무 기발하면 저자와 생각이 비슷한 사람만 이름을 기억한다


     • 재미난 이름보다 명확한 이름을 선택




12년 7월 22일 일요일
개념 하나에 단어 하나를 사용하라

     • 추상적인 개념 하나에 단어 하나를 선택


         • ex) fetch, retrieve, get을 제각각 사용할 경우 혼란이 초래


     • 일관성 있는 어휘를 사용해라




12년 7월 22일 일요일
말장난을 하지 마라

     • 한 단어를 두 가지 목적으로 사용하지 마라


         • Ex) 기존 값 두개를 더하거나 이어서 새로운 값을 만드는 메소드 add가 있을
           경우


             • 집합에 값 하나를 추가하는 메소드는 무엇으로 해야할까?


             • add 보다 insert나 append가 적당




12년 7월 22일 일요일
해법 영역에서 사용하는 이름을 사용하라

     • 기술적인 개념에는 기술적인 이름이 적합


         • 코드를 읽는 사람은 프로그래머


         • 문제 영역에서 모든 이름을 가져 올 경우 같은 기존 개념과 충돌이 있을 수
           있음


         • EX) AccountVisitor, JobQueue ...




12년 7월 22일 일요일
문제 영역과 관련 있는 이름을 사용하라

     • 적절한 ‘프로그래머 용어’가 없을 경우 문제 영역 내의 이름을 사용


         • 유지 보수시 업무 전문가를 통해 의미 파악 가능


         • 문제 영역 개념과 관련 깊은 코드라면 문제 영역의 이름을 사용




12년 7월 22일 일요일
의미 있는 맥락을 추가하라

     • 대다수 이름은 스스로 의미가 분명하지 않다


         • 클래스, 함수, 이름 공간에 넣어 맥락을 부여


         • 모든 방법이 실패하면, 접두어를 사용해라


         • Ex) firstName, lastName, street, houseNumber, city, state, zipcode


             • 전체적으로 보면 주소를 표현 한 것을 알 수 있지만, 각각을 보았을 때는 의미가 모호


             • addr 접두어 추가


                 • addrFirstName, addrLastName, addrStreet, addrHouseNumber ...


             • But, Address 클래스를 생성하고, 그 속성으로 사용하는 것이 더 효과적



12년 7월 22일 일요일
의미 있는 맥락을 추가하라 - 예제
                               맥락이 불분명한 변수                                                      클래스를 사용하여 맥락을 분명하게 한 변수

                                                                                    	   public class GuessStatisticsMessage{
                                                                                    	   	     private String number;
                                                                                    	   	     private String verb;
                                                                                    	   	     private String pluralModifier;
                                                                                    	   	     public String make(char candidate, int count) {
                                                                                    	   	     	      createPluralDependentMessagePars(count);
                                                                                    	   	     	      return String.format("There %s %s %s %s", verb,
      	   private void printGuessStatistics(char candidate, int count) {                                   number, candidate, pluralModifier);
      	   	      String number;                                                     	   	     }
      	   	      String verb;                                                       	   	     private void createPluralDependentMessagePars(int count) {
      	   	      String pluralModifier;                                              	   	     	      if(count == 0) {
      	   	      if(count == 0) {                                                   	   	     	      	      thereAreNoLetters();
      	   	      	      number = "no";                                              	   	     	      } else if(count == 1) {
      	   	      	      verb = "are";                                               	   	     	      	      thereIsOneLetter();
      	   	      	      pluralModifier = "s";                                        	   	     	      } else {
      	   	      } else if(count == 1) {                                            	   	     	      	      thereAreManyLetters(count);
      	   	      	      number = "1";                                               	   	     	      }	
      	   	      	      verb = "is";                                                	   	     }
      	   	      	      pluralModifier = "";                                         	   	     private void thereAreNoLetters() {
      	   	      } else {                                                           	   	     	      number = "no";
      	   	      	      number = Integer.toString(count);                           	   	     	      verb = "are";
      	   	      	      verb = "are";                                               	   	     	      pluralModifier = "s";	    	     	
      	   	      	      pluralModifier = "s";                                        	   	     }
      	   	      }                                                                  	   	     private void thereIsOneLetter() {
      	   	      String guessMessage = String.format("There %s %s %s %s",           	   	     	      number = "1";
                                         verb, number, candidate, pluralModifier);   	   	     	      verb = "is";
      	   	      print(guessMessage);                                               	   	     	      pluralModifier = "";	     	     	
      	   }                                                                         	   	     }
                                                                                    	   	     private void thereAreManyLetters(int count) {
                                                                                    	   	     	      number = Integer.toString(count);
                                                                                    	   	     	      verb = "are";
                                                                                    	   	     	      pluralModifier = "s";
                                                                                    	   	     }
                                                                                    	   }


12년 7월 22일 일요일
불필요한 맥락을 없애라

     • 의미가 분명한 경우에 짧은 이름이 긴 이름보다 낫다


         • Ex) 고급 휘발유 충전소(Gas Station Deluxe) 시스템 내의 클래스 이름


             • 모든 클래스의 접두어로 GSD를 사용하는 것은 바람직하지 못함




12년 7월 22일 일요일
마치면서

     • 좋은 이름을 선택하려면?


         • 설명하는 능력이 뛰어나야 한다


         • 문화적 배경이 같아야 한다


     • 좋은 이름은 가독성을 높인다


         • 자신의 기억력에 의존하기 보다는 명확하고 읽기 쉬운 이름을 사용해라




12년 7월 22일 일요일

Más contenido relacionado

La actualidad más candente

파이썬+주요+용어+정리 20160304
파이썬+주요+용어+정리 20160304파이썬+주요+용어+정리 20160304
파이썬+주요+용어+정리 20160304
Yong Joon Moon
 
파이썬 반복자 생성자 이해하기
파이썬 반복자 생성자 이해하기파이썬 반복자 생성자 이해하기
파이썬 반복자 생성자 이해하기
Yong Joon Moon
 

La actualidad más candente (20)

파이썬 class 및 인스턴스 생성 이해하기
파이썬 class 및 인스턴스 생성 이해하기파이썬 class 및 인스턴스 생성 이해하기
파이썬 class 및 인스턴스 생성 이해하기
 
파이썬+함수이해하기 20160229
파이썬+함수이해하기 20160229파이썬+함수이해하기 20160229
파이썬+함수이해하기 20160229
 
python data model 이해하기
python data model 이해하기python data model 이해하기
python data model 이해하기
 
파이썬+주요+용어+정리 20160304
파이썬+주요+용어+정리 20160304파이썬+주요+용어+정리 20160304
파이썬+주요+용어+정리 20160304
 
엘라스틱서치 이해하기 20160612
엘라스틱서치 이해하기 20160612엘라스틱서치 이해하기 20160612
엘라스틱서치 이해하기 20160612
 
파이썬 반복자 생성자 이해하기
파이썬 반복자 생성자 이해하기파이썬 반복자 생성자 이해하기
파이썬 반복자 생성자 이해하기
 
엘라스틱서치 이해하기 20160613
엘라스틱서치 이해하기 20160613엘라스틱서치 이해하기 20160613
엘라스틱서치 이해하기 20160613
 
파이썬 심화
파이썬 심화파이썬 심화
파이썬 심화
 
Jupyter notebook 이해하기
Jupyter notebook 이해하기 Jupyter notebook 이해하기
Jupyter notebook 이해하기
 
파이썬 iterator generator 이해하기
파이썬 iterator generator 이해하기파이썬 iterator generator 이해하기
파이썬 iterator generator 이해하기
 
파이썬+데이터+구조+이해하기 20160311
파이썬+데이터+구조+이해하기 20160311파이썬+데이터+구조+이해하기 20160311
파이썬+데이터+구조+이해하기 20160311
 
파이썬+Json+이해하기 20160301
파이썬+Json+이해하기 20160301파이썬+Json+이해하기 20160301
파이썬+Json+이해하기 20160301
 
Processing 기초 이해하기_20160713
Processing 기초 이해하기_20160713Processing 기초 이해하기_20160713
Processing 기초 이해하기_20160713
 
파이썬 Collections 모듈 이해하기
파이썬 Collections 모듈 이해하기파이썬 Collections 모듈 이해하기
파이썬 Collections 모듈 이해하기
 
파이썬 Xml 이해하기
파이썬 Xml 이해하기파이썬 Xml 이해하기
파이썬 Xml 이해하기
 
안드로이드 세미나
안드로이드 세미나안드로이드 세미나
안드로이드 세미나
 
파이썬 파일처리 이해하기
파이썬 파일처리 이해하기파이썬 파일처리 이해하기
파이썬 파일처리 이해하기
 
파이썬 플라스크 이해하기
파이썬 플라스크 이해하기 파이썬 플라스크 이해하기
파이썬 플라스크 이해하기
 
파이썬+Operator+이해하기 20160409
파이썬+Operator+이해하기 20160409파이썬+Operator+이해하기 20160409
파이썬+Operator+이해하기 20160409
 
파이썬 함수 이해하기
파이썬 함수 이해하기 파이썬 함수 이해하기
파이썬 함수 이해하기
 

Destacado

Abstract factory petterns
Abstract factory petternsAbstract factory petterns
Abstract factory petterns
HyeonSeok Choi
 
프로그래머로 사는 법 Ch6
프로그래머로 사는 법 Ch6프로그래머로 사는 법 Ch6
프로그래머로 사는 법 Ch6
HyeonSeok Choi
 
To become Open Source Contributor
To become Open Source ContributorTo become Open Source Contributor
To become Open Source Contributor
DaeMyung Kang
 

Destacado (20)

Chean code chapter 1
Chean code chapter 1Chean code chapter 1
Chean code chapter 1
 
함수적 사고 2장
함수적 사고 2장함수적 사고 2장
함수적 사고 2장
 
MutiCore 19-20
MutiCore 19-20MutiCore 19-20
MutiCore 19-20
 
Mining the social web ch1
Mining the social web ch1Mining the social web ch1
Mining the social web ch1
 
Abstract factory petterns
Abstract factory petternsAbstract factory petterns
Abstract factory petterns
 
Elastic search 클러스터관리
Elastic search 클러스터관리Elastic search 클러스터관리
Elastic search 클러스터관리
 
7가지 동시성 모델 - 데이터 병렬성
7가지 동시성 모델 - 데이터 병렬성7가지 동시성 모델 - 데이터 병렬성
7가지 동시성 모델 - 데이터 병렬성
 
HTTP 완벽가이드 1장.
HTTP 완벽가이드 1장.HTTP 완벽가이드 1장.
HTTP 완벽가이드 1장.
 
프로그래머로 사는 법 Ch6
프로그래머로 사는 법 Ch6프로그래머로 사는 법 Ch6
프로그래머로 사는 법 Ch6
 
To become Open Source Contributor
To become Open Source ContributorTo become Open Source Contributor
To become Open Source Contributor
 
Ooa&d
Ooa&dOoa&d
Ooa&d
 
Clean code ch15
Clean code ch15Clean code ch15
Clean code ch15
 
Clean code(05)
Clean code(05)Clean code(05)
Clean code(05)
 
Clean code chapter11 - systems
Clean code   chapter11 - systemsClean code   chapter11 - systems
Clean code chapter11 - systems
 
Clean code chapter9
Clean code chapter9Clean code chapter9
Clean code chapter9
 
코드 Ch20
코드 Ch20코드 Ch20
코드 Ch20
 
Clean code(02)
Clean code(02)Clean code(02)
Clean code(02)
 
Clean code(04)
Clean code(04)Clean code(04)
Clean code(04)
 
Clean code(01)
Clean code(01)Clean code(01)
Clean code(01)
 
Clean code(03)
Clean code(03)Clean code(03)
Clean code(03)
 

Similar a Clean code Chapter.2

안드로이드기초
안드로이드기초안드로이드기초
안드로이드기초
hylo926
 
가능한 C++ 스타일의 캐스트를 즐겨 쓰자
가능한 C++ 스타일의 캐스트를 즐겨 쓰자가능한 C++ 스타일의 캐스트를 즐겨 쓰자
가능한 C++ 스타일의 캐스트를 즐겨 쓰자
민욱 이
 
Clean code
Clean codeClean code
Clean code
bbongcsu
 

Similar a Clean code Chapter.2 (17)

Yapp a.a study 2 reflection+annotation
Yapp a.a study 2 reflection+annotationYapp a.a study 2 reflection+annotation
Yapp a.a study 2 reflection+annotation
 
iOS 개발자를 위한 영어로 이름 짓기
iOS 개발자를 위한 영어로 이름 짓기iOS 개발자를 위한 영어로 이름 짓기
iOS 개발자를 위한 영어로 이름 짓기
 
TDD.JUnit.조금더.알기
TDD.JUnit.조금더.알기TDD.JUnit.조금더.알기
TDD.JUnit.조금더.알기
 
안드로이드 설계코드 노하우 및 개발방법
안드로이드 설계코드 노하우 및 개발방법안드로이드 설계코드 노하우 및 개발방법
안드로이드 설계코드 노하우 및 개발방법
 
변수 이름의 효과
변수 이름의 효과변수 이름의 효과
변수 이름의 효과
 
[NDC2016] TERA 서버의 Modern C++ 활용기
[NDC2016] TERA 서버의 Modern C++ 활용기[NDC2016] TERA 서버의 Modern C++ 활용기
[NDC2016] TERA 서버의 Modern C++ 활용기
 
Java script
Java scriptJava script
Java script
 
안드로이드기초
안드로이드기초안드로이드기초
안드로이드기초
 
C++ stl
C++ stlC++ stl
C++ stl
 
파이썬 언어 기초
파이썬 언어 기초파이썬 언어 기초
파이썬 언어 기초
 
Secrets of the JavaScript Ninja - Chapter 12. DOM modification
Secrets of the JavaScript Ninja - Chapter 12. DOM modificationSecrets of the JavaScript Ninja - Chapter 12. DOM modification
Secrets of the JavaScript Ninja - Chapter 12. DOM modification
 
G+ Summer C Study 20130712(5일차)
G+ Summer C Study 20130712(5일차)G+ Summer C Study 20130712(5일차)
G+ Summer C Study 20130712(5일차)
 
DDD 구현기초 (거의 Final 버전)
DDD 구현기초 (거의 Final 버전)DDD 구현기초 (거의 Final 버전)
DDD 구현기초 (거의 Final 버전)
 
간단하게 알아보는 좋은 코드 서영훈
간단하게 알아보는 좋은 코드   서영훈간단하게 알아보는 좋은 코드   서영훈
간단하게 알아보는 좋은 코드 서영훈
 
가능한 C++ 스타일의 캐스트를 즐겨 쓰자
가능한 C++ 스타일의 캐스트를 즐겨 쓰자가능한 C++ 스타일의 캐스트를 즐겨 쓰자
가능한 C++ 스타일의 캐스트를 즐겨 쓰자
 
2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여
2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여
2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여
 
Clean code
Clean codeClean code
Clean code
 

Más de HyeonSeok Choi

Más de HyeonSeok Choi (20)

밑바닥부터시작하는딥러닝 Ch05
밑바닥부터시작하는딥러닝 Ch05밑바닥부터시작하는딥러닝 Ch05
밑바닥부터시작하는딥러닝 Ch05
 
밑바닥부터시작하는딥러닝 Ch2
밑바닥부터시작하는딥러닝 Ch2밑바닥부터시작하는딥러닝 Ch2
밑바닥부터시작하는딥러닝 Ch2
 
프로그래머를위한선형대수학1.2
프로그래머를위한선형대수학1.2프로그래머를위한선형대수학1.2
프로그래머를위한선형대수학1.2
 
알고리즘 중심의 머신러닝 가이드 Ch04
알고리즘 중심의 머신러닝 가이드 Ch04알고리즘 중심의 머신러닝 가이드 Ch04
알고리즘 중심의 머신러닝 가이드 Ch04
 
딥러닝 제대로시작하기 Ch04
딥러닝 제대로시작하기 Ch04딥러닝 제대로시작하기 Ch04
딥러닝 제대로시작하기 Ch04
 
밑바닥부터시작하는딥러닝 Ch05
밑바닥부터시작하는딥러닝 Ch05밑바닥부터시작하는딥러닝 Ch05
밑바닥부터시작하는딥러닝 Ch05
 
7가지 동시성 모델 4장
7가지 동시성 모델 4장7가지 동시성 모델 4장
7가지 동시성 모델 4장
 
Bounded Context
Bounded ContextBounded Context
Bounded Context
 
DDD Repository
DDD RepositoryDDD Repository
DDD Repository
 
DDD Start Ch#3
DDD Start Ch#3DDD Start Ch#3
DDD Start Ch#3
 
실무로 배우는 시스템 성능 최적화 Ch8
실무로 배우는 시스템 성능 최적화 Ch8실무로 배우는 시스템 성능 최적화 Ch8
실무로 배우는 시스템 성능 최적화 Ch8
 
실무로 배우는 시스템 성능 최적화 Ch7
실무로 배우는 시스템 성능 최적화 Ch7실무로 배우는 시스템 성능 최적화 Ch7
실무로 배우는 시스템 성능 최적화 Ch7
 
실무로 배우는 시스템 성능 최적화 Ch6
실무로 배우는 시스템 성능 최적화 Ch6실무로 배우는 시스템 성능 최적화 Ch6
실무로 배우는 시스템 성능 최적화 Ch6
 
Logstash, ElasticSearch, Kibana
Logstash, ElasticSearch, KibanaLogstash, ElasticSearch, Kibana
Logstash, ElasticSearch, Kibana
 
실무로배우는시스템성능최적화 Ch1
실무로배우는시스템성능최적화 Ch1실무로배우는시스템성능최적화 Ch1
실무로배우는시스템성능최적화 Ch1
 
HTTP 완벽가이드 21장
HTTP 완벽가이드 21장HTTP 완벽가이드 21장
HTTP 완벽가이드 21장
 
HTTP 완벽가이드 16장
HTTP 완벽가이드 16장HTTP 완벽가이드 16장
HTTP 완벽가이드 16장
 
HTTPS
HTTPSHTTPS
HTTPS
 
HTTP 완벽가이드 6장.
HTTP 완벽가이드 6장.HTTP 완벽가이드 6장.
HTTP 완벽가이드 6장.
 
Cluster - spark
Cluster - sparkCluster - spark
Cluster - spark
 

Clean code Chapter.2

  • 1. Clean Code Ch.2 의미 있는 이름 chois79 12년 7월 22일 일요일
  • 2. 이장에서 다룰 내용 • 소프트웨어에서 이름은 어디나 쓰인다 • 변수, 함수, 인수, 클래스, 파일, package, jar, war 등... • 이러한 이름을 잘 짓는 것이 중요하다 • 이해도를 높인다. • 이름을 잘 짓는 방법은 무엇인가? 12년 7월 22일 일요일
  • 3. 의도를 분명히 밝혀라 • 의도가 분명한 이름을 사용하는 것이 중요하다 • 좋은 이름을 짓는데 걸리는 시간 < 좋은 이름으로 인해 절약하는 시간 • Why? 코드의 이해와 변경이 쉬워짐 • 변수, 함수, 클래스의 이름을 짓는 가이드 • 다음의 질문에 답할 수 있는 이름을 사용 • 존재 이유는? • 수행 기능은? • 사용 방법은? • 만약 주석이 필요하다면, 의도를 제대로 표현하지 못한 것 12년 7월 22일 일요일
  • 4. 의도를 분명히 밝혀라 - 예제 의도가 모호한 코드 의도가 분명한 코드 int elapsedTimeInDays; int daysSinceCreation; int d; // 경과 시간 (단위: 날짜 수) int daysSinceModification; int fileAgeInDays; // 각 이름이 충분한 정보 제공을 하지 않음 // 이름을 명확히 변경 public List<int[]> getThem() { public List<int[]> getFlaggedCells() { List<int []> list1 = new ArrayList<int []>(); List<int []> flaggedCells = new ArrayList<int []>(); for(int [] x: theList) { for(int [] cell: gameBoard) { if(x[0] == 4) if(cell[STATUS_VALUE] == FLAGGED) list1.add(x); flaggedCells.add(cell); } } return list1; return flaggedCells; } } // int []을 Cell Class로 변환 public List<Cell> getFlaggedCells() { List<Cell> flaggedCells = new ArrayList<Cell>(); for(Cell cell: gameBoard) { if(cell.isFlagged()) flaggedCells.add(cell); } return flaggedCells; } 12년 7월 22일 일요일
  • 5. 그릇된 정보를 피하라 • 프로그래머는 코드에 그릇된 단서를 남겨서는 안된다 • 일반적으로 사용되는 의미와 다르게 사용하면 안됨 • ex) 여러 계정을 그룹으로 묶을때 실제로 List 컨테이너가 아닌데 accountList 로 칭할 경우 • accountGroup, bunchOfAccounts 혹은 Accounts로 명명 • 서로 흡사한 이름을 사용하지 않도록 주의 • XYZControllerForEfficientHandlingOfStrings, XYZControllerForEfficientStorageOfString • 유사한 개념은 유사한 표기법 사용 • 알파벳에 의한 모호성 주의 • 소문자 L과 숫자 1: l, 1 • 대문자 O와 숫자 0: O, 0 12년 7월 22일 일요일
  • 6. 의미 있게 구분하라 • 읽는 사람이 차이를 알도록 이름을 지어라 • 연속된 숫자를 사용하여 이름을 짓지마라 // a1, a2보다 source, destination 을 사용하여 가독성을 높일수 있음 public static void copyChars(char a1[], char a2[]) { for(int i = 0; i < a1.length; i++) { a2[i] = a1[i]; } } • 불용어를 사용하여 구분하지마라 • ex1) Info나 Data는 a, an, the와 마찬가지로 의미가 불분명 • ProductInfo, ProductData (차이점이 모호함) • ex2) NameString과 Name, moneyAmount와 money, customerInfo와 customer 12년 7월 22일 일요일
  • 7. 발음하기 쉬운 이름을 사용하라 • 발음하기 어려운 이름은 의사 소통을 힘들게 한다 • ex) genymdhms (generate date, year, month, day, hour, minute, second) • 이 이름에 대해 어떻게 의사 소통 해야 하는가? • “젠 와이 엠 디 에이취 엠 에스”, “젠 야 무다 힘즈” 발음하기 어려운 이름 발음하기 쉬운 이름 /* 코드를 통한 지적인 대화가 가능 */ class DtaRcrd102{ class Customer { private Date genymdhms; private Date generationTimestamp; private Date modymdhms; private Date modificationTimestamp; private final String pszqint = "102"; private final String recordId = "102"; /* ... */ /* ... */ } } 12년 7월 22일 일요일
  • 8. 검색하기 쉬운 이름을 사용하라 • 변수나 상수를 코드 여러 곳에서 사용한다면 검색하기 쉬운 이름이 바람직 • 문자 하나를 사용하는 이름과 상수는 가독성을 떨어뜨린다 • 간단한 메소드에서 로컬 변수만 한 문자를 사용 • 이름을 의미 있게 지으면 함수가 길어지지만 찾기가 쉽다 검색하기 어려운 이름 검색하기 쉬운 이름 int readDaysPerIdealDay = 4; final int WORK_DAYS_PER_WEEK = 5; int sum = 0; for(int j = 0; j < 34; j++) { for(int j = 0; j < NUMBER_OF_TASKS; j++) { s += (t[j] * 4) / 5; int realTaskDays = taskEstimate[j] * readDaysPerIdealDay; } int realTaskWeeks = (realTaskDays / WORK_DAYS_PER_WEEK); sum += realTaskWeeks; } 12년 7월 22일 일요일
  • 9. 인코딩을 피하라 • 부담을 더하지 않아도 이름에 인코딩할 정보는 아주 많다 • 인코딩한 이름은 발음하기 어렵다 • 헝가리안 표기법 (윈도우 C API 표기법) • 특징: 당시 컴파일러가 타입을 점검하지 않았기 때문에 타입을 변수명에 명시한 표기법 • 현대적 IDE는 컴파일 하지 않아도 타입을 감지하기 때문에 오히려 방해가 됨 • 클래스 이름이나 타입을 바꾸는 것이 어렵고, 읽기도 어렵다 • 멤버 변수 접두어 • 멤버 변수에 m_ 이라는 접두어를 붙이는 것보다 다른 색으로 표시해 주는 IDE 툴 사용 • 인터페이스 클래스와 구현 클래스 • 인터페이스에 접두어 ‘I’를 붙이는 것 보다 구현 클래스에 ‘C’ or 접미어 ‘Imp’ 를 추가하는 것이 낫다 12년 7월 22일 일요일
  • 10. 자신의 기억력을 자랑하지 마라 • 기억력을 믿고, 의미 없는 이름을 사용하지 마라 • 코드를 읽으면서 변수 이름을 자신이 아는 이름으로 변환해야 한다면 그 이름은 바람직하지 못한 것이다 • 문제 영역이나 해법 영역에서 사용하지 않는 이름을 선택했기 때문 12년 7월 22일 일요일
  • 11. 클래스 이름 • 클래스 이름과 객체 이름은 명사나 명사구가 적합 • Customer, WikiPage, Account, AddressParser • 불용어는 피해라 • Manager, Processor, Data, Info... 12년 7월 22일 일요일
  • 12. 메소드 이름 • 메소드 이름은 동사나 동사구가 적합 • ex) postPayment, deletePage, save ... • 접근자, 변경자, 조건자는 자바 빈 표준에 따른 표기법 사용 • get, set, is • 생성자를 중복해 정의할 때는 정적 팩토리 메소드를 사용 생성자 정적 팩토리 메소드 Complex fulcrmPoint = Complex fulcrmPoint = new Complex(23.0); Complex.FromReadlNumber(23.0); 12년 7월 22일 일요일
  • 13. 기발한 이름은 피하라 • 이름이 너무 기발하면 저자와 생각이 비슷한 사람만 이름을 기억한다 • 재미난 이름보다 명확한 이름을 선택 12년 7월 22일 일요일
  • 14. 개념 하나에 단어 하나를 사용하라 • 추상적인 개념 하나에 단어 하나를 선택 • ex) fetch, retrieve, get을 제각각 사용할 경우 혼란이 초래 • 일관성 있는 어휘를 사용해라 12년 7월 22일 일요일
  • 15. 말장난을 하지 마라 • 한 단어를 두 가지 목적으로 사용하지 마라 • Ex) 기존 값 두개를 더하거나 이어서 새로운 값을 만드는 메소드 add가 있을 경우 • 집합에 값 하나를 추가하는 메소드는 무엇으로 해야할까? • add 보다 insert나 append가 적당 12년 7월 22일 일요일
  • 16. 해법 영역에서 사용하는 이름을 사용하라 • 기술적인 개념에는 기술적인 이름이 적합 • 코드를 읽는 사람은 프로그래머 • 문제 영역에서 모든 이름을 가져 올 경우 같은 기존 개념과 충돌이 있을 수 있음 • EX) AccountVisitor, JobQueue ... 12년 7월 22일 일요일
  • 17. 문제 영역과 관련 있는 이름을 사용하라 • 적절한 ‘프로그래머 용어’가 없을 경우 문제 영역 내의 이름을 사용 • 유지 보수시 업무 전문가를 통해 의미 파악 가능 • 문제 영역 개념과 관련 깊은 코드라면 문제 영역의 이름을 사용 12년 7월 22일 일요일
  • 18. 의미 있는 맥락을 추가하라 • 대다수 이름은 스스로 의미가 분명하지 않다 • 클래스, 함수, 이름 공간에 넣어 맥락을 부여 • 모든 방법이 실패하면, 접두어를 사용해라 • Ex) firstName, lastName, street, houseNumber, city, state, zipcode • 전체적으로 보면 주소를 표현 한 것을 알 수 있지만, 각각을 보았을 때는 의미가 모호 • addr 접두어 추가 • addrFirstName, addrLastName, addrStreet, addrHouseNumber ... • But, Address 클래스를 생성하고, 그 속성으로 사용하는 것이 더 효과적 12년 7월 22일 일요일
  • 19. 의미 있는 맥락을 추가하라 - 예제 맥락이 불분명한 변수 클래스를 사용하여 맥락을 분명하게 한 변수 public class GuessStatisticsMessage{ private String number; private String verb; private String pluralModifier; public String make(char candidate, int count) { createPluralDependentMessagePars(count); return String.format("There %s %s %s %s", verb, private void printGuessStatistics(char candidate, int count) { number, candidate, pluralModifier); String number; } String verb; private void createPluralDependentMessagePars(int count) { String pluralModifier; if(count == 0) { if(count == 0) { thereAreNoLetters(); number = "no"; } else if(count == 1) { verb = "are"; thereIsOneLetter(); pluralModifier = "s"; } else { } else if(count == 1) { thereAreManyLetters(count); number = "1"; } verb = "is"; } pluralModifier = ""; private void thereAreNoLetters() { } else { number = "no"; number = Integer.toString(count); verb = "are"; verb = "are"; pluralModifier = "s"; pluralModifier = "s"; } } private void thereIsOneLetter() { String guessMessage = String.format("There %s %s %s %s", number = "1"; verb, number, candidate, pluralModifier); verb = "is"; print(guessMessage); pluralModifier = ""; } } private void thereAreManyLetters(int count) { number = Integer.toString(count); verb = "are"; pluralModifier = "s"; } } 12년 7월 22일 일요일
  • 20. 불필요한 맥락을 없애라 • 의미가 분명한 경우에 짧은 이름이 긴 이름보다 낫다 • Ex) 고급 휘발유 충전소(Gas Station Deluxe) 시스템 내의 클래스 이름 • 모든 클래스의 접두어로 GSD를 사용하는 것은 바람직하지 못함 12년 7월 22일 일요일
  • 21. 마치면서 • 좋은 이름을 선택하려면? • 설명하는 능력이 뛰어나야 한다 • 문화적 배경이 같아야 한다 • 좋은 이름은 가독성을 높인다 • 자신의 기억력에 의존하기 보다는 명확하고 읽기 쉬운 이름을 사용해라 12년 7월 22일 일요일