내가 공부하기 위한 공간 - [소프트웨어공학] 10 - 코딩
[구현]
코딩 : 구현 뿐 아니라 유지보수를 위한 작업도 필요
- 리팩토링작업 : 문제가 될만한걸 개선
- 상세설계에서 파악한 알고리즘의 의사코드나 흐름도로 작업
- 통일을 위해 코딩표준 마련
- 아키텍처 설계 결과 프레임워크 패키지와 응용 패키지 결정, 메서드 코딩(응용 완성 전 프레임 완성)
- 구현이 끝나면 인스펙션
- 테스트
- 클래스/패키지 릴리스, 응용시스템에 통합
<오류들>
메모리누수 : 메모리반환 없이 할당만 하여 메모리가 고갈되는 것
중복반환(free)
NULL을 포인트하고 있는 곳의 내용에 접근(초기화 안된 메모리에 접근)
별칭남용 : 주소가 다를것으로 예상한 것이 별칭으로 같은 값을 가지는 경우
인덱스 : 언더플로, 오버플로
수식예외 : 나누기0
하나차이 : 간단한 오류, 찾기 어려움
사용자 정의 자료형 : 언더플로, 오버플로
스트링 : 매개변수 NULL / NULL로 안끝남 / 필요공간부족
버퍼 오버플로 : 값을 고의로 크게주면 발생 > 리턴 주소로 해킹
동기화 : 병렬프로그램에서 발생, 찾기 어려움
- 데드락 : locking 모순일때 발생, 여러 스레드가 서로 자원 점유하고 릴리스 안한 상태
- 레이스컨디션 : 동시 접근으로 수행 결과가 실행 순서에 따라 다른것
- 모순있는동기화 : locking, unlocking 번갈아 하는 상황에서 발생
<표준>
명명규칙
- 카멜케이스
- 클래스, 인터페이스(명사, 명사구) : 대문자로 시작
- 메서드(동사구) : 소문자로 시작
- 변수(목적) : 소문자로 시작
- 패키지(명사) : 모두소문자
형식
- 들여쓰기, 괄호(블록)
문장, 수식
- 블록문장 : 제어흐름 구조에서 수식보다 블록문장 사용
- 수식 : 괄호로 명확한 순서
오류처리
- 매개변수 : 타입 제한으로 미리 배제 / 입력처리 전 정상으로 변환
- 입력 : 파라미터의 안전한 디폴트값 지정, 알림으로 호출자에게 잘못된 입력에 대한 처리책임 넘김
주석
- 프로그램 코드를 설명하거나, 코드의 동작 방식을 기록하거나, 코드에 대한 메모를 남기는 목적
- 읽는 대상은 기본을 바탕으로 하여 과도한 주석X
- 클래스불변조건 : 객체의 상태가 일관성을 유지하도록 하기 위해 항상 참이어야 하는 조건, 클래스의 속성에 대한 의미와 제약 모음
- 메서드주석 : 매개변수, 메소드의 일, 결과값에 대한 내용을 작성
- 클래스주석 : 클래스 용도에 대한 내용 작성
- 문장주석 : 논리구조앞에서 내용설명
[설계코딩]
<연관코딩>
연관은 클래스 간의 관계를 표현
설계에서는 단방향, 양방향, 다중성 등을 표현하며, 코드에서는 객체 참조나 리스트, 배열로 구현
<시퀀스다이어그램코딩>
시퀀스 다이어그램은 객체 간 메시지 흐름을 표현
이를 코드로 구현할 때는 메서드 호출 흐름에 주목
<상태다이어그램코딩>
상태 다이어그램은 객체의 상태 변화와 전이 조건을 보여줌
코드에서는 상태를 나타내는 enum + 상태 전이 메서드로 구현
[리팩토링]
정의 : 좋은 설계가 되도록 개선
- 디자인 개선, 이해 쉬움, 유지보수 도움, 효율적
- 소규모(단일 리팩토링)
- 테스트
- 전체가 작동하면 다음단계 전진, 안하면 문제해결/되돌려 작동 유지
<메서드추출>
중복 코드를 메서드로 만듦
<클래스추출>
단일책임원칙을 지키도록 만듦
<서브클래스추출>
특정 인스턴스에만 해당되는게 있다면 서브클래스로 내려보냄
<메서드이동>
정의된 클래스보다 다른 클래스의 기능을 사용하면 그쪽으로 옮김
<인터페이스추출>
인터페이스분리원칙을 지키도록 만듦
<템플릿메서드형성>
서브클래스의 비슷한 작업들을 슈퍼클래스로 올림
[코드스멜]
정의 : 코드 스멜은 컴퓨터 프로그래밍 코드에서 더 심오한 문제를 일으킬 가능성이 있는 프로그램 소스 코드의 특징
- 읽기 어려운 프로그램
- 중복된 로직을 가진 프로그램
- 실행중인 코드를 변경해야 하는 특별한 동작을 요구하는 프로그램
- 복잡한 조건문이 포함된 프로그램
[코드품질향상기법]
<코드인스펙션>
컴파일, 검사 후 시행
체크리스트 형태로 인스펙션 참여자들에게 배포
결함, 품질이슈 등을 찾아내고 확인
<정적분석>
정의 : 실행없이 원시코드 분석(컴파일, 코드작성)
코딩스타일, 일관성 검사
버그, 취약점 탐지
코드복잡도 분석
의존성관리, 라이브러리 검사
취약점찾기 : 소스코드, 바이너리코드, 컴파일된 코드를 분석
패턴매칭방법 : 미리정의된 취약점 패턴과 코드를 비교
구문분석/타입 검사방법 : 컴파일러구현에서 사용
데이터흐름분석방법
오염분석 : 외부입력을 추적하여 취약점 찾음
<테스트중심개발>
기능을 만들기 전에 테스트 코드를 먼저 작성하고,
그 테스트를 통과할 코드를 작성하는 개발 방식
개발 순서 (Red - Green - Refactor)
1. Red: 실패하는 테스트 작성
2. Green: 테스트를 통과하는 최소한의 코드 작성
3. Refactor: 코드 개선 (중복 제거, 정리 등)
장점
• 버그 감소
• 리팩토링 쉬움
• 코드 품질 향상
• 테스트가 문서 역할도 함
단점
• 초기 개발이 느릴 수 있음
• 테스트 작성이 익숙하지 않으면 어렵게 느껴짐
<페어프로그래밍>
두 명이 함께 한 컴퓨터로 코드 작성하는 협업 방식
- Driver: 코드 작성
- Navigator: 아이디어 제안, 코드 검토
장점
• 버그 감소
• 코드 품질 향상
• 서로 배우며 성장
• 집중력 향상
단점
• 인력 낭비처럼 보일 수 있음
• 궁합이 중요
• 오래 하면 피로