Dec 29, 2017 - POP_part7

사상 - 프로그래밍 이데올로기

아키텍처 기본 기법

패키지화

모듈을 의미있는 단위로 모운후 그룹핑 한다.

  • 소프트웨어 전체가 패키지라는 작은 단위로 분활되므로 복잡도가 낮아진다
  • 패키지 않에 관련 없는 모듈이 섞이지 않으므로 모듈을 관리하기 쉽다.
  • 수정에 대한 영향도가 패키지 안에 머무를 가능성이 높으므로 코드를 변경하기 쉬워진다.
  • 종속 관계가 정리되어 패키지 단위로 재사용하기 쉬워진다.

상향식으로 패키지를 설계하자 패키지 설계는 처음부터 하향식으로 설계할수 없다.

관심의 분리

설계 기법에서 패턴의 대부분은 관심의 분리를 실현하려는 목표를 가지고 있다. 대표적인 패턴이 MVC 패턴이다.

관심단위로 분리되어 있을때 이점

  • 관심별로 독립해서 수정할수있으므로 읽는 법위가 한정되고 변경이 쉬워진다.
  • 영향 범위가 관심 안에 머무르므로 변셩시 품질이 안정된다.
  • 코드를 작성할 때는 관심 단위로 개발하므로 분업, 병행 개발이 가능

관점지향 프로그래밍(AOP)

관심 중에서도 횡단적 관심을 분리한 기술

참조


Dec 28, 2017 - POP_part6

사상 - 프로그래밍 이데올로기

아키텍처 기본 기법

좋은 코드의 기초원리

  • 추상
  • 캠슐화
  • 정보 은닉
  • 패키지화
  • 관심의 분리
  • 충족성, 완정성, 프리미티브성(원시성, 순수성)
  • 정책과 구현의 분리
  • 인터페이스와 구현의 분리
  • 참조의 단일성
  • 분활정복

좋은코드에는 패턴이 있다.

추상

추상이란 개념적으로 명확한 선 긋기를 수행하는 것이다. 추상은 사상과 일반화라는 2가지 관점에서 정리된다.

  • 사상 - 복잡한 대상의 몇가지 성질을 버리고 특정한 성질에 주목하는 것
  • 일반화 - 구체적인 대상으로부터 공통 성질을 추출해서 더욱 범용적인 개념으로 정식화 하는것

복잡함에 대한 대항 수단

추상은 인간이 복잡한 문제에 집중할 때 사용하는 기초적인 원리이다.

사상과 일반화를 구사

추상화는 뛰어난 아키텍처를 구축하기 위해 필요한 프로그래머의 기초 기술 불필요한 것은 버리고 본질을 파악하도록 한다.

캡슐화

데이터와 로직을 모듈이라는 껍질로 감싸는 것을 캡슐화라고 부른다. 다른 모듈은 서로 다른 별개의 것으로 분리해서 다룬다

추상개념이 섞이지 않는다.

관련있는 요소끼리만 특정 추상 개념을 담당하도록 모듈로 모은다.

  • 관련없는 요소가 섞이지 않기 때문에 코드가 읽기 쉬워진다.
  • 변경 시의 영향이 모듈 안으로 한정된다.
  • 영향도가 명확해지므로 코드의 변경이 쉬워진다.
  • 각각 독립된 부품이므로 재사용성이 높아진다.
  • 작은 단위로 분활되므로 복잡한 문제에 대처할 수 있다.

정보 은닉

필요 없는것은 보여주지 않는다 모듈의 구현은 해당 모듈을 사용하는 클라이언트로 부터 은닉한다. 모듈의 데이터는 외부에서 직접 접근할 수 없도록 한다. 모듈의 함수는 최대한 비공개로 한다.

