목록TIL (46)
정글에서 온 개발자
목 VS 스텁둘다 목 라이브러리로 구현한다.목은 외부로 나가는 상호작용을 모방하고 검사하는데 도움스텁은 내부로 들어오는 상호작용을 모방하는 데 도움 (검사는 하면 안됨!)스텁과 상호작용을 검증하면 취약한 테스트가 된다. 내부 상호작용은 최종 결과가 아니기 때문CQS 원칙명령 조회 분리 원칙. 모든 메서드가 명령 또는 조회 중 하나여야 한다.CQRS는 이 원칙이 객체나 시스템 단위로 확장된 것이다.조회는 값을 반환하는 대신 부작용이 없어야 한다.(멱등성)명령은 부작용이 있는 대신 void를 반환해야 한다. 목은 명령을 대체한다.스텁은 조회를 대체한다.좋은 API공개 API 와 식별할 수 있는 동작공개 API (public)는 식별할 수 있는 동작과 다르다.이상적으로는 시스템의 공개 API는 식별할 수 있..
interval 관련 알고리즘LeetCode- NonOverlappingIntervalshttps://leetcode.com/problems/non-overlapping-intervals/description/?envType=study-plan-v2&envId=leetcode-75Codility - NumberOfDiscIntersectionshttps://app.codility.com/programmers/lessons/6-sorting/number_of_disc_intersections/백준 -철로 https://www.acmicpc.net/problem/13334팁:순서를 정해서 새는게 유리하기 때문에 정렬이 들어갈 수 밖에 없다. (NlogN을 해서 1억 안쪽이라면)문제 풀이에서 앞쪽 끝 뿐만 아..
sliding window다음 코드는 멋있긴 하지만 겁나 느리다.int tribonacci(int n) { array arr = {0,1,1}; for(int i=3; i아래 코드처럼 대입 저글링을 하는 게 더 빠르다.int tribonacci(int n) { array arr = {0,1,1}; for(int i=3; i아니면 차라리 array 대신 a,b,c 변수를 선언해놓고 저글링 하는 것도 괜찮다.map에서 count로 키 여부 확인하면느리다..find() 는 찾으면 바로 반환하는 반면, .count() 는 map의 특성상 key가 하나임에도 불구하고 템플릿 메소드로써 모든 값을 찾는 추가 로직이 들어갈 수 있기 때문에 느리다.
오픈소스자유 소프트웨어 vs 오픈 소스대부분의 자유 소프트웨어는 오픈소스다. 자유 소프트웨어가 좀 더 자유에 진심이다.그래서 자유소프트웨어를 오픈소스라고 부르면 화낸다.자유 소프트웨어와 오픈 소스 사이에는 자유를 도덕적 문제로 보는지(자유 소프트웨어), 실용적 문제로 보는지 (오픈 소스)차이가 있지만 라이선스를 보기 전까지는 큰 차이를 느끼기 힘들다.라이선스OSI 라이선스가 없으면 오픈소스가 아니다. 그냥 소스 이용가능일 뿐이다.GPL, MIT, 아파치 라이선스 모두 OSI(Open Source Initiative) 라이선스이다. (; Open System Interconnection 7계층과 관계 없음)방임형 라이선스오픈 소스 라이선스의 파생 저작물을 원 저작물과 다르게 할 수 있다.또한 원래 코드..
string에는 .length() 메소드가 있다. 그런데 헷갈리니까 그낭 .size()로 통일하는 게 좋을 것 같다.class 의 private 부분을 먼저 선언해도 된다.array 선언시 array 과 같이 정적인 숫자를 반드시 명시해줘야 한다. 그리고 매개변수로 넘길 때도 마찬가지다. n 같은 동적인 변수로 선언도 어렵다는 게 단점인데, 아무리 메모리를 아끼고 싶어도 알고리즘에서 쓰기는 그닥 좋지 않아 보인다. 그냥 이차원 배열 만들 때 vector를 사용하자. 논리가 더 중요하다고 생각한다.direction 같은 정해진 배열 만들 때도 맘 편하게 vector 쓰는게 나을수도. (혹시나 매개변수로 넘길 때 괜히 귀찮아질 것 같아서)generate, transform, form_each 메소드gene..
연차 덕분에 조금 많이 공부할 수 있었다.map, set파이썬 보다 편한 countermap을 선언했을 때, m[key] 로 접근하면, 해당 key가 없는 경우 자동으로 기본값으로 key,value가 생성된다.이를 이용해 counter를 만들 수 있다.unordered_map m;m[3]++;위 코드에서 3은 자동으로 1로 증가한다.자동으로 생기는 게 불편하다면 m.at(index) 와 같이 접근해야 한다.요소 확인위 내용처럼 if(m[index]) 와 같이 접근하면 기본값으로 요소가 생겨버리기 때문에 불편하다. find나 count를 써야 하는데 count가 더 편하다.if(m.count(3)) //0을 false로 취급한다.//또는if(m.find(3)!=m.end())//find는 iterator..

4대 요소회귀방지리팩터링 내성빠른 피드백유지보수성핵심 요약프로젝트가 커질수록 거짓 양성(실제 실패하지 않았는데 실패했다고 알리는 테스트)을 줄이는 것이 중요하다. 이것과 관련된 것은 리팩터링 내성이다.리팩터링 내성이 없으면 테스트가 양치기 소년이 된다.회귀방지, 리팩터링 내성, 빠른피드백은 서로 상충하는 가치들이다. (이상적인 테스트란 없다.)그리고 이 네가지 특성으 곱셈으로 테스트의 가치가 결정된다. - 어느 하나를 0으로 만들면 안된다.이 중에서 리팩터링 내성은 양보할 수 없다. 리팩터링 내성은 항상 최고 수준으로 맞춘다고 생각하고 회귀방지와 빠른 피드백 중에 저울질을 해야한다.리팩터링을 포기할 수 있는 이유는 나머지 두 요소에 비해, 리팩터링 내성은 이진 선택이기 때문이다. 포기하면 0이 되어 테스..
단위 테스트의 구조테스트는 클래스나 메서드가 아닌 '동작'을 테스트한다.!AAA 패턴 (Arrange, Act, Assert; 준비, 실행, 검증)준비구절일반적으로 가장 크다 (실행과 검증을 합친만큼 클수도 있다.)너무 크다면 오브젝트 마더, 테스트 데이터 빌더를 사용실행구절검증으로 구분된 실행은 하나만 있어야 한다. - 여러개 있다면 통합 테스트다.실행 구절은 보통 한 줄이다. - 두 줄 이상인 경우 SUT의 공개 API에 문제가 있는 것불변 위반의 모순이 있을 수 있다.캡슐화 - 잠재적 모순으로부터 코드를 보호하는 행위인프라나 유틸리티 코드에서는 두 줄 이상일 수 있다.검증문테스트의 목표 단위인 '동작'을 검증하기 때문에 여러개일 수 있다.너무 커진다면 제품 코드에서 추상화가 누락됐을 수 있다.객..
클래스 계층 구조모든 게임 객체가 하나의 기본 클래스를 상속하는 구조. 이 때문에 모놀리식 클래스라고 부르기도 한다.class Actor{public: virtual void Update(float deltatime); virtual void Draw();}//나머지 객체들이 모두 Actor를 상속한다.class Player : public Actor{public: void Update(float deltatime) override; void Draw() override;}단점객체들이 쓸데 없는 메소드를 상속 받거나, 이를 피하기 위해 계층 구조가 복잡해질 수 있다.컴포넌트로 구성된 게임 객체유니티가 이 방식을 채택했다.게임객체는 다른 객체로부터 상속받지 않고, 기능을 구현한 컴포넌..

앞쪽이 더 중요한 내용이지만, TIL 을 위해 오늘 읽은 것부터!남은 휴가 소진을 위해 반차를 내서 많이 읽을 수 있었다.소프트웨어소프트(soft)웨어를 만든 이유는 기계의 행위를 빠르고 쉽게 변경하는 방법이 필요했기 때문이다.소프트웨어를 부드럽게 유지하는 방법은 선택사항(세부사항)을 가능한 많이, 오랫동안 열어두는 것이다.따라서 세부사항과 정책을 가려내는 것부터 시작하자.소프트웨어 개발 기술의 역사는 플러그인을 손쉽게 생성하여, 확장 가능하며 유지보수가 쉬운 시스템 아키텍처를 확립할 수 있게 만드는 방법에 대한 이야기다.개발 초기 세부사항의 예시* 데이터베이스의 형태, 웹서버로의 전달 방식, 프레임워크, 의존성 주입아키텍처아키텍처는 소프트웨어 시스템이 쉽게 개발, 배포, 운영, 유지보수되도록 한다.이를..