SlideShare une entreprise Scribd logo
1  sur  35
SEEG Software Engineering Expert Group Clean Code 김진 태 Copyrightⓒ 2011 by SEEG, All Rights Reserved
SEEG is … 2 도메인 전문기술 요구공학 / 설계 기법 패키지솔루션 프로세스 임베디드시스템 엔터프라이즈 시스템 재공학 품질 보증 SW 프로 세스 개선 컨설팅 영역 SW 품질보증 SW 개발 방법론
Clean Code 란? ,[object Object]
나는 우아하고 효율적인 코드를 좋아한다. 논리가 간단해야 버그가 숨어들지 못한다. 의존성을 최대한 줄여야 유지보수가 쉬워진다. 오류는 명백한 전략에 의거해 철저히 처리한다. 성능을 최적으로 유지해야 사람들이 원칙 없는 최적화로 코드를 망치려는 유혹에 빠지지 않는다. 클린 코드는 한 가지를 제대로 한다.
By 그래디부치(Object Oriented Analysis and Design with Application의 저자)
클린 코드는 단순하고 직접적이다. 클린 코드는 잘 쓴 문장처럼 읽힌다. 클린 코드는 결코 설계자의 의도를 숨기지 않는다. 오히려 명쾌한 추상화와 단순한 제어문으로 가득하다.3
Clean Code 란? ,[object Object]
클린코드는 작성자가 아닌 사람도 읽기 쉽고 고치기 쉽다.의미 있는 이름이다. 특정한 목적을 달성하는 방법은 하나만 제공한다. 의존성은 최소이며 각 의존성을 명확히 정의한다. API는 명확하며 최소로 줄였다. 때로는 정보 전부를 코드만으로 명확하게 드러내기 어려우므로 언어에 따라 문학적 표현이 필요하다.
By 존 제프리(ExtremeProgramming Installed의 저자)
중요한 순으로 나열하자면 간단한 코드는
중복이 없다
표현성이 뛰어나다
작게 추상화되어 있다4
5 Clean Code 란? 컴퓨터가 이해하는 코드는 어느 바보나 다 짤 수 있다.  훌륭한 프로그래머는 사람이 이해할 수 있는 코드를 짠다  - 마틴파울러-
가독성이 뛰어나다. 간단하고 작다. 의존성을 최대한 줄였다. 의도와 목적이 명확한 코드 타인에 의해 변경이 용이 한 코드 중복이 없는 코드 개체(Class, Method)가 한가지 작업만 수행하는 코드 6 사람이 이해할 수 있는 코드란 무엇일까요? For people For people For people For people For people For people For people
7 왜 사람이 이해하는 코드를 만들어야 하나요 ? 사람 SW 공장은 (         )이기 때문입니다 행태 일반적인 SW 개발 (         )때문입니다
8 일반적인 SW 개발은 기존 코드에서 시작합니다 Evolution Enhanced More complex Modified Drift away  from its original design Adapted
9 기능만 추가할 뿐 코드 품질의 개선 작업은 미비합니다 Product 1 productization Product 2 Product 3 Base Code update
10 개선되지 않은 SW는 늙게 되어 Dirty code 가 됩니다 Dirty code는 SW Aging을 가속화 The Spiral of Complex
11 SW 노후화는 품질을 급격히 떨어뜨립니다
코드가 건강합니다. 코드가 오래 갈 수 있습니다. 조직의 경쟁력을 높입니다. 개발 비용을 줄이고 생산성을 높입니다. 12 왜 사람이 이해하는 코드를 만들어야 하나요 ?
당신의코드가 이렇게 되게 하십시오 (1) 13 의미 있는 이름 착한 함수 없는 게 나은 주석
이름 짓기가 가장 중요합니다. 14
의도를 분명히 하라 15 주석이 필요 없는 코드를 작성하라 //Login Client으로부터의 Login요청을 처리함. void CMessageProcFunc::Net_CLIENT_INFO() void CMessageProcFunc::processLoginRequestFromClient() public List<int[]> getList(){      List<int[]> list1 = new ArrayList<int []>();      for(int[] x : theList) {             if(x[0] == 4) {                    list1.add(x);             }      }       return list1; }  public List<Cell> getFlaggedCell(){      List<Cell> flaggedCells = new ArrayList<Cell>();      for(Cell cell : gameBoard){ 		if(cell.isFlagged()){ flaggedCells.add(cell);                  }       }       return flaggedCell; }
그릇된 정보를 피하라 16 길고 서로 흡사한 이름은 피하라 public Class Vehicle { controllForEfficientHandlingOfString (); controllForEfficientStorageOfString (); } public Class Y {     private Vehicle vehicle = new Vehicle();     public void method A(){ vehicle.controllForEfficientStorageOfString();     } } IDE 자동완성기능에서 선택할 때 실수의 여지가 있음
그릇된 정보를 피하라 17 연속적인 숫자를 붙인 이름을 피하라 public class Car{     private Tire tire1 = new Tire();     private Tire tire2 = new Tire();     private Tire tire3 = new Tire();     private Tire tire4 = new Tire(); } public class Car{     private Tire leftFrontTire = new Tire();     private Tire rightFrontTire = new Tire();     private Tire leftBackTire = new Tire();     private Tire rightBackTire = new Tire(); } public class Vehicle{ 	public moveControl(intmoveType){ 		if(moveType==0){ 		}else if(moveType==1){ 		} else if(moveType==2){ 		}else{ 		         throw Exception(); 		} 	} } public class Vehicle{ 	Const int GO_STRAIGHT = 0; 	Const int TURN_LEFT = 1; 	Const int TURN_RIGHT = 2; 	Const int STOP = 3; 	public controlMovement(intmoveType){ 		if(moveType== GO_STRAIGHT){ 		}else if(moveType== TURN_LEFT){ 		} else if(moveType== TURN_RIGHT){ 		}else{ 		         throw Exception(); 		} 	} }
문맥에 맞는 단어를 사용하라 18 이해하는데 시간을 소모하지 않기 위해 일관성 있는 단어를 사용하라 public class Vehicle{ 	public doublegetFuelRemaining(); 	public double retrieveDegreeOfTireAbrasion(); 	public doublefetchCurrentSpeed(); } public class Vehicle{ 	public double getFuelRemaining(); 	public double getDegreeOfTireAbrasion(); 	public double getCurrentSpeed(); }
클래스 이름을 일관성 있게 작성하라 19 클래스이름은 명사또는 명사구로 작성하라                                                                        : 클래스는 행위(멤버함수)의 주체로서 명사 또는 명사구로 표현됨
함수 이름을 일관성 있게 작성하라 20 함수 이름은 동사 또는 동사구로 작성하라 : 함수는 클래스가 행하는 행위로서 동사 또는 동사구로 표현됨 SRP Test: 클래스가 스스로 멤버함수 한다.
단일책임의 원칙 단일책임원칙(Single Responsibility Principle) ,[object Object]
클래스나 모듈을 변경할 이유가 하나 뿐이어야 함
큰 클래스  작은 클래스 여럿작은 클래스와 협력해 시스템에 필요한 동작 수행SRP 21 ____________가 스스로 ___________ 한다.  각 줄의 첫 번째 공백에 모듈명을 적습니다. 두 번째 공백에 모듈의 메소드/함수 중 하나를 적습니다. 모듈의 모든 함수/메소드마다 이를 수행합니다. 각 줄을 소리 내어 읽습니다. 읽은 내용을 이해할 수 있습니까? 실제로 모듈의 함수/메소드가 의미하는 내용에 책임을 갖고 있어야 합니까?
SRP(Single-Responsibility Principle) SRP Test 예 Automobile 모듈(혹은 클래스)에 SRP 적용하기 Automobile start(); stop(); changeTires(tires []); drive(); wash(); checkOil(); getOil(); SRP 준수        SRP 위반       
착한 함수 23
작게 만들어라 24 이상적인 블록(if문 While문)안의 내용은 한 줄 블록 안에서 다른 함수를 호출하도록 작성 public String renderPageWithSetupsAndTeardowns(PageDatapageData, booleanisSuite){ If(isTestPage) { WikiPagetestPage = pageData.getWikiPage(); StringBuffernewPageContent = new StringBuffer(); includeSetupPages(testPage, newPageContent, isSuite); newPageContent.append(pageData.getContent());  ….. } return pageData.getHTML(); } public String renderPageWithSetupsAndTeardowns(PageDatapageData, booleanisSuite){  If(isTestPage) { includeSetupAndTeardownPages(pageData, isSuite); } return pageData.getHTML(); }