모듈이 상세부분을 은닉하면 인터페이스가 작아지고 정보교환이 단순해지며 코드 전체의 복잡성을 낮출수 있다. 공개된 부분이 작으면 모듈 내부에서 변경이 끝날 가능성이 커진다 이렇게 하면 변경의 파급효과를 최소한으로 억제할수 있다.

  • 캡슐화 - 관계가 있는 요소를 모아 모듈화 하는것, 관계가 깊은 데이터와 함수를 한군데 모은다.
  • 정보은닉 - 모듈의 내부 상태나 내부 함수를 은닉하는 것이다. 내부에 대한 외부로부터의 직접적인 경로를 차단한다.

참조


Dec 27, 2017 - POP_part5

사상 - 프로그래밍 이데올로기

프로그래밍 이론

프로그래밍을 이끄는 가치관

  1. 의사소통
  2. 단순함
  3. 유연성

가치관을 기술의 선택 기준으로

‘어쨰서 이런 것을 할 필요가 있는가?’, ‘이것은 어떤 가치가 있는가?’, ‘언제 이것을 사용하면 좋은가?’

가치관은 원칙을 통해 코드에 적용

  1. 결과의 국소화
  2. 반복의 최소화
  3. 로직과 데이터의 일체화
  4. 대칭성
  5. 선언형의 표현
  6. 변경빈도

어떤 기술을 적용할 때 고려해야 할 관점을 포스(forth)라고 한다. 포스는 다음것이 있다.

  1. 해결책이 충족해야 할 요구사항
  2. 과제에 포함된 제약
  3. 해결책에 요구되는 특성

지금 쓰는 도구는 왜 이런 형태가 되었을까?

기술을 배울때는 동작 원리나 발전 과정, 설계 배경 등도 동시에 알아야 한다. 제대로 이유를 설명할 수 있을 때까지 끈질기게 이해하고 나서 코드를 확정하도록 하자.

의사소통

코드도 남에게 보여주는 문서, 문서의 본질은 의사소통 수단이다. 코드를 읽기 쉽게 만들어라 코드를 읽는 쪽의 관점으로 전환하라

단순함

코드의 복잡성을 제거한다.

코드가 복잡하면 읽는 사람이 읽기가 어렵다 그리고 버그가 발생할 확률을 높힌다. 코드에 옥석을 가려서 석이 옥에 섞이지 않게 한다.

유연성

코드는 반드시 변경 된다 변경이 용이하게 만들어야 된다. 소프트 웨어는 최초 배포로 완성되는 것이 아니다. 경직된 설계에서 하양식으로 얻어지는 유연성 보다 단순함에서 시작해 단위테스트를 통해 상향식으로 얻어지는 유연성이 효과적이다.

결과의 국소화

격과의 국소화란 변경에 미치는 영향이 국소에 머무르도록 코드를 구성한다. 관계가 밀접한 코드를 한데 모은다. 관계성이 높은 코드는 모으고, 관계성이 낮은 코드는 서로 종속 되지 않도록 작성한다.

반복의 최소화

중복을 제거한다. 코드를 분활해서 관리 큰 코드 덩어리는 다른 큰코드에 어떤 부분을 포함할 가능성이 있음 공통 분모를 찾아서 작게 분활하자.

로직과 데이터의 일체화

로직과 해당 로직이 조작하는 데이터를 서로 가까이 배치하는것이 좋다. 데이터와 로직에 수정 시점은 같다 가까우면 가까울수록 변경 비용이 절약된다.

대칭성

코드에 일관성을 갖게 한다. 같은것은 같은 표현으로 한다.

선언형의 표현

명령형 보다는 가능한 선언형으로 표현한다. 흐름이 없어야 읽기 쉽다. 선언형을 코드에 도입하자.

변경빈도

코드를 수정하는 시점이 같으면 그룹핑해서 같은곳에 배치하자 변경이유가 하나라는것은 관련성 높은 코드가 집합해 있다는 뜻이다. 이는 높은 응집성을 충족하고 있는 견고한 코드다. 단일 책임 원칙(single responsibility principle)

참조