티스토리 뷰
시스템 아키텍처
- 이해 당사자들과의 상호, 이해, 협상, 동의, 의사교환을 의한 도구이다.
- 프로젝트 초기의 설계 결정으로 시스템 개발 및 유지보수 전반에 걸쳐 지속적인 영향력을 갖는다.
- 시스템에 관련 있는 이해당사자들의 요구사항을 고려하여 정의하여야 한다.
* 물리적 구성 x
비기능적 요구사항을 고려한 아키텍처 설계
- 가용성이 중요한 요구사항일 경우 아키텍처에 여분의 구성요소들이 포함되도록 설계하여 시스템 중단 없이 구성요소를 대치하고 갱신할 수 있게 한다.
- 보안성이 중요한 요구사항이 경우 계층 구조의 아키텍처를 사용하여 가장 중요한 자산들을 가장 중요한 내부의 계층에서 보호하고 이 계층에 높은 수준의 보안 인증을 적용한다.
- 안정성이 중요한 요구사항일 경우 안전 관련 오퍼레이션 모두를 하나의 서브시스템이나 소수의 서브시스템 내부로 국한시키도록 설계한다.
*성능이 중요한 요구사항일 경우 아키텍처는 중요 오퍼레이션을 가능한 많은 서브시스템으로 분할시킨다 x
설계 과정
목표 설정 → 스타일 결정 → 서브시스템, 인터페이스 명세 → 아키텍처 설계 검토
설계 원리
- 추상화는 복잡한 자료, 모듈, 시스템 등으로부터 핵심적인 개념 또는 기능을 간추려 낸다.
- 모듈화는 복잡한 시스템을 세분화된 구성 요소로 정의하여 개발자와 고객이 더 쉽게 이해할 수 있고 다루기 쉬운 구조로 분할한다.
- 캡슐화는 서비스를 수행하는 자료와 함수를 묶어 핵심만을 노출시키고 어떻게 서비스를 제공하는지 자세한 것을 숨긴다.
* 정보은닉은 제한된 방법으로 접근만을 허용해 잘못된 값이 저장되지 않도록 해고, 실수가 잘 발견되게 하지 않도록 한다 x
모듈 결합도
- 모듈 간의 goto 문 사용은 내용결합을 유발할 수 있다.
- 의존도가 클수록 결합도는 높아진다.
- 모듈 간 제어 요소 전달은 전역변수 사용보다 바람직하다.
- 전역변수를 많이 사용할 경우 프로그램 코드가 어렵다.
절차적 응집력
- 여러 기능은 순서대로 실행된다.
- 처리 기능보다 시행 순서에 의해 연결된다.
- 전달 데이터와 반환 데이터 간에 관련이 없다,
* 모든 내부의 어떤 기능 요소의 출력 데이터가 다른 기능 요소의 입력 데이터로 제공 x
배열, 레코드, 구조체 등을 매개변수로 사용하는 모듈 사이의 결합도
스탬프 결합도(Stamp Coupling)
소프트웨어 설계 시 모듈 내부의 응집도 측정을 위한 응집력
- 기능적 응집 : 함수 집합을 받아 미지수를 풀어내는 함수
- 교환적 응집 : 메시지 또는 데이터 전송을 위한 서비스
- 시간적 응집 : 화면을 지우고 팝업창을 띄우는 모듈
* 교환적 응집 : Employee라는 클래스의 데이터를 조작, 저장, 갱신하는 모듈
모듈에 대한 응집도 판단
SignOn : 절차적 응집
ProduceSummaries : 논리적 응집
FormatDayReport : 기능적 응집 → 교환적 x
ProcessWhithdrawal : 순차적 응집
객체지향 설계 기법 중 "클라이언트는 자신이 사용하지 않는 메서드에 의존 관계를 맺으면 안 된다."라는 설계 원칙으로 옳은 것?
인터페이스 분리 원칙 (ISP)
인터페이스 분리 원칙 (ISP)
인터페이스 분리 원칙은 SOLID 원칙 중 하나로, 클라이언트가 자신이 사용하지 않는 메서드에 의존하지 않도록 인터페이스를 작고 구체적으로 분리하는 것을 강조한다. 이 원칙의 주요 목표는 클라이언트가 불필요한 의존성을 가지지 않도록 하여 시스템의 유연성과 유지보수성을 높이는 것이다.
의존관계 역전 원칙 ( Dependency Inversion Principle)
높은 수준의 모듈이 영향을 받지 않으려면 높은 수준의 모듈과 낮은 수준의 모듈을 서로 분리하는 추상화를 도입
클래스의 설계 원칙
- 인터페이스 분리 원칙: 클라이언트는 자신이 사용하지 않는 메서드에 의존 관계를 맺으면 안 된다. 즉, 인터페이스를 클라이언트가 필요로 하는 작은 단위로 분할하여 클라이언트가 필요로 하는 기능만 사용할 수 있도록 하는 원칙이다.
- 개방 폐쇄 원칙: 소프트웨어 엔티티(클래스, 모듈, 함수 등)는 확장에 대해 열려 있어야 하지만 변경에 대해서는 닫혀 있어야 한다. 이는 새로운 기능을 추가할 때는 기존 코드를 수정하지 않고 확장할 수 있도록 해야 함을 의미한다.
- 리스코프 교체 원칙: 자식 클래스는 언제나 부모 클래스의 역할을 대체할 수 있어야 한다. 즉, 부모 클래스의 인스턴스 대신 자식 클래스의 인스턴스를 사용해도 프로그램의 의미나 동작이 변하지 않아야 한다.
- 의존 관계 역전 원칙: 고수준 모듈은 저수준 모듈에 의존해서는 안 되며, 둘 다 추상화에 의존해야 한다. 추상화는 세부 구현에 의존해서는 안 되며, 세부 구현은 추상화에 의존해야 한다. 즉, 구체적인 구현이 아닌 추상화에 의존해야 한다.
범용적 목적의 단일 인터페이스보다는 클라이언트별 인터페이스를 다수 갖도록 설계한다
- 인터페이스 분리 원칙(Interface Segregation Principle, ISP)
ISP는 클라이언트가 자신이 필요로 하는 기능만 포함된 작은 인터페이스를 사용하도록 하는 것을 강조한다. 따라서 범용적 목적의 단일 인터페이스보다는 클라이언트별로 인터페이스를 다수 갖도록 설계함으로써, 클라이언트가 불필요한 메서드에 의존하지 않고 필요한 기능에만 집중할 수 있도록 한다.
직사각형과 정사각형을 처리하기 위한 클래스 설계에서 위반된 원리
리스코프 교체의 원리
이 원칙에 따르면 자식 클래스는 언제나 부모 클래스의 역할을 대체할 수 있어야 한다.
즉, 부모 클래스 타입의 객체를 자식 클래스 타입으로 대체해도 프로그램의 의미나 동작이 변하지 않아야 한다.
직사각형과 정사각형의 관계를 생각해 보면, 일반적으로 "정사각형은 직사각형의 특별한 경우"라고 생각할 수 있다. 그러나 직사각형 클래스와 정사각형 클래스를 상속 관계로 설계할 때 주의할 점이 있다. 정사각형은 가로와 세로의 길이가 모두 같은 특별한 형태의 직사각형이다. 따라서 정사각형 클래스는 직사각형 클래스를 상속받는 것이 자연스러워 보일 수 있지만, 이러한 상속 구조는 LSP를 위반할 수 있다.
예를 들어, 직사각형 클래스에는 가로와 세로 길이를 각각 설정할 수 있는 set_width와 set_height 메서드가 있을 것이다. 그러나 정사각형은 가로와 세로 길이가 항상 같으므로 이러한 메서드가 있으면 정사각형 객체를 생성한 후에도 객체의 불변성이 유지되지 않을 수 있다.
따라서 LSP를 위반하지 않기 위해서는 직사각형과 정사각형을 독립적인 클래스로 설계하거나, 상속 관계가 아닌 다른 방법으로 관련된 동작을 처리해야 한다.
- LogOn은 Dial() 함수 구현의 수정에 닫혀있다.
- Modem의 종류는 확장에 열려있다.
- Send(char) 함수의 구현은 확장에 열려있다.
- LogOn은 Modem의 확장에 대하여 열려있다.
의존 관계 역전의 원리
응집도가 강한 것부터 순서대로 나열
기능적 - 교환적 - 절차적 - 시간적 - 논리적 - 우연적
설계 메트릭과 설계 원리
- 클래스 당 가중 메소드 값이 클수록 복잡한 것이다.
- 클래스 사이의 결합이 클수록 의존도는 크다.
- 클래스의 책임은 메소드의 개수와 메소드가 호출하는 메소드의 개수로 측정할 수 있다.
- 클래스의 안의 속성을 공유하지 않는 메소드의 쌍의 수가 적을수록 응집도가 내려간다.
'컴퓨터 공학' 카테고리의 다른 글
소프트웨어 공학, 7장 설계원리 (0) | 2024.06.09 |
---|---|
유닉스 이론과 실습 , 13장 배시 셸 프로그래밍 (0) | 2024.06.08 |
모바일프로그래밍, 10장 액티비티와 인텐트 (0) | 2024.06.06 |
독학사 C프로그래밍, Day 03 (0) | 2024.06.01 |
모바일프로그래밍, 7장 메뉴와 대화상자 (0) | 2024.05.28 |