Contenu connexe

Tendances

TDD.JUnit.조금더.알기
TDD.JUnit.조금더.알기TDD.JUnit.조금더.알기
TDD.JUnit.조금더.알기Wonchang Song
 
유지보수 가능한 개발 원칙
유지보수 가능한 개발 원칙유지보수 가능한 개발 원칙
유지보수 가능한 개발 원칙Hyosang Hong
 
카사 공개세미나1회 W.E.L.C.
카사 공개세미나1회  W.E.L.C.카사 공개세미나1회  W.E.L.C.
카사 공개세미나1회 W.E.L.C.Ryan Park
 
2016 hack festival igrus
2016 hack festival igrus2016 hack festival igrus
2016 hack festival igrusJinookawk
 
0.javascript기본(~3일차내)
0.javascript기본(~3일차내)0.javascript기본(~3일차내)
0.javascript기본(~3일차내)Sung-hoon Ma
 
Refactoring Tutorial 1주차[ Refactoring 개요]
Refactoring  Tutorial 1주차[ Refactoring 개요]Refactoring  Tutorial 1주차[ Refactoring 개요]
Refactoring Tutorial 1주차[ Refactoring 개요]Bingu Shim
 
NDC11_김성익_슈퍼클래스
NDC11_김성익_슈퍼클래스NDC11_김성익_슈퍼클래스
NDC11_김성익_슈퍼클래스Sungik Kim
 
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기Chris Ohk
 
