Software Design(설계)
소프트웨어 디자인은
- Principles
- Concepts
- Practices
위에 세 가지 요소가 좋은 퀄리티의 제품 혹은 시스템을 만드는데, 중요한 요소가 된다
Requirement -> Design -> Coding
요구사항 단계와 설계(Design) 단계는 상호 연관되어 있고, 설계 작업은 요구사항을 명확하게 해 준다
설계단계는 4가지로 구분된다
- 구성 요소 설계(Component - level design) : 소프트웨어 아키텍처의 구조적 요소를 소프트웨어 구성요소의 절차적 설명으로 변환한다
- 인터페이스 설계(Interface design) : 소프트웨어와 상호 운용하는 사람과 어떻게 통신할지 설명한다
- 구조 설계(Architectural design) : 소프트웨어의 주요 구조적 요소와 아키텍처 스타일 그리고 패턴 그리고 제약의 관계를 정의한다
- 데이터/클래스 설계(Data/Class design) : 클래스 모델을 설계 클래스 실현 및 이를 구현하는 데 필요한 필수 데이터 구조로 변환한다
Design concepts
- Abstraction
- Modularity
- Functional Independence
- Coupling
- Cohesion
- Object-Oriented design
- Design classes
Abstraction
Abstraction 은 복잡성을 줄이고 효율성과 퀄리티를 증가시키기 위해서 detail을 숨기는 것이다
Procedural absstraction은 구체적이고 제한된 기능을 갖는 일련의 명령어들을 의미한다. 절차적 추상화의 이름은 이러한 기능을 암시하지만, 구체적인 세부 사항은 억제된다
ex) open() --> 문까지 가서, 손잡이를 잡고, 문을 당기고, 한 발짝 물러난다
A data abstraction은 데이터 오브젝트를 설명하는 데이터의 집합
Modularity
Modular design은 복잡한 시스템을 체계화하는데 도움을 줍니다
Modularity는 생산 효율성(manufacture efficiency)과 시간 단축(save time)하는데 큰 도움을 줍니다
시스템 안에 너무 많은 모듈은 모듈 통합의 복잡성을 증가시킵니다
각 모듈은 잘 정의된 추상화를 지원하고 그것이 다른 모듈들과 상호작용할 수 있는 명확한 인터페이스를 가질 필요가 있다
Coupling과 cohesion 은 modularization의 기준이 된다
Functional independence
Functional independence is achieved by developing modules with "single-minded"(한결같은) function and an "aversion"(혐오감) to excessive interaction with other modules
Independence is assessed using two qualitative criteria : coupling and cohension
Coupling
Coupling은 모듈 혹은 클래스가 어떻게 초점(focused)이 맞춰져 있는 지를 말합니다
두 개의 모듈이 다른 모듈의 존재 없이 완전히 기능 할 수 있으면 독립적으로 간주합니다
만약 두개의 모듈이 독립적이라면, 그것들은 별도로 해결할 수 있고(solvable), 수정할 수 있습니다(modifiable)
하지만, 시스템 안의 모든 모듈은 시스템이 원하는 동작을 위해서 서로 상호작용해야 합니다
모듈 간 연결이 많을수록 모듈 간 종속성이 높아집니다
- Highly coupled : 상호연결이 강한
- Loosely coupled ; 상호연결이 약한
Fig. 5에서 Public 이 아닌 변수 skypeID 가 Author 클래스 밖에서 언급되었다
Fig. 6 에서는 Author 클래스 안에 있는 getSkypeID() 메서드를 호출함으로 아이디를 가져왔다(Loose coupling)
Cohension(응집력)
Cohension(응집력)은 모듈의 요소들이 서로 얼마나 밀접하게 관련되어 있는지를 나타내는 정도이다
Method cohension 란
위의 그림을 예시로 들었는데, 아마 파일을 열고, 쓰고, 닫는 메서드가 응집되어 나타나 있다는 것을 설명하는 것 같다
Class cohension
응집력이 높은 클래스는 쉽게 이해할 수 있고, 더 안정적이다
Object-Orient Design
객체 지향 설계를 개념부터 세부까지 개발하기 위해서, 몇 가지 작업이 필요하다
- 시스템과의 context와 외부 상호 작용을 정의하고 이해하는 것
- 시스템 아키텍처를 설계하는 것
- 시스템 안에 주요 객체를 식별하는 것
- 설계 모델을 개발하는 것
- 인터페이스를 구체화하는 것
Design classes
As the design model evolves, you will define a set of design classes that refine the analysis classes by providing design detail that will enable the classes to be implemented, and implement a software infrastructure that supports the business solution.
Five different types of design classes
- User interface classes
- Business domain classes
- Process classes
- Persistent classes
- System classes
잘 구성된 디자인 클래스(Design classes)란
- Complete and sufficient : 존재하는 클래스에 대해서 합리적으로 기대할 수 있는 모든 속성과 메서드에 완전한 캡슐화(encapsulation) 여야 한다. 또한 클래스에 목적을 달성하기 위한 충분한 메서드만 포함해야 한다
- Primitiveness(원시성) : 설계 클래스와 관련된 메서드는 클래스에 대한 하나의 서비스를 수행하는 데 초점을 맞춰야 합니다
- High cohension : 높은 응집력
- Low coupling : 낮은 연결성
디자인 모델의 요소들(Elements in design model)
- Data design elements (데이터 설게 요소)
- Architectural Design Elements (건축 설계 요소)
- Interface Design Elements (인터페이스 설계 요소)
- Component-Level Design Elements (구성 단계 설계 요소)
- Deployment-Level Design Elements (배치 단계 설계 요소)