Week14
ADT & PDA 개체지향을 바라보는 두 가지 관점

- OOP를 바라보는 두 가지 관점
- ADT가 다수설
PDA

- Alan Kay
- OO의 핵심을 메시지라고 봄


- 개체 == 자기의 결정권을 가지는 존재

- 개체 간의 상호작용은 메시지를 통해서
- Procedural
- 함수를 통해서 데이터를 바꿈

- 악용 사례


- 개체지향이라는 용어를 처음 말한 사람이긴 함

- Alan Kay는 메시지 지향 프로그램이라고 주장

- Alan Kay도 잘못된 표현이라고 인정함
스몰토크의 메서드 호출




- 스몰토크에서는 이미 존재하는 메서드를 호출하는게 아님
- 개념상 컴파일 중에 메서드 검사 불가능
- 내가 다른 사람에게 시간을 알려달라고 할 수 있다(메시지 보내기)
- 상대방은 시계가 없을 수도 있다(메시지 처리할 수 없을 수도 있음)

- 참고로 mad
- multiply + add

- args에 인자 수가 모자라다면?




- methodName에서 뭐라도 받을 수 있고, 내부적으로 처리할 수 있으면 다형성
- String 기반 message broadcast system 과 유사함
- 개체의 배열을 매개변수로 넣어주고
- 어떤 메시지
- 처리할 수 있는 개체는 처리하고, 못하면 말고

- 스몰토크는 예외를 많이 사용할 수 밖에 없음
- 컴파일 중에 검사가 불가능 ㅋㅋ


- 동적 타입을 선호할 수록 예외 처리가 중요하다는 것을 알 수 있음
late binding


- 정적 타입을 나쁘다고 악용



- 컴파일러 is god



eXtreme programming

- XP
- 애자일(?)
Pair programming

- Y2K
- 인류 최대의 삽질


- ?




- 흠 ㅋㅋ

- 코드 리뷰 프로세스는 도움이 되었음
Xp의 CI

-
Grady Booch 아저씨가 주장한 방법
- 이 아저씨가 해결하려던 문제는?
-
브랜치 따서 따로 작업

- 병합

- 충돌 발생




- 서로 다른 버전에서 작업하니까 이런 문제가 근본적으로 발생

- 그래서 너무 오래 각자 브랜치에서 작업하지 말고, 종종 합치자

- CI 극단적인 규칙
- 모두 최신버전에서 작업하자는 주장

- 과연 이게 효과적인가?

- 과제 크기가 클 수록 적당히 시간 텀을 주는게 좋음

- 과연 하루에 기능을 딱딱 만들 수 있을까?

- 테스트 시간도 필요하고, 그리고 검증하고 커밋해야죠?
XP CI의 명확한 한계: 테스팅

- 버그가 발생하는 가장 큰 이유: 요구사항(스펙)을 잘못 이해해서
- 그래서 구현한 사람은 스스로 문제를 알아채기 어려움



- 이런 테스팅 문제를 해결하기위해 TDD를 주창
TDD
- 근본적인 것은 가성비
- 경제적으로 좋냐?!

- 여기서 문제는 테스트 코드를 작성하는 사람 == 기능을 구현하는 사람







- 당연히 품질은 높아지는데
- 경제 논리를 생각해보자
- 그리고 본인이 과연 테스트 코드를 제대로 작성할 수 있는가?










TDD는 설계 능력을 향상시켜 준다는 주장

- 함수를 쪼개다 보면 모듈화, 유연성은 올라가지만
- 유지보수는 힘들어짐



- 적당한게 좋은거지
- 무조건 작은게 좋나?

중요한건 경제 논리

- 품질(장인정신)과 경제 논리의 충돌

효과적인 테스트

- 소프트웨어 업계에만 해당되는건 아님
- 최종 제품 테스트 > 부품 테스트
- E2E TEST(UI 자동화)
- 적절한 모듈 단위 테스트를 하자




코드 커버리지 100%의 비용




- 업무 효율이 낮죵
안전이 매우 중요하다면 고려하자

- 비용을 압도하는 안전
- 비즈니스(프로젝트 관리자)의 책임

- 오픈소스는 전문 테스터 고용할 수도 없고
- 단위 테스트 자동화

- 비즈니스 로직과 멀수록 단위 테스트가 쉬움
- 비즈니스 로직은 자주 바뀔 수 있음
- 바뀌면 유닛테스트가 쓸모가 없어짐
- 입력 출력이 명확한 알고리듬
- 알고리듬은 로직이 변하는 경우가 적음

- 위 방법들은 단위 테스트가 효과적이지 않음
단위 테스트를 위한 다형성


- 잘못된 다형성:
- 각 실행 파일마다 구현이 다른 경우
- 빌드에서 처리하는게 옳음
- 테스트를 위해 다형적으로
- 각 실행 파일마다 구현이 다른 경우
- 올바른 다형성:
- 실행 파일 하나에서 구현이 여러 개를 바꿔가면서 사용하는 경우


- 다형성의 개념을 명확하게 하자
동적 타입과 TDD






