2015년 1월 11일 일요일

[ 좋은 코딩 습관 기르기 Code Complete] Chapter 10. 변수 정리


  
10.3 변수의 초기화에 대한 지침
    
 부적절한 초기화와 관련된 문제는 예상치 못한 초기값을 변수가 포함하고 있기 때문이다. 이러한 문제는 다음과 같은 이유로 발생할 수 있다.

  • 변수에 값을 할당한 적이 없다. 이 값은 프로그램이 시작했을 때 해당 메모리 공간에 원래 있던 비트 값이 반영된 것이다.
  • 변수에 있는 값이 더이상 유효하지 않다. 어떤 위치에 변수의 값을 할당했지만, 그 변수가 더 이상 유효하지 않다.
  • 변수의 일부에는 값을 할당하고 나머지 부분에는 값을 할당하지 않았다. 

다음과 같은 문제를 해결하기 위한 지침

  • 변수가 선언될 때 초기화 한다 : 이는 방어적인 프로그래밍 방법, 초기화 오류를 막을 수 있는 좋은 방법이다. 
  • 변수가 처음 사용되는 곳과 근접한 위치에서 초기화하고 정의한다. 
  • 가능하면 final이나 const 를 사용한다 : 이는 변수가 초기화된 후에 다른 값으로 할당되는 것을 막을 수 있다. 
  • 카운터와 누산기를 주의한다 : 일반적인 오류는 카운터나 누산기를 다음 재사용 전에 초기화 하는 것을 잊기때문에 나타난다
  • 클래스의 멤버 데이터를 생성자에서 초기화 한다 : 루틴의 변수를 각 루틴 내에 초기화 하는 것처러 ㅁ클래스의 데이터도 생성자에서 초기화 되어야 한다. 
  • 다시 초기화 할 필요가 있는지 검사한다
  • 일단 명명된 상수를 초기화하고 실행코드로 변수를 초기화 한다. -?
  • 모든 변수들을 자동으로 초기화 해주는 컴파일러 설정을 사용한다.
  • 컴파일러 경고 메시지 활용
  • 입력매개변수의 타당성 검사
  • 부적절한 포인터를 검사하기 위해 메모리 접근 도구를 사용한다 
  • 포르그램 시작시 작업 메모리 초기화한다 


10.4 범위

  •  변수에 대한 참조를 지역화하라 : 변수에 대한 참조를 가까이 유지하는 것은 프로그램의 가독성을 향상시키는데 좋다. 얼마나 가까이 모여있는지를 측정할 수 있는 방법중 하나는 "폭(span)"을 계산하는 것이다. 즉 폭이 짧을 수록 좋다.
  •  변수의 "수명"을 가능한 짧게 유지한다 - 변수의 수명은 변수가 처음 참조되는 명령문에서 시작하고, 변수가 참조되는 마지막 명령문에서 끝난다. "긴 수명"은 변수가 여러 명령들에 걸쳐 살아있다는 것을 의미하고 "짧은 수명"은 변수가 몇 개의 명령문 동안에만 살아 있다는 것을 의미한다.  폭과 같이 수명에 관한 목표는 숫자를 낮추는 것, 변수의 수명을 짧게 유지하는 것이다. 이에 관한 이득은 1) 취약성의 창을 줄일수 있다. 즉 변수의 값을 변경하는 위치 사이에서 변수가 부정확하게 또는 부주의하게 변경되는 가능성을 줄인다. 2)초기화 오류를 줄인다. 3) 가독성을 높인다 4) 큰 루틴을 작은 루틴으로 나눌때 용이하다. 

즉 폭과 수명을 최소화 시키는 것이 좋다. 범위를 최소화 하기 위한 일반적인 지침을알아보자. 


  • 루프에서 사용되는 변수는 루프를 포함하고 있는 루틴의 시작에서가 아니라 루프 바로 앞에서 초기화한다
  • 변수를 사용하기 전까지 변수에 값을 할당하지 않는다
  • 연관된 명령문들은 그룹화 한다(같은 변수를 사용하는 것 끼리 그룹화...)
  • 필요한 경우에만 변수의 범위를 늘린다. - 변수의 범위를 최소화 하는 방법은 변수를 가능한 지역화 하는 것이다. 클래스 변수를 전역변수로 바꾸는 것보다 전역 변수를 클래습 변수로 바꾸는 것이 더 어렵다. 또한 protected 데이터 멤버를 private 멤버로 바꾸는 것이 더 어렵다. 
  •  *의문이 들때는 가능한 가장 작은 범위를 선택하도로고 하고, 특정한 루프로 제한하고, 개별적인 루틴으로 제한하고, 클래스에 대해서 private를 그 다음이 protected를 그 다음이 package를 그리고 최후에 수단에만 전역을 사용한다*

10.5 지속성

지속성은 데이터 수명을 나타내는 다른 말로 변수들은 다음과 같은 지속성을 가질 수 있다.

  • 특정한 코드 블록이나 루틴에서만 살아남는 경우 : 지역변수
  • 허용한 동안 살아남는 경우 : 자바에서 new로 생성된 변수는 가비지 컬렉션 (garbage collection)이 발생할 때까지 살아남는다
  • 프로그램이 종료할 때까지 살아남는 경우 : 대부분의 전역변수, 정적변수(static변수) 
  • 영원히 살아남는 경우 : 데이타 베이스에 저장한 값. 

10.6 바인딩 시간 

바인딩 시간 (Binding Time)은 변수와 값이 서로 연결되는 시간을 의미한다. 
변수와 값이 코드가 작성될때? 컴파일 될때? 로드될때? 프로그램이 실행될 때 연결 되는가?

가능한 바인딩 시간을 늦추는 것이 복잡성은 늘어나지만 코드의 유연성이 높아지기 때문에 좋다.  (반인딩 시간이 이를 수록 유연성과 복잡성은 낮아진다)

10.8 변수를 한 목적으로만 사용하는 방법 

  • 변수는 한 목적으로만. 
  • 선언된 변수가 모두 사용되는지 확인.

** 변수 사용시 Check List **

변수초기화
  1.  각 루틴이 입력 매개변수의 타당성을 검사하는가?
  2. 변수가 처음 사용된 곳에 가까운 위치에서 선언되었는가?
  3. 가능하면 변수가 선언될 때 초기화 하고 있는가?
  4. 3번이 불가하다면 변수가 처음 사용된 곳과 가까운 위치에 변수를 초기화 했나?
  5. 카운터와 누산기가 적절하게 초기화되고, 필요할 경우 사용될 때마다 다시 초기화되는가?
  6. 변수가 반복적으로 실행되는 코드에서 적절하게 초기ㅗ하 되는가?
  7. 코드를 컴파일 할때 컴파일 경고가 발생하지 않는가? 그리고 모든 경고를 활성화 하였는가?
데이터 사용에 대한 일만적인 문제

  1. 모든 변수가 가능한 작은 범위를 갖는가?
  2. 변수에 대한 참조가 폭과 전체 수명의 관점에서 가깜께 유지되는가?
  3. 제어구조가 데이터 형과 일치하는가?
  4. 선언된 모든 변수가 사용되는가?
  5. 모든 변수가 적절한 시간에 바인딩 되는가? 
  6. 각 변수가 오직 하나의 목적을 갖고 있ㄴ는가?
  7. 각 변수의 의미가 명확한가?




[출저:Code Complete, SteveMcConnel]

 




댓글 없음:

댓글 쓰기