9. 코딩

2022. 12. 20. 22:50Others/SE

코딩

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

설계 명세에 나타낸 대로 요구를 만족할 수 있는 프로그래밍

 

언어

COBOL(사무 응용 분야), Fortran(과학 및 공학 분야), C 언어(시스템 프로그래밍, 임베디드 응용), Pascal(프로그래밍 교육), Modula-2(시스템 프로그래밍), Ada(실시간 처리 응용), Lisp,Prolog(인공지능), HTML,ASP,PHP,JSP(웹 프로그래밍), JAVA(인터넷 프로그래밍), Android,Object0C(모바일 프로그래밍), Scratch(교육용)

 

코딩 오류

메모리 누수, 중복된 프리 선언, NULL의 사용, 별칭의 남용, 배열 인덱스 오류, 수식 예외 오류, 하나 차이에 의한 오류, 사용자 정의 자료형 오류, 스트링 처리 오류, 버퍼 오류, 동기화 오류

 

메모리 누수

메모리가 프리 되지 않고 프로그램에 계속 할당되는 현상

오래 수행되는 시스템에는 치명적인 영향

 

중복된 프리 선언

프로그램 안에서 사용하는 자원은 먼저 할당되고 사용 후에는 프리로 선언

이미 프리로 선언된 자원을 또 다시 프리로 선언하는 경우 오류

 

배열 인덱스 오류

배열 인덱스가 한도를 벗어나면 예외 오류 발생

배열 인덱스가 음수 값을 갖는 경우 오류 발생

 

사용자 정의 자료형 오류

오버플로우나 언더플로우 오류가 쉽게 발생

 

동기화 오류

공통 자원을 접근하려는 다수의 스레드가 있는 병렬 프로그램에서 흔히 발생

데드락 : 다수의 스레드가 서로 자원을 점유하고 릴리스 하지 않는 상태

레이스 컨디션 : 두 개의 스레드가 같은 자원을 접근하려 하여 수행 결과가 스레드들의 실행 순서에 따라 다르게 되는 경우

모순이 있는 동기화 : 공유하는 변수를 접근할 때 로킹과 언로킹을 번갈아 하는 상황에서 오류가 많이 발생

 

정보 은닉

모듈 사이의 결합을 줄이고 시스템의 유지보수를 쉽게 만듦

소프트웨어 개발에서 복잡함을 다루는 중요한 수단

C++, Java, C#은 정보 은닉을 실현하는 메커니즘을 언어 자체가 가지고 있음

 

디메테르의 법칙

프로그램의 모듈 사이의 결합을 최소화 하려는 것

코드의 적응성과 강인성 향상

 

MISRA-C 코딩 표준

영국 협회인 MISRA에서 C프로그래밍 언어에 대한 코딩 가이드라인 발표

안전성이 중요한 자동차, 우주항공, 철도, 국방 부분에 사용되는 임베디드 소프트웨어의 결함을 줄이기 위한 코딩 표준

 

연관의 구현

클래스 AB 사이에 11연관 관계가 있다

11연관 : A에서 B의 함수를 호출할 필요가 있다면 AB에 대한 참조를 갖도록 구현, 반대도 같은 방식

1대다 : 클래스 A에서 인스턴스 B의 메소드를 호출할 것이 있다면 클래스 A가 클래스 B의 참조를 모음으로 가지고 있도록 구현

다대다 : 중간에 연관 클래스를 도입하여 1대다의 관계로 바꾸어 설계하기도 함

 

시퀀스 다이어그램의 구현

객체의 동적인 측면을 모델링한 것

오퍼레이션의 종류와 클래스 사이의 관계를 파악하기 위하여 각 객체가 주고받는 메소드를 나타냄

 

상태 다이어그램의 구현

상태 : 상태정보를 저장하기 위한 속성을 클래스에 추가

이벤트 : 객체의 상태를 변화시키는 것

컨디션 : 상태변화를 일으키는 조건을 나타낸 것