파이썬 함수 이해하기
파이썬 함수 이해하기 파이썬 함수 이해하기
파이썬 함수 이해하기 Yong Joon Moon
 
간단하게 알아보는 좋은 코드 서영훈
간단하게 알아보는 좋은 코드   서영훈간단하게 알아보는 좋은 코드   서영훈
간단하게 알아보는 좋은 코드 서영훈Seo YoungHoon
 
Api design for c++ 6장
Api design for c++ 6장Api design for c++ 6장
Api design for c++ 6장Ji Hun Kim
 
주니어 개발자도 이해 할 수 있는 Go - Scope 편
주니어 개발자도 이해 할 수 있는 Go - Scope 편주니어 개발자도 이해 할 수 있는 Go - Scope 편
주니어 개발자도 이해 할 수 있는 Go - Scope 편Darion Kim
 
Java null survival guide
Java null survival guideJava null survival guide
Java null survival guideSungchul Park
 
Python vs Java @ PyCon Korea 2017
Python vs Java @ PyCon Korea 2017Python vs Java @ PyCon Korea 2017
Python vs Java @ PyCon Korea 2017Insuk (Chris) Cho
 
The roadtocodecraft
The roadtocodecraftThe roadtocodecraft
The roadtocodecraftbbongcsu
 
2013 C++ Study For Students #1
2013 C++ Study For Students #12013 C++ Study For Students #1
2013 C++ Study For Students #1Chris Ohk
 
1.Startup JavaScript - 프로그래밍 기초
1.Startup JavaScript - 프로그래밍 기초1.Startup JavaScript - 프로그래밍 기초
1.Startup JavaScript - 프로그래밍 기초Circulus
 
자바 테스트 자동화
자바 테스트 자동화자바 테스트 자동화
자바 테스트 자동화Sungchul Park
 
C#을 사용한 빠른 툴 개발
C#을 사용한 빠른 툴 개발C#을 사용한 빠른 툴 개발
C#을 사용한 빠른 툴 개발흥배 최
 

Tendances (20)

TDD.JUnit.조금더.알기
TDD.JUnit.조금더.알기TDD.JUnit.조금더.알기
TDD.JUnit.조금더.알기
 
유지보수 가능한 개발 원칙
유지보수 가능한 개발 원칙유지보수 가능한 개발 원칙
유지보수 가능한 개발 원칙
 
카사 공개세미나1회 W.E.L.C.
카사 공개세미나1회  W.E.L.C.카사 공개세미나1회  W.E.L.C.
카사 공개세미나1회 W.E.L.C.
 
2016 hack festival igrus
2016 hack festival igrus2016 hack festival igrus
2016 hack festival igrus
 
0.javascript기본(~3일차내)
0.javascript기본(~3일차내)0.javascript기본(~3일차내)
0.javascript기본(~3일차내)
 
Refactoring Tutorial 1주차[ Refactoring 개요]
Refactoring  Tutorial 1주차[ Refactoring 개요]Refactoring  Tutorial 1주차[ Refactoring 개요]
Refactoring Tutorial 1주차[ Refactoring 개요]
 
NDC11_김성익_슈퍼클래스
NDC11_김성익_슈퍼클래스NDC11_김성익_슈퍼클래스
NDC11_김성익_슈퍼클래스
 
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
 
파이썬 함수 이해하기
파이썬 함수 이해하기 파이썬 함수 이해하기
파이썬 함수 이해하기
 
Java lambda
Java lambdaJava lambda
Java lambda
 
간단하게 알아보는 좋은 코드 서영훈
간단하게 알아보는 좋은 코드   서영훈간단하게 알아보는 좋은 코드   서영훈
간단하게 알아보는 좋은 코드 서영훈
 
Api design for c++ 6장
Api design for c++ 6장Api design for c++ 6장
Api design for c++ 6장
 
주니어 개발자도 이해 할 수 있는 Go - Scope 편
주니어 개발자도 이해 할 수 있는 Go - Scope 편주니어 개발자도 이해 할 수 있는 Go - Scope 편
주니어 개발자도 이해 할 수 있는 Go - Scope 편
 
