반응형
(기본적으로 정말로 코딩하는 방법에 대해서는 언급하지 않음)
코딩 로드맵
- SW 제품의 품질은 원시 코드에 모두 귀결
코딩 작업
- 작업과정
- 원시코드를 같은 스타일로 만들기 위하여 코딩 표준을 만든다.
- 아키텍처 설계 결과 프레임워크 패키지와 응용 패키지를 결정
- 클래스 구현이 끝나는 대로 인스펙션
- 인스펙션 : 검사(테스팅과는 다름)
- 소스 코드를 검사하는 것(텍스트 자체를)
- 비슷한 단어 : 리펙토링
- 리펙토링 : 기능 추가, 개선 없이 소스코드의 구조를 개선
- 인스펙션 : 검사(테스팅과는 다름)
- 클래스 단위로 테스트
- 클래스나 패키지를 릴리스 하여 응용 시스템으로 통합
자주 발생하는 오류
1. 메모리 누수
- 메모리가 프리되지 않고 프로그램에 계속 할당되는 현상
- 장기로 수행되는 시스템에는 치명적인 영향을 줄수 있음
- C언어의 malloc은 할당후 마지막에 할당한 영역을 풀어줘야함
2. 중복된 프리선언
- 프로그램 안에서 사용하는 자원은 먼저 할당되고 사용 후에는 프리로 선언
- 이미 프리로 선언된 자원을 또 다시 프리로 선언하는 경우 오류
- malloc후 free로 할당자원을 풀었는데 또 free를 하면 오류 발생
- 반납한 경우 해당 메모리에 접근 불가능한테 free를 통해 또 접근하면 오류
3. NULL의 선언
- NULL을 포인트 하고 있는 곳의 콘텐츠를 접근하려고 하면 오류
- 어떤 영역에 접근할 때 해당 부분이 할당받았는지 확인 후 사용해야함
- 이러한 오류는 시스템을 다운시킴
4. 별칭의 남용
- 별칭(alias)은 많은 문제를 야기
- 원래 a를 b가 가리켰는데 새로운 c도 b를 가리키게 되는 경우 a와 c가 둘다 b를 가리키게 됨
- 서로 다른 주소값을 예상하고 사용한 두 개의 변수의 값이 별칭선언으로 인하여 같은 값이 되었을 때 오류 발생
5. 배열 인덱스 오류
- 배열 인덱스가 한도를 벗어나면 예외 오류
- 배열 인덱스가 음수를 갖는 경우
6. 수식 예외 오류
- 0으로 나누는 오류
- 부동 소수점 예외 오류
printf("%.20f", 1.0/10.0*100);
=> 0.10000000000000000555
7. 하나 차이에 의한 오류
- 1로 시작하여야 할 것을 0으로 시작한 경우
- <= N으로 써야할 곳에 < N 을 쓴 경우
8. 사용자 정의 자료형 오류
- 오버플로우나 언더 플로 오류가 쉽게 발생
- 사용자 정의 자료형의 값을 다룰 때는 특별한 주의
- 디버깅 : 버그를 잡는 것(인덱스 오류 잡기)
typedef enum{A, B, C, D} grade;
void foo(grade X)
{
int i, m;
i = GLOBAL_ARRAY[x-1]; //Underflow possible
m = GLOBAL_ARRAY[x+1]; //Overflow possible
}
9. 스트링 처리 오류
- strcpy, sprint 등 많은 스트링 처리 함수가 있다
- 매개변수가 NULL
- 스트링이 NULL로 끝나지 않았을 경우
- source매개변수의 크기가 destination매개변수보다 크지 않을경우
10. 버퍼 오류
- 프로그램이 버퍼에 복사하여 입력받으려 할때 입력값을 고의로 아주 크게주면 스택의 버퍼에 오버플로 발생
- 버퍼의 사이즈를 파악을 못해서 오버플로우가 발생 가능
- 버퍼 오버플로를 이용하여 해커들이 자신의 코드를 실행시킬 수 있음
void mygets(char *str) {
int ch;
while ( ch = getchar() != ‘\n’ && ch != ‘\0’ )
*(str++) = ch;
*str = ‘\0’;
}
main() {
char s2[4];
mygets(s2);
}
11. 동기화 오류
공통 자원을 접근하려는 다수의 스레드가 있는 병렬 프로그램에서 흔히 발생함
데드락(deadlock)
- 다수의 스레드가 서로 자원을 점유하고 릴리스 하지 않는 상태
- 한 번 걸리면 껐다 켜야됨
레이스 컨디션
- 두개의 스레드가 같은 자원을 접근하려 하여 수행결과가 스레드들의 실행순서에 따라 다르게 되는 경우
모순이 있는 동기화
- 공유하는 변수를 접근할 때 로킹과 언로킹을 번갈아하는 상황에서 오류가 많이 발생
코딩 표준
명명 규칙
카멜 케이스
- Java 클래스, 필드, 메소드 및 변수 이름
- 여러단어를 함께 붙여쓰되 각 단어의 첫 글자는 대문자
- 클래스만
- 나머지는 첫 글자는 소문자 이후 단어가 새롭게 나올때 마다 대문자
- thisIsAnExample
상수는 모두 대문자로
- public static final double SPEED_OF_LIGHT= 299792458;
- // in m/s
클래스와 인터페이스 이름
- 명사 또는 명사구이며 대문자로 시작
- interface AqueousHabitat { ... }
- class FishBowl implements AqueousHabitat { ... }
메서드 이름
일반적으로 소문자로 시작하는 동사구
- public void setTitle(String t) { ... }
함수 이름은 일반적으로 값을 설명하는 명사구로
- public double areaOfTriangle(int b, int c, int d) { ... }
필드(예를 들어 title)의 값을 접근하여 리턴하는 함수는 “get”
- public String getTitle() { ... }
조건을 묻는 Bool 함수의 이름은 대개 “is”로 시작
- public boolean isEquilateralTriangle(int b, int c, int d) { ... }
변수 이름
- 일반적으로 소문자로 시작
- 용도에 대한 힌트를 제공해야
- 모호한 이름을 사용하지 않아야
- 변수 이름의 길이
- hypotenuseOfTriangle= 6 * (2 + hypotenuseOfTriangle) + 7 / hypotenuseOfTriangle - hypotenuseOfTriangle;
- x= 6 * (2 + x) + 7 / x - x;
- 대상이 사용된 위치를 고려
- 매개 변수: 되도록 짧게
- 필드변수: 가능한 길고 의미가 담겨있어야
패키지 이름
- 일반적으로 명사단어를 이용하고, 모든 글자가 소문자로 명명함
문장과 수식
- 문장이나 수식은 메소드나 클래스로 패키지화
- 블록 문장
- 제어구조가중첩되었을때생기는혼란을줄일수있음 if (x >= 0)
if(x>=0) if (x > 0) positiveX(); else // Oops! Actually matches most recent if! negativeX()
- 제어구조가중첩되었을때생기는혼란을줄일수있음 if (x >= 0)
- 수식
- 괄호를 이용하여 오퍼레이션의 순서를 명확히 // Extraneous but useful parentheses.
- int width = (( buffer * offset ) / pixelWidth ) + gap;
- a
*
= b+ c == a = a*
(b+c)
오류 처리
- 잘못된 데이터를 어떻게 다룰 것인가
- 예: 실제로는 없는 계좌번호
- 매개변수 오류
- 예: evaluate()라는 메소드가 매개변수로 ‘car’, ‘truck’, ‘bus’만을 받아들인다
- evaluate( String vehicleP )
- evaluate( SpecializedVehicle vehicleP )
- 예: evaluate()라는 메소드가 매개변수로 ‘car’, ‘truck’, ‘bus’만을 받아들인다
- 입력오류방지
- 리스트박스
- 디폴트값을지정
주석
- 주석
- 디버깅하는 동안 얻을수 있는 도움
- 다른 사람들이 프로그램을 이해하기 쉽도록 함
- 주석 다는법
설계에서 코드 생성
연관의 구현
- 클래스 A와 B사이에 1대 1연관 관계가 있다
- 1대 1 연관
- A에서 B의 함수를 호출할 필요가 있다면 A가 B에 대한 참조를 갖도록 구현
- A 클래스 내부에 B 를 new를 사용해서 구현
- 반대로 B에서 A의 함수를 호출할 필요가 있다면 B가 A에 대한 참조를 갖도록 구현
- A에서 B의 함수를 호출할 필요가 있다면 A가 B에 대한 참조를 갖도록 구현
- 1대 다
- 클래스 A에서 인스턴스 B의 메소드를 호출할 것이 있다면 클래스A가 클래스 B의 참조를 모음으로 가지고 있도록 구현
- 다대 다
- 중간에 연관 클래스를 도입하여 1대 다의 관계로 바꾸어 설계하기도 한다
시퀸스 다이어그램의 구현
- A 객체에서 B 객체로 나가는 메시지가 표시되어 있다면
- 메소드는 B 클래스에 정의
리팩토링
- 결과의 변경 없이 코드의 구조를 재조정
- 이미 존재하는 코드의 디자인을 안전하게 향상시키는 기술
- 가독성을 높이고 유지보수를 편하게 하기 위한것
코드스멜
- 프로그램에 대한 작업을 어렵게 만드는 것
- 읽기 어려운 프로그램
- 중복된 로직을 가진 프로그램
- 실행 중인 코드를 변경해야 하는 특별한 동작을 요구하는 프로그램
- 복잡한 조건문이 포함된 프로그램
소프트웨어를 보다 쉽게 이해할 수 있고 적은 비용으로 수정할 수 있도록 겉으로 보이는 동작의 변화 없이 내부구조를 변경하는 것
- 단일책임의 원리와도 직결
- 여러 클래스를 동시에 수정
- shape라는 인터페이스로 유사한 기능을 모으고 rectangle, circle 등등의 클래스로 직접 구현
- 상속
- 부모와 자식에서 자식이 부모의 data, method이외의 +@가 있어야 상속의 의미가 있음
반응형
'소프트웨어 공학' 카테고리의 다른 글
소프트웨어 공학 11(유지보수) (0) | 2023.06.28 |
---|---|
소프트웨어 공학 10(테스트) (0) | 2023.06.28 |
소프트웨어 공학 8(설계) (0) | 2023.06.12 |
소프트웨어 공학 7(설계) (0) | 2023.06.12 |
소프트웨어 공학 6(설계) (0) | 2023.05.31 |