액션 : 메소드 안에 탑재

초기 상태에서 첫 상태로 진입하는 것은 생성자로 구현

생성자 안에서 상태 변수와 기타 변수를 초기화

 

리팩토링(Refactoring)

프로그램 실행 결과의 변경 없이 코드의 구조를 재조정

이미 존재하는 코드의 디자인을 안전하게 향상 시키는 기술

가독성을 높이고 유지보수를 편하게 하기 위한 것

겉으로 보이는 동작의 변화 없이 내부구조를 변경하는 것

목적 : 소프트웨어의 디자인 개선, 이해하기 쉽게, 버그를 찾는데 도움, 빨리 작성할 수 있게 도와줌

 

리팩토링 과정

소규모의 변경 : 단일 리팩토링

코드가 전부 잘 작동되는지 테스트

전체가 잘 작동하면 다음 리팩토링 단계로 전진

작동하지 않으면 문제를 해결하고 리팩토링한 것은 undo하여 시스템이 작동되도록 유지

 

코드 스멜(Code Smell)

프로그램에 대한 작업을 어렵게 만드는 것

읽기 어려운 프로그램

중복된 로직을 가진 프로그램

실행 중인 코드를 변경해야 하는 특별한 동작을 요구하는 프로그램

복잡한 조건문이 포함된 프로그램

소프트웨어를 보다 쉽게 이해할 수 있고 적은 비용으로 수정할 수 있도록 겉으로 보이는 동작의 변화없이 내부 구조를 변경

 

코드 스멜 사례

중복된 코드 : 기능이나 데이터 코드가 중복

긴 메소드 : 메소드의 내부가 너무 길다

큰 클래스 : 한 클래스에 너무 많은 속성과 메소드가 존재

긴 파라미터 리스트 : 메소드의 파라미터 개수가 너무 많음

두가지 이상의 이유로 수정되는 클래스 : 한 가지 종류의 책임만을 수행하는 것이 아님

여러 클래스를 동시에 수정 : 그때마다 관련된 여러 클래스들 내에서 자잘한 변경을 해야함

다른 클래스를 지나치게 애용 : 빈번히 다른 클래스로부터 데이터를 얻어 와서 기능을 수행

유사 데이터들의 그룹 중복 : 3개 이상의 데이터 항목이 여러 곳에 중복

기본 데이터 타입 선호 : 객체 형태 그룹을 만들지 않고 기본 데이터 타입만 사용

Switch, If 문장 : switch문장이 지나치게 많은 case를 포함

병렬 상속 계층도 : 비슷한 클래스 계층도가 지나치게 많이 생겨 중복 유발

 

Divergent Change

문제 : 한 클래스가 두 가지 이상의 이유로 수정되는 경우

해결책

+ 한 가지 이유만으로 수정되도록 클래스 변경

+ 한 가지 종류의 책임만을 수행하도록 변경

+ Extract Class Refactoring 적용

 

Shotgun Surgery

특정 클래스를 수정하면 관련된 여러 클래스들에 대한 변경 필요

Divergent change와 유사하지만 반대 개념

하나의 변경이 여러 클래스에 걸쳐서 발생

해결책 : Move Method, Move Field, Inline Class

 

Feature Envy

메소드가 정의된 클래스보다 다른 클래스에서 더 사용되는 경우

빈번히 다른 클래스로부터 데이터를 얻어 와서 기능 수행

해결책 : Method Move, Extract Method

 

Data Clumps

데이터 항목이 여러 클래스나 메소드에 중복되어 나타나는 경우

해당 데이터들은 독립된 클래스에 함께 정의함

해결책 : Extract Class, Introduce parameter objects, Preserve whole objects

 

Primitive Obsession

객체 형태 그룹을 만들지 않고, 기본 데이터 타입만 사용

기본 데이터 타입 : 객체가 아닌 타입으로 int, float, char 등을 의미

해결책 : Replace data value with object, Replace type code with class

 

Switch Statements