Java null survival guide
Java null survival guideJava null survival guide
Java null survival guide
 
Python vs Java @ PyCon Korea 2017
Python vs Java @ PyCon Korea 2017Python vs Java @ PyCon Korea 2017
Python vs Java @ PyCon Korea 2017
 
The roadtocodecraft
The roadtocodecraftThe roadtocodecraft
The roadtocodecraft
 
2013 C++ Study For Students #1
2013 C++ Study For Students #12013 C++ Study For Students #1
2013 C++ Study For Students #1
 
1.Startup JavaScript - 프로그래밍 기초
1.Startup JavaScript - 프로그래밍 기초1.Startup JavaScript - 프로그래밍 기초
1.Startup JavaScript - 프로그래밍 기초
 
자바 테스트 자동화
자바 테스트 자동화자바 테스트 자동화
자바 테스트 자동화
 
C#을 사용한 빠른 툴 개발
C#을 사용한 빠른 툴 개발C#을 사용한 빠른 툴 개발
C#을 사용한 빠른 툴 개발
 

En vedette

Bnf seeg ws
Bnf seeg wsBnf seeg ws
Bnf seeg wsbbongcsu
 
애자일 마인드셋
애자일 마인드셋애자일 마인드셋
애자일 마인드셋Jaehoon Oh
 
Refactoring tutorial
Refactoring tutorialRefactoring tutorial
Refactoring tutorialBingu Shim
 
애자일 개발 프로세스를 이용한 고품질 소프트웨어 개발
애자일 개발 프로세스를 이용한 고품질 소프트웨어 개발애자일 개발 프로세스를 이용한 고품질 소프트웨어 개발
애자일 개발 프로세스를 이용한 고품질 소프트웨어 개발Jaehoon Oh
 
Refactoring tutorial 1주차[refactoring 개요]
Refactoring tutorial 1주차[refactoring 개요]Refactoring tutorial 1주차[refactoring 개요]
Refactoring tutorial 1주차[refactoring 개요]bbongcsu
 
인수테스트 주도 개발
인수테스트 주도 개발인수테스트 주도 개발
인수테스트 주도 개발Jaehoon Oh
 
Tdd 왜 배우기 어려운가
Tdd 왜 배우기 어려운가Tdd 왜 배우기 어려운가
Tdd 왜 배우기 어려운가Jaehoon Oh
 
Robot framework 을 이용한 기능 테스트 자동화
Robot framework 을 이용한 기능 테스트 자동화Robot framework 을 이용한 기능 테스트 자동화
Robot framework 을 이용한 기능 테스트 자동화Jaehoon Oh
 

En vedette (9)

Bnf seeg ws
Bnf seeg wsBnf seeg ws
Bnf seeg ws
 
애자일 마인드셋
애자일 마인드셋애자일 마인드셋
애자일 마인드셋
 
Refactoring tutorial
Refactoring tutorialRefactoring tutorial
Refactoring tutorial
 
애자일 개발 프로세스를 이용한 고품질 소프트웨어 개발
애자일 개발 프로세스를 이용한 고품질 소프트웨어 개발애자일 개발 프로세스를 이용한 고품질 소프트웨어 개발
애자일 개발 프로세스를 이용한 고품질 소프트웨어 개발
 
Bnf seeg
Bnf seegBnf seeg
Bnf seeg
 
Refactoring tutorial 1주차[refactoring 개요]
Refactoring tutorial 1주차[refactoring 개요]Refactoring tutorial 1주차[refactoring 개요]
Refactoring tutorial 1주차[refactoring 개요]
 
인수테스트 주도 개발
인수테스트 주도 개발인수테스트 주도 개발
인수테스트 주도 개발
 
Tdd 왜 배우기 어려운가
Tdd 왜 배우기 어려운가Tdd 왜 배우기 어려운가
Tdd 왜 배우기 어려운가
 
Robot framework 을 이용한 기능 테스트 자동화
Robot framework 을 이용한 기능 테스트 자동화Robot framework 을 이용한 기능 테스트 자동화
Robot framework 을 이용한 기능 테스트 자동화
 

Similaire à Clean code

[143] Modern C++ 무조건 써야 해?
[143] Modern C++ 무조건 써야 해?[143] Modern C++ 무조건 써야 해?
[143] Modern C++ 무조건 써야 해?NAVER D2
 
읽기 좋은 코드가 좋은 코드다 Part one
읽기 좋은 코드가 좋은 코드다   Part one읽기 좋은 코드가 좋은 코드다   Part one
읽기 좋은 코드가 좋은 코드다 Part oneJi Hun Kim
 
Working Effectively With Legacy Code - xp2005
Working Effectively With Legacy Code - xp2005Working Effectively With Legacy Code - xp2005
Working Effectively With Legacy Code - xp2005Ryan Park
 
