[SE] 8장 코딩

8장 코딩

6,7장의 아키텍처 설계와 상세 설계에 따라 프로그램을 작성하는 과정

코딩 vs. 프로그래밍

좋은 프로그래밍이란

 - 읽고 이해하기 쉽고
 - 프로그램 크기, 실행 시간, 소요 메모리가 적은 프로그램을 작성

프로그래밍 단계

 - 구현
 - 리팩토링

작성된 프로그램의 품질을 높이는 방법

 - 인스펙션
 - 정적 분석 도구 활용 (Static analysis)
 - 페어 프로그래밍, 테스트 주도 프로그래밍


8.1 코딩 원리

 - 코딩 vs. 프로그래밍

   : 분리하여 구현할 수 있는 작은 단위를 프로그래밍 하는 작업

 - 전 단계의 문서들, 아키텍처 설계서, 요구 분석서 등을 참조하여
   상세 설계나 사용자 지침서와 일치하도록 코딩


8.1.1 코딩 과정

 - 코딩 표준을 정함
 - 각 클래스 요구 사항과 상세 설계를 반영하여 메소드를 구현
 - 인스펙션
 - 클래스 단위로 테스트
 - 통합


8.1.2 코딩 오류의 종류

 - 메모리 누수
 - malloc/free 짝이 맞지 않는 문제
 - NULL 참조
 - Alias(별칭)으로 인한 오류
   cf. 포인터, 참조
 - 배열 인덱스 오류
 - 수식 예외 오류 : 0으로 나누기, NaN  (IEEE Floating-Point 표현)

   public class Main {
      public static void main(String[] args) {
    System.out.println(0.0 / 0.0);
    System.out.println(0 / 0);
      }
   }

 - off(set)-by-one 에러
 - 문자열 처리 오률
 - 버퍼 오버플로우
 - 동기화 오류 : deadlock, race condition


8.1.3 구조적 프로그래밍

 - Goto를 사용하여 제어 흐름을 표현한 프로그램은
   순차, 선택, 반복문으로 어떠한 Goto문도 표현 가능

 - 블록 : 단일 입구, 단일 출구의 문장들

 - Top-down (하향식) 프로그램 구조

 - Goto의 변형 : break, continue


8.1.4 정보 은닉 (Information Hiding)

 - 내부 표현을 외부에서 알지 못하도록 숨기는 것
   (또는 현재 결정하기 어려운 설계 요소를 내부에 숨기는 아이디어)

 - 클래스의 private 멤버


8.1.5 중복 회피


 - 중복을 회피해야 하는 이유

 - 경우에 따라 중복이 필요한 이유


8.1.6 Principles of least knowledge

 - 디메테르의 법칙

 - 교재 예제




8.2  코딩 스타일

 - 여러 사람이 참여하는 프로젝트의 소스 코드를 일관된 스타일로 유지

 - cf. 시큐어 코딩 (Secure Coding)


8.2.1 명명 규칙


8.2.2 포인터와 레퍼런스

 - C : 포인터  int *

 - C++ : 포인터와 레퍼런스 int *  vs. int &

    ==> 포인터와 레퍼런스의 유사점과 차이점
    ==> 레퍼런스 사용을 더 추천

 - Java : 레퍼런스 Integer


8.2.3 자료형


8.2.4 문장과 수식

 - 자주 반복되는 수식은 메소드로 정의해서 사용 (cf. 리팩토링)

 - == vs. equals


8.2.5 오류 처리

 - 더 구체적인 타입 (부모 클래스 타입 보다 자식 클래스 타입)을 사용하여
   오류 발생을 원천적으로 방지

 - 입력 처리 전에 미리 정상적인 값으로 변경하는 방법


8.2.6 코드 문서화

 - 주석으로 코드가 어떤 작업을 하는지를 설명하는 것이 아니라
   왜 그런 작업을 수행하는지 설명해야 한다.


8.3 UML과 코딩

 - 클래스 다이어그램과 코딩

 - 보조 자료 참고


8.4 리팩토링

 - 기존 코드의 구조를 변경하여
   외부에서 보는 동작의 변화는 없지만
   보다 쉽게 이해하고 유지 보수가 쉬운 형태로 변환하는 것

 - 코드 스멜 ==> 리팩토링 적용

 - 리팩토링 목록


8.5 코드 품질 향상 기법

 - 코드 인스펙션 (Fagan이 처음으로 제안)

 - 정적 분석

 - 페어 프로그래밍

   : 한 명은 코딩, 다른 한 명은 프로그램 리뷰 또는 테스팅