9-1 코딩 작업
1. 코딩 작업 과정(5)
- 코딩 표준을 만들기
- 프레임워크 패키지와 응용 패키지 결정
- 클래스 구현 끝나는 대로 인스펙션
- 클래스 단위로 테스트
- 응용 시스템으로 통합
2. 자주 발생하는 오류(11)
① 메모리 누수
: 메모리가 프리되지 않고 프로그램에 계속 할당되는 현상
② 중복된 프리 선언
: 이미 프리로 선언된 자원을 한번 더 프리로 선언
③ NULL의 사용
: NULL을 포인트하고 있는 곳의 콘텐츠를 접근. 이는 시스템 다운 시킴.
④ 별칭의 남용
: 서로 다른 주소 값을 예상한 두 변수의 값이 별칭 선언으로 같은 값이 되었을 때 오류 발생.
ex. strcat(src, destn)
⑤ 배열 인덱스 오류
: 배열 인덱스가 한도를 벗어나거나 음수값을 갖는 경우
⑥ 수식 예외 오류
: 0으로 나누는 오류, 변동 소수점 예외 오류
⑦ 하나차이에 의한 오류
: 이는 컴파일러나 테스트 도구에 의해 검출 안되는 경우가 많음
- 0으로 시작하여야 할 것을 1로 시작
- <=N으로 써야할 곳에 <N을 쓴 경우
⑧ 사용자 정의 자료형 오류
: 오버플로우나 언더플로우 오류가 쉽게 발생.
⑨ 스트링 처리 오류
- 매개변수가 NULL
- 스트링이 NULL로 안 끝난 경우
- Source매개변수보다 destination 매개변수가 크지 않을 경우(strcpy)
⑩ 버퍼 오류
: 프로그램이 버퍼에 복사해 입력 받으려 할 때 입력값을 아주 크게 주면 스택의 버퍼에 오버플로 발생. 이를 이용해 해커들이 자신 코드 실행 가능.
①① 동기화 오류
: 공통 자원을 접근하려는 여러 스레드가 있는, 병렬 프로그램에서 흔히 발생.
- 데드락: 다수의 스레드가 서로 자원을 점유하고 릴리즈 안 하는 상태
- 레이스 컨디션: 두 스레드의 실행순서에 따라 실행결과가 다른 경우
- 모순이 있는 동기화
9-2 코딩 표준
1. 코딩 표준
: 대표적인 기준은 간결하고, 읽기 쉬운 것
2. 명명 규칙(5)
- 카멜 케이스: java클래스, 필드, 메소드 및 변수 이름. ex. thisIsAnExample
- but, 상수는 모두 대문자로: ex. double SPEED_OF_LIGHT= 299792458;
- 클래스와 인터페이스 이름:
- 명사(구), 대문자로 시작. ex. interface AqueousHabitat
- 메서드 이름:
- 소문자로 시작하는 동사구
- 값을 설명하는 명사구
- 필드의 값을 접근하여 리턴하는 함수는 "get"
- 조건을 묻는 부울 함수 이름 시작은 "is"
- 변수 이름:
- 소문자로 시작
- 용도에 대한 힌트 제공해야
- 모호한 이름 사용 않아야
- 매개변수: 되도록 짧게(x, i ...)
- 필드변수: 가능한 길고 의미가 담겨 있게
- 패키지 이름
- 모두 소문자, 명사
- 헝가리안 표기법
- 변수 이름 앞에 타입 구별
- 변수의 목적 또는 변수가 무엇인지에 대한 힌트를 줌
3. 형식(2)
- 들여쓰기와 괄호:
- 들여쓰기 잘하기, 괄호 하나로 줄 낭비 않기. ex. }else{
- 블록은 항상 괄호를 사용
- if 문에 꼭 괄호 쓰기
- 키워드와 괄호 사이에 공백 두기. 올바른 예, 틀린 예 ex. if (a == null), if(a==null)
4. 문장과 수식(2)
: 프로그램에서 반복되는 문장이나 수식은 패키지화.
- 블록 문장 - if문과 같은 제어구조가 중첩되었을 때 혼란이 있을 수 있음.(else가 어떤 if에 해당?)
- 수식 - 괄호를 이용해 오퍼레이션 순서 명확히
5. 오류처리(2)
- 입력 오류 방지 - 잘못 입력될 것을 방지하기 위해 디폴트값 처리, 예외 처리.
- 매개변수 오류
6. 주석
: 디버깅에 도움, 다른 사람들이 프로그램 이해하기 쉽도록함.
- 과도한 주석은 피하기
- 클래스 불변 조건: 클래스의 속성에 대한 의미와 제약 모음. ex. private int hr; // The hour of day
- 메서드 주석
- Javadoc 스펙 - 메서드가 하는 일 설명
- /***/ - 모든 매개변수 언급
- 클래스 주석: 파일의 시작 부분에클래스 용도를 설명하는 주석 포함.
- 문장 주석: 논리적 단위로 그룹화해 주석 달기.
9-3 설계에서 코드 생성
1. 연관의 코딩
- 상황: 클래스 B는 클래스 A의 집합으로 이루어짐.
A의 인스턴스가 B의 인스턴스의 일부라는 사실을 나타내기 위해 B에서 A를 지칭하는 참조가 필요함.
포인터를 사용해 이 연관관계를 구현하는 방법은 아래와 같음.
- 1:1 연관 - A에서 B의 함수를 호출할 필요가 있으면, A가 B에 대한 참조를 갖도록 구현.
- 1:N 연관 - A에서 B의 함수를 호출할 필요가 있으면, A가 B에 대한 참조를 갖도록 구현.
- N:N 연관 - 중간에 연관 클래스를 도입해 1:N 관계로 바꿔 설계.
2. 시퀀스 다이어그램의 코딩
: A 객체에서 B객체로 나가는 메시지 표시가 있으면 메소드는 B클래스에 정의!
9-4 리팩토링
1. 리팩토링
: 보다 쉽게 이해하고, 적은 비용으로 수정할 수 있도록, 동작의 변화없이, 내부 구조를 변경하는 것.
2. 리팩토링 목적(4)
- 소프트웨어 디자인 개선.
- 소프트웨어를 이해하기 쉽게 만듦.
- 버그를 찾는데 도움
- 프로그램을 빨리 작성하도록 도움.
3. 리팩토링 과정(4)
- 소규모의 변경 - 단일 리팩토링
- 코드가 전부 잘 작동되는지 테스트
- 전체가 잘 작동하면 다음 리팩토링 단계로 전진
- 작동하지 않으면 문제 해결하고, 리팩토링 한 것을 undo해 작동되도록 유지.
3. 코드스멜(4)
: 프로그램 작업을 어렵게 만드는 것
- 읽기 어려운 프로그램
- 중복된 로직을 가진 프로그램
- 실행 중인 코드를 변경을 요구하는 프로그램
- 복잡한 조건문이 있는 프로그램
9-5 코드 품질 개선 기법
1. 코드 인스펙션
: 프로그램을 읽어보고 눈으로 결함을 찾아내는 것.(ex. 효율성, 코딩 표준 준수 여부)
- 결함 타입(4): 로직 문제/컴퓨팅 문제/인터페이스 문제/ 데이터 처리
2. 정적 분석
: 수행되지 않는 데드코드가 없는지, 선언되고 사용 안 한 변수가 없는지 검사.
- 방법(2)
- 비정상적, 원치 않는 패턴 찾기: 자료 흐름, 논리 흐름 분석
- 자료 변칙: 자료 흐름도를 분석해 패턴을 찾는것.
- 사족(redundant): 컴파일러에 의해 검출 안됨. 중된 배정문, 데드 코드 등
- 고장을 일으킬 코드 상에 존재하는 결함 직접 찾기
3. 페어 프로그래밍
: 애자일 방법에서 프로그래밍과 테스팅을 담당하는 두 사람이 머신을 공유하며 코딩
- 같은 컴퓨터 사용해 프로그램.
- 성공의 기쁨을 나눌 수 있어 프로그래밍이 재밌음
- 팀의 소통 향상
- 상호 이해와 협력 향상
- 더 간단하고 효율적인 해법을 만들 수 있음.
- 테스트 중심개발(Test Driven Development)
'Computer Science > Software Engineering' 카테고리의 다른 글
[소공] 11장 유지보수 (0) | 2023.12.14 |
---|---|
[소공] 7장 아키텍쳐와 패턴 (0) | 2023.12.14 |
[소공] 6장 설계 원리 (0) | 2023.10.28 |
[소공] 5장 요구 모델링 (0) | 2023.10.27 |
[소공] 객체지향 방법론과 UML (1) | 2023.10.13 |