불어오는 변화의 바람, From c++98 to c++11, 14
불어오는 변화의 바람, From c++98 to c++11, 14 불어오는 변화의 바람, From c++98 to c++11, 14
불어오는 변화의 바람, From c++98 to c++11, 14 명신 김
 
About Visual C++ 10
About  Visual C++ 10About  Visual C++ 10
About Visual C++ 10흥배 최
 
Modern C++ 프로그래머를 위한 CPP11/14 핵심
Modern C++ 프로그래머를 위한 CPP11/14 핵심Modern C++ 프로그래머를 위한 CPP11/14 핵심
Modern C++ 프로그래머를 위한 CPP11/14 핵심흥배 최
 
Effective unit testing ch3. 테스트더블
Effective unit testing   ch3. 테스트더블Effective unit testing   ch3. 테스트더블
Effective unit testing ch3. 테스트더블YongEun Choi
 
소프트웨어 개선 그룹(Sig) 개발 원칙
소프트웨어 개선 그룹(Sig) 개발 원칙소프트웨어 개선 그룹(Sig) 개발 원칙
소프트웨어 개선 그룹(Sig) 개발 원칙Hong Hyo Sang
 
Java 유지보수 가능한 개발 원칙
Java 유지보수 가능한 개발 원칙Java 유지보수 가능한 개발 원칙
Java 유지보수 가능한 개발 원칙Hyosang Hong
 
Sonarqube 20160509
Sonarqube 20160509Sonarqube 20160509
Sonarqube 20160509영석 조
 
Multi-thread : producer - consumer
Multi-thread : producer - consumerMulti-thread : producer - consumer
Multi-thread : producer - consumerChang Yoon Oh
 
Boost라이브러리의내부구조 20151111 서진택
Boost라이브러리의내부구조 20151111 서진택Boost라이브러리의내부구조 20151111 서진택
Boost라이브러리의내부구조 20151111 서진택JinTaek Seo
 
Angular2 가기전 Type script소개
 Angular2 가기전 Type script소개 Angular2 가기전 Type script소개
Angular2 가기전 Type script소개Dong Jun Kwon
 
[1A5]효율적인안드로이드앱개발
[1A5]효율적인안드로이드앱개발[1A5]효율적인안드로이드앱개발
[1A5]효율적인안드로이드앱개발NAVER D2
 
Ai C#세미나
Ai C#세미나Ai C#세미나
Ai C#세미나Astin Choi
 
Design patterns
Design patternsDesign patterns
Design patternsdf
 
C Language I
C Language IC Language I
C Language ISuho Kwon
 

Similaire à Clean code (20)

[143] Modern C++ 무조건 써야 해?
[143] Modern C++ 무조건 써야 해?[143] Modern C++ 무조건 써야 해?
[143] Modern C++ 무조건 써야 해?
 
읽기 좋은 코드가 좋은 코드다 Part one
읽기 좋은 코드가 좋은 코드다   Part one읽기 좋은 코드가 좋은 코드다   Part one
읽기 좋은 코드가 좋은 코드다 Part one
 
Working Effectively With Legacy Code - xp2005
Working Effectively With Legacy Code - xp2005Working Effectively With Legacy Code - xp2005
Working Effectively With Legacy Code - xp2005
 
불어오는 변화의 바람, From c++98 to c++11, 14
불어오는 변화의 바람, From c++98 to c++11, 14 불어오는 변화의 바람, From c++98 to c++11, 14
불어오는 변화의 바람, From c++98 to c++11, 14
 
About Visual C++ 10
About  Visual C++ 10About  Visual C++ 10
About Visual C++ 10
 
Modern C++ 프로그래머를 위한 CPP11/14 핵심
Modern C++ 프로그래머를 위한 CPP11/14 핵심Modern C++ 프로그래머를 위한 CPP11/14 핵심
Modern C++ 프로그래머를 위한 CPP11/14 핵심
 
Effective unit testing ch3. 테스트더블
Effective unit testing   ch3. 테스트더블Effective unit testing   ch3. 테스트더블
Effective unit testing ch3. 테스트더블
 
소프트웨어 개선 그룹(Sig) 개발 원칙
소프트웨어 개선 그룹(Sig) 개발 원칙소프트웨어 개선 그룹(Sig) 개발 원칙
소프트웨어 개선 그룹(Sig) 개발 원칙
 
Working with code
Working with codeWorking with code
Working with code
 
Java 유지보수 가능한 개발 원칙
Java 유지보수 가능한 개발 원칙Java 유지보수 가능한 개발 원칙
Java 유지보수 가능한 개발 원칙
 
Sonarqube 20160509
Sonarqube 20160509Sonarqube 20160509
Sonarqube 20160509
 
