그들은 우리가 원하는 대로 돌아가는 기계가 나오리라 기대한다. 우리가 그런 기계를 만드는 방법을 찾아내이라 믿는다. 요구사항을 애매하게 주어도 우리 의도를 정확히 꿰뚫어 프로그램을 완벽하게 실행하는 그런 기계말이다.
AI가 코딩을 하는 시대가 도래했지만, 이는 개발을 편리성을 증가시키지, 개발자의 필요가 사라지지 않는다.
좋은 코드를 사수하는 일은 바로 우리 프로그래머들의 책임이다.
클린코드를 작성하는 프로그래머는 빈 캔버스를 우아한 작품으로 바꿔가는 화가와 같다.
저명한 프로그래머들의 클린 코드에 대한 의견들이 나열되며, 이 중 중요하다고 생각하는 포인트들만 정리했다.
'집합에서 항목 찾기'의 경우, 정보가 데이터베이스인지, 해시 맵인지, 배열인지에 관계없이 반복적으로 사용되는 기능이다. 추상 클래스나, 추상 메소드로 묶어 실제 구현을 감싸는 방식으로 진행한다고 한다. 제너릭을 사용하면, 더 쉽고 직관적이게 구현이 가능할 것이라 생각한다.
캠프장은 처음 왔을 때보다 더 깨끗하게 해놓고 떠나라.
시간이 지날수록 코드가 좋아지는 프로젝트...!
int d; //경과 시간(단위: 날짜수)
int elapsedTimeInDays;
int daysSinceCreation;
주석없이 변수명에서 의도를 들어내라. (elapsed, In, Since)
지뢰 찾기 게임에서 다음의 코드를 아래 처럼 수정한다.
public List<int[]> getThem() {
List<int[]> list1 = new ArrayList<int[]>();
for (int[] x : theList)
if (x[0] == 4)
list1.add(x);
return list1;
}
//수정후
public List<Cell> getFlaggedCells() {
List<Cell> flaggedCells = new ArrayList<Cell>();
for (Cell x : gameBoard)
if (cell.isFlagged())
flaggedCells.add(cell);
return flaggedCells;
}
//Class Cell
int[] cell;
private boolean isFagged() {
if (cell[STATUS_VALUE] == FLAGGED)
return true;
return false
}
theList? x[0]가 가지는 의미? 4의 의미? list1의 의미?
int[]를 Cell로 숨기고 isFlagged로 추상화
public static void copyChars(char[] a1, char[] a2)
public static void copyChars(char[] source, char[] destination)
함수 내부를 안보더라도, 메소드의 의도를 파악할 수 있다.
genymdhms(generate date, year, month, day, hour, minute, second) -> generationTimeStamp
숫자, 문자 e와 같이 텍스트 코드에서 쉽게 눈에 띄지 않는 경우 문제점이 있다. string final static으로 따로 빼서 상수로 정의하고, 변수명으로 e와 같은 경우를 지양하고 의도를 들어내라.
멤버 변수 m_, 인터페이스 IinterfaceName 와 같은 인코딩은 불필요한 정신적 부담이며, 현대적인 IDE에서는 사용하지 않는다.
클래스는 명사(구), 메소드는 동사(구)가 적합.
똑같은 메소드를 클래스마다 fetch, retrieve, get 제각기 부르면 혼란스럽다.
마찬가지로 controller, manager, driver를 섞어 쓰면 혼란스럽다.
state만을 봤을 때, 주소의 일부를 확인하는 데 시간이 걸린다. addr접두어를 추가하거나, Address라는 클래스를 생성하여 위임하는 것도 좋은 방법이다.
그렇다고 모든 클래스의 이름을 GSD로 시작하겠다는 것도 바람직한 생각은 아니다. 추후에 IDE작업할 때, 나열되는 GSD들의 목록을 보게됬을 때의 빡침은 상상하기도 싫다.
인트로 부분이라 쉽게 읽혔다. 우테코를 준비하면서, 고민을 많이했던 이름 짓기 부분인데, 그 때의 고민들의 명확한 기준들을 제시해준 것 같다. 앞으로의 책의 내용들이 더욱 기대된다.