?
전공-소프트웨어공학

1207

❤ Design Principles

  • 추상화Abstraction

  • 모듈화Modularity

    How to achieve modularity? => 정보은닉을 적용하십숑

  • 정보 은닉Information Hiding

  • 응집력Cohesion을 강하게

    component 내부의 interaction인데요

  • 결합도Coupling을 약하게

    의존관계가 떨어짐less interaction => 독립적independent 이 좋다~

    그렇다고 No dependencies인 경우는 존재하지 않습니다! 의존관계가 전혀 없을 수는 없어요…

Balance component(=module) size and complexity 역시 중요하다. 크기와 복잡도는 트레이드오프 관계에 놓여있으므로, 적절한 균형이 중요하다.

  • size가 작아질수록, connection이 많아진다…
  • size가 커질수록, 각 component 안의 복잡도는 줄어든다…
  • 그러므로 밸런스는 중요하다. => size와 관련된 우리 묵시적인 약속이 있었죠. 뭐였죠? 7 플마 2 5~9

좋은 설계란, High cohesion, Low coupling입니다.

Encapsulation: 관련 있는 것들속성, 메서드은 하나의 클래스에 두자. A 클래스에서 필요한 것을 B 클래스에서 정의하고, 채널을 통해 데이터를 주고받는 것은 Coupling이 강한 것. 즉, 클래스 설계가 잘못되었다고 말할 수 있다.

마지막 PPT에서는, Before 및 After의 예시가 나와 있다. 복습 과정에서 여기에 붙여넣도록 합시다.

Coupling이 강해지면 자연스럽게 Cohesion이 약해질 수밖에 없다. 그 반대의 경우도 마찬가지. 교수가 저 그림을 좋아한다고 하니 잘 배워두십숑

High Coupling vs Low Coupling 그림이 있는데 여따가 첨부하십숑!

High Cohesion(Good)

높음

  1. Functional 기능적

    가장 쉬워용

    only performs that function and nothing else

    클래스 하나에 메서드 하나만 존재하는 건데요. 이렇게 되면 기능이 하나만 있겠죠.

    제일 이상적인 cohesion이에요. 하지만 역시 실제로는 일어나기 어렵죠.

    2번에 그 binary search를

    • 입력받는 기능 하나 module 1
    • 정렬하는 기능 하나 module 2
    • 찾는 기능 하나 module 3
    • 출력 기능 하나 module 4

    이런식으로 4개의 모듈을 나누는거임. 근데사실 이렇게까진 안하고 그냥 하나의 모듈로 놓죠? 그냥 이상적인 cohesion이라는, 저랬으면 좋겠다~하는게 이거인거임.

    제일 밑에 우발적 cohesion도 마찬가지. 이런게 있을리없다~임

    대충 ppt 에서 그림으로 표현한 것이 있으니까 그 걸! 참고하십숑!

  2. Sequential 순차적

    이건 쉬워용

    하나의 출력을 다른 하나의 입력으로 쓰는거죠.

    그 DFD에서 사과 => (씻기) => 씻은사과 => (쪼갠다) => 쪼개진 사과

    이런 것들이 하나의 모듈에 묶여 있는 이것을 Sequential Cohesion이라고 볼 수 있다.

    Data의 흐름.

    (아까 절차적은 기능의 흐름이라고 했죠?)

    ex) sort > search -> display

    이거는 교수가 설명한대로, 저렇게만 써놓으면 절차적이에요. 근데 왜 이걸 순차적 Coupling의 예시로 들었을까? 그건 ppt의 저자가 중요한 키워드를 빼먹었기 떄문이에요. 중요한 키워드란 건 binary search 알고리즘이에요. 저건. 이진 검색은 정렬이 되어있다는 것을 전제로 하죠? Data가 흘러가니까요

    어쨋든 잘 써놓으십숑!하라는거임

  3. Communication 교환적

    동일한 데이터 구조same data structure에 대한 Coupling.

    자료구조 같은거… 그… 배열이나 스택에 정의된 함수들의 집합을 예로 들 수 있겠죠.

    Example
    스택에서 Push, Pop, Peek 같은 애들이 교환적 Coupling이라고.
    그 말이 어려울 수 있겠지만 Push와 Pop처럼, 스택이라는 자료구조를 Push와 Pop이 돌려쓰죠? 그래서 교환이래요

    “책”의 가격, 저자, 출판일, 등. 이런 애들은 same data structure을 공유하니까요. 얘네도 교환적이래요.

  4. Procedural 절차적

    사실상 1~4번까지는 허용된다고 볼 수 있죠

    특정 순서가 있음. they happen in a certain order

    실행 순서를 보장해줍니다. Ensures the order of the execution

    데이터를 입력하고, 그 데이터를 체크하고, 그 데이터를 계산한다.

    절차 = 실행 순서에 관련성을 갖는다.

    절차적, 순차적, 헷갈릴 수 있어요. 무슨 차이냐?

    절차적 순차적
    기능의 순서
    기능의 흐름
    데이터의 순서
    데이터의 흐름
    Example
    학점 등급(A, B, C, D) 계산
    점수를 읽고, 점수를 계산하쥬?
  5. Temporal 시간적

    component를 구성하는 요소들이 특정 시점에 관련되어 있음.

    특정한 시간대(시점)에 관련된 요소들을 묶어 놓은 것

    Example
    Booting module부팅, 시스템 초기화 루틴
    시스템을 초기화하기 위한 모든 코드들이 모여있죠…?
  6. Logical 논리적

    모듈의 각각의 구성 요소들을 기능이 아닌not functionally 논리적으로 연관을 갖는 것을 묶어놓았을 때.

    그저 Client component에 의해 선택되는 element임.

    특정 시간 내에 모두 할 수 없다.

    쉽게 말해서, 카테고리화 시켰다고 생각하세요.

    읽는 것. A component reads input from tape, disk, network…

    Example
    여행을 가려고 해. 다음 중 선택해야 함. 기차 여행, 배 여행, 비행기 여행. 얘네들은 카테고리! 는! 같지만, 기능적으로는 아무런 연관성이 없다…
    선택적이라고 했는데, 비행기 여행을 선택했다면 배 여행을 선택 못하겠죠.
  7. Coindiental 우발적엉망진창이다

    Example
    print next line
    => reverse string of characters in second argument
    =>add 7 to 5th argument
    =>convert 4th argument to float
    얘네들 사이에 관련성이 있나요? No! 뭐하는건지도 모르겠다. 아무렇게나 막 짠거.

낮음

Low Cohesion(Bad)

외우세요! 기순교절시논우

모듈화가 왜 필요한가?

  • Easier to build
  • Easier to change
  • Easier to fix