Multi-thread : producer - consumer
Multi-thread : producer - consumerMulti-thread : producer - consumer
Multi-thread : producer - consumer
 
Boost라이브러리의내부구조 20151111 서진택
Boost라이브러리의내부구조 20151111 서진택Boost라이브러리의내부구조 20151111 서진택
Boost라이브러리의내부구조 20151111 서진택
 
Angular2 가기전 Type script소개
 Angular2 가기전 Type script소개 Angular2 가기전 Type script소개
Angular2 가기전 Type script소개
 
[1A5]효율적인안드로이드앱개발
[1A5]효율적인안드로이드앱개발[1A5]효율적인안드로이드앱개발
[1A5]효율적인안드로이드앱개발
 
Ai C#세미나
Ai C#세미나Ai C#세미나
Ai C#세미나
 
Design patterns
Design patternsDesign patterns
Design patterns
 
C Language I
C Language IC Language I
C Language I
 
함수적 사고 2장
함수적 사고 2장함수적 사고 2장
함수적 사고 2장
 
Spring Boot 2
Spring Boot 2Spring Boot 2
Spring Boot 2
 

Clean code

  • 1. SEEG Software Engineering Expert Group Clean Code 김진 태 Copyrightⓒ 2011 by SEEG, All Rights Reserved
  • 2. SEEG is … 2 도메인 전문기술 요구공학 / 설계 기법 패키지솔루션 프로세스 임베디드시스템 엔터프라이즈 시스템 재공학 품질 보증 SW 프로 세스 개선 컨설팅 영역 SW 품질보증 SW 개발 방법론
  • 3.
  • 4. 나는 우아하고 효율적인 코드를 좋아한다. 논리가 간단해야 버그가 숨어들지 못한다. 의존성을 최대한 줄여야 유지보수가 쉬워진다. 오류는 명백한 전략에 의거해 철저히 처리한다. 성능을 최적으로 유지해야 사람들이 원칙 없는 최적화로 코드를 망치려는 유혹에 빠지지 않는다. 클린 코드는 한 가지를 제대로 한다.
  • 5. By 그래디부치(Object Oriented Analysis and Design with Application의 저자)
  • 6. 클린 코드는 단순하고 직접적이다. 클린 코드는 잘 쓴 문장처럼 읽힌다. 클린 코드는 결코 설계자의 의도를 숨기지 않는다. 오히려 명쾌한 추상화와 단순한 제어문으로 가득하다.3
  • 7.
  • 8. 클린코드는 작성자가 아닌 사람도 읽기 쉽고 고치기 쉽다.의미 있는 이름이다. 특정한 목적을 달성하는 방법은 하나만 제공한다. 의존성은 최소이며 각 의존성을 명확히 정의한다. API는 명확하며 최소로 줄였다. 때로는 정보 전부를 코드만으로 명확하게 드러내기 어려우므로 언어에 따라 문학적 표현이 필요하다.
  • 14. 5 Clean Code 란? 컴퓨터가 이해하는 코드는 어느 바보나 다 짤 수 있다. 훌륭한 프로그래머는 사람이 이해할 수 있는 코드를 짠다 - 마틴파울러-
  • 15. 가독성이 뛰어나다. 간단하고 작다. 의존성을 최대한 줄였다. 의도와 목적이 명확한 코드 타인에 의해 변경이 용이 한 코드 중복이 없는 코드 개체(Class, Method)가 한가지 작업만 수행하는 코드 6 사람이 이해할 수 있는 코드란 무엇일까요? For people For people For people For people For people For people For people
  • 16. 7 왜 사람이 이해하는 코드를 만들어야 하나요 ? 사람 SW 공장은 ( )이기 때문입니다 행태 일반적인 SW 개발 ( )때문입니다
  • 17. 8 일반적인 SW 개발은 기존 코드에서 시작합니다 Evolution Enhanced More complex Modified Drift away from its original design Adapted
  • 18. 9 기능만 추가할 뿐 코드 품질의 개선 작업은 미비합니다 Product 1 productization Product 2 Product 3 Base Code update
  • 19. 10 개선되지 않은 SW는 늙게 되어 Dirty code 가 됩니다 Dirty code는 SW Aging을 가속화 The Spiral of Complex
  • 20. 11 SW 노후화는 품질을 급격히 떨어뜨립니다
  • 21. 코드가 건강합니다. 코드가 오래 갈 수 있습니다. 조직의 경쟁력을 높입니다. 개발 비용을 줄이고 생산성을 높입니다. 12 왜 사람이 이해하는 코드를 만들어야 하나요 ?
  • 22. 당신의코드가 이렇게 되게 하십시오 (1) 13 의미 있는 이름 착한 함수 없는 게 나은 주석
  • 23. 이름 짓기가 가장 중요합니다. 14
  • 24. 의도를 분명히 하라 15 주석이 필요 없는 코드를 작성하라 //Login Client으로부터의 Login요청을 처리함. void CMessageProcFunc::Net_CLIENT_INFO() void CMessageProcFunc::processLoginRequestFromClient() public List<int[]> getList(){ List<int[]> list1 = new ArrayList<int []>(); for(int[] x : theList) { if(x[0] == 4) { list1.add(x); } } return list1; } public List<Cell> getFlaggedCell(){ List<Cell> flaggedCells = new ArrayList<Cell>(); for(Cell cell : gameBoard){ if(cell.isFlagged()){ flaggedCells.add(cell); } } return flaggedCell; }
  • 25. 그릇된 정보를 피하라 16 길고 서로 흡사한 이름은 피하라 public Class Vehicle { controllForEfficientHandlingOfString (); controllForEfficientStorageOfString (); } public Class Y { private Vehicle vehicle = new Vehicle(); public void method A(){ vehicle.controllForEfficientStorageOfString(); } } IDE 자동완성기능에서 선택할 때 실수의 여지가 있음
  • 26. 그릇된 정보를 피하라 17 연속적인 숫자를 붙인 이름을 피하라 public class Car{ private Tire tire1 = new Tire(); private Tire tire2 = new Tire(); private Tire tire3 = new Tire(); private Tire tire4 = new Tire(); } public class Car{ private Tire leftFrontTire = new Tire(); private Tire rightFrontTire = new Tire(); private Tire leftBackTire = new Tire(); private Tire rightBackTire = new Tire(); } public class Vehicle{ public moveControl(intmoveType){ if(moveType==0){ }else if(moveType==1){ } else if(moveType==2){ }else{ throw Exception(); } } } public class Vehicle{ Const int GO_STRAIGHT = 0; Const int TURN_LEFT = 1; Const int TURN_RIGHT = 2; Const int STOP = 3; public controlMovement(intmoveType){ if(moveType== GO_STRAIGHT){ }else if(moveType== TURN_LEFT){ } else if(moveType== TURN_RIGHT){ }else{ throw Exception(); } } }
  • 27. 문맥에 맞는 단어를 사용하라 18 이해하는데 시간을 소모하지 않기 위해 일관성 있는 단어를 사용하라 public class Vehicle{ public doublegetFuelRemaining(); public double retrieveDegreeOfTireAbrasion(); public doublefetchCurrentSpeed(); } public class Vehicle{ public double getFuelRemaining(); public double getDegreeOfTireAbrasion(); public double getCurrentSpeed(); }
  • 28. 클래스 이름을 일관성 있게 작성하라 19 클래스이름은 명사또는 명사구로 작성하라 : 클래스는 행위(멤버함수)의 주체로서 명사 또는 명사구로 표현됨
  • 29. 함수 이름을 일관성 있게 작성하라 20 함수 이름은 동사 또는 동사구로 작성하라 : 함수는 클래스가 행하는 행위로서 동사 또는 동사구로 표현됨 SRP Test: 클래스가 스스로 멤버함수 한다.
  • 30.
  • 31. 클래스나 모듈을 변경할 이유가 하나 뿐이어야 함
  • 32. 큰 클래스  작은 클래스 여럿작은 클래스와 협력해 시스템에 필요한 동작 수행SRP 21 ____________가 스스로 ___________ 한다. 각 줄의 첫 번째 공백에 모듈명을 적습니다. 두 번째 공백에 모듈의 메소드/함수 중 하나를 적습니다. 모듈의 모든 함수/메소드마다 이를 수행합니다. 각 줄을 소리 내어 읽습니다. 읽은 내용을 이해할 수 있습니까? 실제로 모듈의 함수/메소드가 의미하는 내용에 책임을 갖고 있어야 합니까?
  • 33. SRP(Single-Responsibility Principle) SRP Test 예 Automobile 모듈(혹은 클래스)에 SRP 적용하기 Automobile start(); stop(); changeTires(tires []); drive(); wash(); checkOil(); getOil(); SRP 준수 SRP 위반       
  • 35. 작게 만들어라 24 이상적인 블록(if문 While문)안의 내용은 한 줄 블록 안에서 다른 함수를 호출하도록 작성 public String renderPageWithSetupsAndTeardowns(PageDatapageData, booleanisSuite){ If(isTestPage) { WikiPagetestPage = pageData.getWikiPage(); StringBuffernewPageContent = new StringBuffer(); includeSetupPages(testPage, newPageContent, isSuite); newPageContent.append(pageData.getContent()); ….. } return pageData.getHTML(); } public String renderPageWithSetupsAndTeardowns(PageDatapageData, booleanisSuite){ If(isTestPage) { includeSetupAndTeardownPages(pageData, isSuite); } return pageData.getHTML(); }
  • 36. 인수를 적게 만들어라 25 이상적인 인수개수는 0개이고 그 다음은 1개이다. 3개 이상의 인수가 필요하다면 객체 사용을 고려해라 public void drawCircle(double a, double b, double radius); public void drawCircle(Point location, double radius); public class Point{ double x; double y; double getX(){ return x; } double getY(){ return y; } }
  • 37. 중복하지 마라 26 변경 시 여러 부분을 손대야 한다 오류가 발생할 확률이 높아진다 SearchThread 1162 ~ //QuataFree stOut.ullQuataFree = 0;//youyou2_ULONGLONG //File Name _stprintf((LPTSTR)stOut.szName, TEXT("%s"), files.GetFileName()); //File Path _stprintf((LPTSTR)stOut.szPath, TEXT("%s"), files.GetFilePath()); //File Path Rebuild Start szFilePath.Format(_T("%s"),stOut.szPath); nPoint = szFilePath.ReverseFind(_T('')); szFilePath = szFilePath.Left(nPoint); SearchThread 1314 ~ //QuataFree stOut.ullQuataFree = 0;//youyou2_ULONGLONG //File Name _stprintf((LPTSTR)stOut.szName, TEXT("%s"), files.GetFileName()); //File Path _stprintf((LPTSTR)stOut.szPath, TEXT("%s"), files.GetFilePath()); //File Path Rebuild Start szFilePath.Format(_T("%s"),stOut.szPath); nPoint = szFilePath.ReverseFind(_T('')); szFilePath = szFilePath.Left(nPoint);
  • 39. 주석대신 코드로 의도를 표현해라 28 코드만으로는 의도를 표현하기 힘들 때만 주석을 사용해라 그러나 될 수 있으면 코드로 표현해라 //플레그된 셀을 반환 public List<int[]> getList(){ //플래그된 셀을 List형태로 저장 List<int[]> list1 = new ArrayList<int []>(); for(int[] x : theList) { if(x[0] == 4) { //플래그 되어있다면 list1.add(x); // 리스트에 저장 } } return list1; } public List<Cell> getFlaggedCell(){ List<Cell> flaggedCells = new ArrayList<Cell>(); for(Cell cell : gameBoard){ if(cell.isFlagged()){ flaggedCells.add(cell); } } return flaggedCell; }
  • 40. 이런 주석은 삭제해야 합니다 29 없어도 되는 주석 PublicintgetDayOfMonth(){ private intdayOfMonth; return dayOfMonth; } /** The name */ Private String name; /** The version */ Private String version; /** The licenceName */ Private String LicenceName; /** * 달중 날짜를 반환한다. * *@return 달중 날짜 */ //달중 날짜
  • 41. 이런 주석은 삭제해야 합니다 30 이력 및 저자를 기록하는 주석 SCM 도구를 사용해서 해결할 것 /* 11-Oct-2001 작성자: 김민수 변경내용: 클래스를 다시 정리 하고 새로운 패키지 인 com.jrefinery.date로 옮김 02-Nov-2001: 작성자: 홍길동 변경내용: com.jrefinery.date로 옮김 NoitableDate클래스 제거 getDescription() 메소드 추가 */ l_hFile = CreateFile(strName, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_ALWAYS /*CREATE_ALWAYS*/,//youyou_2009_03_18_OPEN_ALWAYSFILE_ATTRIBUTE_NORMAL, NULL);
  • 42. 이런 주석은 삭제해야 합니다 31 주석 처리한 코드
  • 43. 아는 것과 행하는 것은 별개의 문제 SW 개발을 잘 하는 조직이란? 얼마나 많은 구성원이 얼마나 많은 Best Practice를 내재화하고 있는가의 문제 32 Clean Code, 왜 잘 안 되는가?
  • 44. 33 Clean Code 작성을 위해 조직이 해야 할 일 Do you use source control? Can you make a build in one step? Do you make daily builds? Do you have a bug database? Do you fix bugs before writing new code? Do you have an up-to-date schedule? Do you have a spec? Do programmers have quiet working conditions? Do you use the best tools money can buy? Do you have testers? Do new candidates write code during their interview? Do you do hallway usability testing?
  • 45. 정말분석/설계가 문제입니까? 개발자는 소스코드와 함께 결함도 만들어 냅니다. 그런 개발자는 작업환경이 만들어 냅니다. 조직과 개인의 피와 땀이 없이는 code의 고수는 없습니다. 34 Clean Code에 대한 생각
  • 46. 김진태 jtkim@swexpertgroup.com Twitter: @swexpertgroup 35 Contact