책- 정리/Code Complete2

[Code Complete 2] 구현 설계 - 1

jinkwon.kim 2021. 10. 28. 01:04
728x90
반응형

설계란?

소프트웨어에 대한 명세를 동작 가능한 소프트웨어로 변환 하기위한 계획에 대한 구상을 뜻한다.

훌륭한 상위 수준 설게는 여러 개의 하위 수준 설계를 무리 없이 담을 수 있는 구조를 제공한다. 

훌륭한 설계는 규모가 큰 프로젝트에서는 꼭 필요한 작업이며 작은 프로젝트에서도 유용하다.

 

설계는 사용자의 요구사항에 따라 계속 바뀐다.  그래서 어렵다. 

 

설계의 어려움

1. 설계란는 절충과 우선순위의 문제다. 

설계자의 주요 업무중 하나가 서로 상충하는 설계 특징을 비교하여 그 특성들 사이에 균현을 맞추는 일이다. 

빠른 응답 속도가 개발 시간을 최소하는 것보다 중요하다면 설계자는 그에 맞는 설계를 선택 할 것이다. 

 

2. 설계에는 제약이 따른다. 

설계의 핵심은 어느 정도는 가능성을 만들고 어느 정도는 가성능성 제한한다는데 있다. 

시스템 자원은 무한 하지 제한을 통해서 좀더 간결한 해결 책이 나올 수도 있다. 

 

3. 설계는 비 결정 적이다. 

각자의 생각이 다르듯이 모든 사람의 설계는 다르게 나온다. 

 

핵심 설계 개념

1.본질 적인 어려움

소프트웨어 개발이 갖는 본질적인 어려움은 복잡하고 무질서한 현실 세계와 사호작용하고, 종속 관계와 예외 상황들을 정확하고 와벽하게 규명하며, 대충이 아니라 정확히 맞는 솔류선을 설계해야 하기 때문에 발생한다. 

 

2.복잡성 관리 

소프트웨어 개발자는 전체 프로그램은 복잡 하기때문에 억지로 전부를 기억해서는 안된다.

따라서 한번에 한부분을 제대로 집중 할 수 프로그램을 구성 하도록 노력해야 한다. 

 

소프트웨어 아키텍처 수준에서는 시스템을 서브시스템을 나누어 복잡성을 줄인다. 

객체를 신중하게 정의함으로써 한 번에 하나의 기능에만 집중 할 수 있도록 작업을 나눈다. 

 

<복잡성이 발생하는 상황>

- 간단한 문제를 복작하게 해결 할때 

- 복잡한 문제를 단순하고 잘못된 방법으로 해결할 때 

- 복잡한 문제를 부적절하고 복잡하게 해결할 때

 

<복잡성을 관리하는 방법>

- 두뇌가 한번에 처리해야 하는 본질적인 복잡성의양을 최소화한다. 

 

* 3. 바람직한 설계의 특징 *

1. 복잡성 최소화

    - "간단"하고 "이해하기 쉬운" 설계를 만들어라

    - 단 재치있는 설계는 피한다. 

2. 유지보수의 편리함. 

    - 유지보수 개발자가 물어볼 만한 질물을 계속 떠올려라

    - 유지보수 개발자가 청중이라고 생각하고 시스템을 쉽게 이해 할 수 있도록 설께 하라

3. 느슨한 결합

    - 프로그램의 각 부분 사이의 연결을 최소화 해라.

    - 클래스 사이의 연결을 최소화하기 위해 클래스 인터페이스에서의 추상화, 캡슐화, 정보 은닉과 같은 방법을 사용

    - 연결으리 최소화하면 통합이나 테스트, 유지보수할 때 작업을 최소화 할 수 있다. 

4. 확장성

    - 내부 구조를 해치지 않고 시스템의 기능을 개선 할 수 있다는 뜻이다.

5. 재사용성

    - 현새 시스템의 일부를 다른 시스템에 사용할 수 있도록 설게 하는것.

6. 높은 팬인(fan-in) 

    - 높은 팬인은 특정 클래스를 사용하는 클래스의 수가 많다는 것을 의미한다. 

    - 높은 팬인은 시스템이 유틸리티 클래스를 잘 활용하도록 설께 되었다는 것을 의미한다. 

7. 낮은 팬아웃(fan-out)

    - 낮은 팬아웃은 특정 클래스가 다른 클래스를 적게 사용한다는 것을 의미한다. 

    - 높은 팬아웃은 특정 클래스가 다른 클래스를 많이 사용한다는 것을 의미하며 복잡도가 올라간다. 

8. 이식성

    - 시스템을 다른 환경으로 쉽게 이동할 수있게 설계하는 것이다. 

9. 간결성

    - 불필요한 부분이 없게 시스템을 설계하는 것을 의미한다. 

    - 설계의 완성은 더이상 뺄 거이 없을 때 이다. 

    - 소프트웨어의 차기 버전은 하위호환성을 유지 해야 한다. 

    - 기능을 추가하기는 쉬운데 어떠한 문제가 발생할지를 알아야한다.

10. 계층화 

    - 계층화는 시스템에 대해 특정하나 계층에서 바라보고 일관되게 이해 할 수 있도록 분산 계층을 유지하는 것이다. 

    - 시스템을 다른 계층을 보지 않고도 특정 계층에서 볼 수 있도록 설계해야한다.

11. 표준 기법

    - 시스템이 색다른 방법에 의존하면 할수록 다른 사람이 처음에 코드를 이해하기 어려워진다. 

    - 표준화되고 일반적인 접근 방법을 사용해 전체 시스템이 친숙하다고 느껴지게 만들려고 노력해야한다. 

 

 

728x90
반응형