1. 복잡성 제거 - 좋은 설계를 위한 첫 걸음
1) 복잡성을 조장하는 요인 세가지
- 의존성
( 코드가 독립적으로 이해되고, 수정 될 수 없을때. -> 없앨수는 없으나 최소화해야함. )
- 불명확성
( 중요한 정보가 불명확할 때 - 특정 메소드의 인풋 아웃풋이 불명확 , 과정이 불명확 )
- 전술적 프로그래밍 ( <=> 전략적 프로그래밍 )
( 빨리 완성하기 - 지금 있는 문제만 고려하고 수정하는 문제 )
2) 복잡성을 낮추는 방법
추상화 - 정보에 대한 간단한 시나리오나, 시놉시스만 알면되는 것
깊은 모듈
- 모듈이 있다고 가정할 때에 사용자가 알아야 하는 것은 단순하게 사용할수 있는 메서드나 클래스여야 한다
- 하나의 기능을 사용하기 위해 계속해서 모듈의 메서들을 호출하는 것은 얕은 모듈이고 깊이가 얕고 넓게 된다
- 좋은 모듈의 예 File IO : open 만 사용하면 , 파일의 종류나 구조나 포인터 등을 알지 않아도 사용할 수 있음.
- 나쁜 모듈의 예 wraper Class : 인터페이스들만 제공하면서, 원래 감추려고 하는것들을 노출시켜서 얕게 만들어준다.
범용 인터페이스
- 여기저기에서 사용되고, 재사용 될 수 있는것.
( 다른곳에서 사용할 수 있도록 , 세부사항을 감춰주고 public api 줌으로 그걸로 사용할 수있도록 하는 것 )
- 전술적 프로그래밍을 해결할 수 있다.
< 범용 인터페이스인가를 판단하기 위한 질문 >
- 가장 심플한가 ? => 복잡성을 감출수 있는가?
정보은닉
- 불필요한 정보를 감추기 : 사용되지 않는 부분에 대해서는 감춰야 한다.
ex 모두 public 으로 되어있거나, 쓸모없이 set 이 있는경우
- 정보노출 : 특정 클래스안서만 사용되어야 하는 정보가 노출되있음으로, 누군가가 사용하게 된다면 엉뚱하게 사용하게 되는 문제가 된다
- 과다노출
깔끔한 추상화
끌어내린다 => 숨긴다.
위에 bad 케이스를 개선하려면
getBufSize() 와 adjustBufSize() 메소드를 private 로 바꾼뒤
readNext()안에서 호출하여 사용하는 방식으로 개선
* 주의 - 재사용되지 않는 getBufSize() 와 adjustBufSize() 를 나누지 않고 만드는것은 좋은 방법이 아니다.
2. SOLID 원칙 - 좋은 아키텍처를 위한 원칙
높은 응집도 - 하나의 모듈안에서 일어나는, 필요한 구현들, 책임들은 그안에서 해결이 되어야 한다.
낮은 결합도 - 하나의 모듈을 만들기위해 다른 클래스의 기능이 가지고 와야한다면 높은 결합도인것이다.
1) 단일책임원칙
위 클래스를 그럼 수정을 하려면 어떻게 해야할까?? => 퍼사트 패턴을 이용한다.
2) 개방 폐쇄원칙
열려있다
- > 데이터 구조에 새로운 필드나 함수를 추가 할수 있어야 한다.
닫혀 있다
- > 내부코드의 변경으로 외부 사용자의 입장에서 사용하는데 바뀌면 안된다.
* 클래스 사이에서도 개방 폐쇄 원칙이 유지되어야 한다 ( 의존관계 같은 문제 - 하위계층에 의존하지 않도록 )
=> 하위 클래스의 변경이 있어도, 상위에서 변경되지 않도록
3) 리스코프 치환 원칙
* 부모에서 정의한 행위가 있다고하면, 상속받은 자식에서도 그 원칙이 유지되어야 한다.
4) 인터페이스 분리원칙
* 자신이 사용하는 것에만 의존 해야한다.
* 제너레이터가 훨씬 하위계층까지 의존성을 가지게된다 사용하지 않음에도....
5) 의존성 역전 원칙
* 의존성의 방향은 상위가 하위에 영향을 받으면 안된다.
* 추상팩토리 패턴
* 생성도 사용도 인터페이스만 알면 할수 있다.
출처 : The RED : 강사룡의 앱 안정성 및 확장성 강화를 위한 Android 아키텍처 강의
'Android 공부 > Android 아키텍처' 카테고리의 다른 글
UI계층 (1) MVC, MVP - 앱 안정성 및 확장성 강화를 위한 Android 아키텍처(5) (0) | 2022.08.25 |
---|---|
테스트 구현 (2) - 앱 안정성 및 확장성 강화를 위한 Android 아키텍처(4) (0) | 2022.08.24 |
테스트 구현 (1) - 앱 안정성 및 확장성 강화를 위한 Android 아키텍처(3) (0) | 2022.08.24 |
모바일 아키텍처 개론 - 앱 안정성 및 확장성 강화를 위한 Android 아키텍처(2) (0) | 2022.08.23 |
어플리케이션 설계 원칙 ( SOLID / 클린 아키 텍쳐 ) (0) | 2021.12.14 |