switch 문장이 지나치게 많은 case를 포함하는 경우

동일한 클래스의 다른 인스턴스들에 대한 로직을 포함하는 switch 문장들이 존재

해결책 : 서브클래스 작성, case 문에 있는 로직을 각 서브클래스의 메소드로 이동

 

Lazy Class

클래스 생성으로 인한 비용은 무시할 수 없으므로 충분한 기능을 하지 않는 클래스는 제거

Inline Class refactoring을 통해 기능이 미비한 클래스 제거

서브 클래스들이 충분한 기능을 수행하지 못하면 Collapse Hierarchy를 사용

 

Hide Delegate Refactoring

클라이언트에게 delegate 객체를 숨김

클라이언트는 delegate에 대한 세부적인 내용을 알 필요 없이 원하는 서비스를 제공받을 수 있음

Delegate에 대한 코드가 변경되어도 클라이언트 코드는 변경할 필요가 없음

 

안전하게 리팩토링

리팩토링을 작게 유지해라

한번에 하나의 리팩토링을 해라

즉각적으로 필요하지 않은 변경 사항 목록을 작성 후 나중에 수행

 

코드 품질 향상 기법

코드 인스펙션 : 프로그램을 읽어보고 눈으로 확인하는 방법

정적 분석 ; 수행되지 않는 데드 코드(Dead Code)가 없는지, 선언이 되지 않고 사용한 변수가 없는지 등을 검사

페어 프로그래밍 : 애자일 방법에서 프로그래밍과 테스팅을 담당하는 두 사람이 머신을 공유하며 코딩

 

코드 인스펙션

프로그램이 성공적으로 컴파일 되고 정적 분석 도구에 의해 검사된 후 이루어짐

코드에 묻혀있는 결함을 찾아내는 것(효율성, 코딩 표준의 준수 여부 등)

심각도 : 결함의 우선순위를 나타냄

결함의 타입 : 로직 문제, 컴퓨팅 문제, 인터페이스/타이밍 문제, 데이터 처리

 

정적 분석

프로그램 텍스트를 조직적으로 분석하여 결함을 찾아내는 것

소프트웨어 도구를 이용해 자동으로 가능

방법 : 코드에 존재하는 결함으로 나타날 비정상적인 패턴이나 원하지 않는 패턴을 찾아내는 방법, 실행할 때 프로그램의 고장을 일으킬 코드 상에 존재하는 결함을 직접 찾는 방법

자료 변칙(Data Anomaly) : 자료 흐름을 분석하면 자료가 정의되지 않고 사용되거나 정의되고 사용되지 않는 비정상적인 패턴을 찾는 것

사족(Redundatnt Code) : 컴파일러에 의해 검출되지 않음(중복된 배정문, 데드 코드, 조건 중복 등)

 

FindBugs

자바 프로그램에서 정적 분석을 위한 툴

버그 패턴을 기반으로 버그를 찾음

 

페어 프로그래밍

두 사람이 같은 컴퓨터를 사용하면서 같이 프로그램을 완성

스트레스와 성공의 기쁨을 나눌 상대가 있기 때문에 프로그래밍에 재미가 있고 압박을 줄일 수 있음

파트너와 아이디어를 교환하기 때문에 팀의 소통을 향상시킬 수 있음

팀 구성원이 서로를 이해하고 여러 가지 방법으로 서로에게서 배우기 때문에 상호 이해와 협력이 향상

토론이 창의적인 사고로 발전하여 문제 해결에 도움이 되므로 간단하고 효율적인 해법을 만들어 낼 수 있음

핑퐁 프로그래밍 : 한 개발자가 테스트를 작성하고 다른 개발자가 기능을 구현

 

'Others > SE' 카테고리의 다른 글

11. 유지보수  (0) 2022.12.20
10. 테스팅  (0) 2022.12.20
8. UI 설계  (0) 2022.12.20
7. 아키텍처 설계와 패턴  (1) 2022.12.20
6. 설계 원리  (1) 2022.12.20