일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 헥사고날아키텍처 #육각형아키텍처 #유스케이스
- k8s #kubernetes #쿠버네티스
- mp4fpsmod
- terminal
- PersistenceContext
- 달인막창
- taint
- 코루틴 빌더
- preemption #
- python
- vfr video
- 자원부족
- 깡돼후
- PytestPluginManager
- JanusWebRTCGateway
- 티스토리챌린지
- VARCHAR (1)
- JanusGateway
- 오블완
- kotlin
- 코루틴 컨텍스트
- JanusWebRTC
- 개성국밥
- tolerated
- 겨울 부산
- Spring Batch
- table not found
- JanusWebRTCServer
- Value too long for column
- pytest
목록분류 전체보기 (583)
너와 나의 스토리
배경 적용된 알고리즘보다 간명한 방법을 찾아내면 기존 코드를 고친다. 알고리즘 전체를 걷어내고 훨씬 간결한 알고리즘으로 바꿔야 할 때가 있다. 문제를 더 확실히 이해하고 훨씬 쉽게 해결하는 방법을 발견했을 때 내 코드와 똑같은 기능을 제공하는 라이브러리를 찾았을 때 이 작업에 착수하려면 반드시 메서드를 가능한 한 잘게 나눴는지 확인해야 한다. 절차 교체할 코드를 함수 하나에 모은다. 이 함수만을 이용해 동작을 검증하는 테스트를 마련한다. 대체할 알고리즘을 준비한다. 정적 검사를 수행한다. 기존 알고리즘과 새 알고리즘의 결과를 비교하는 테스트를 수행한다. 두 결과가 같다면 리팩터링이 끝난다. 그렇지 않으면 기존 알고리즘을 참고해서 새 알고리즘을 테스트하고 디버깅한다. 출처: - [리팩터링 2판]
클래스는 반드시 명확하게 추상화하고 소수의 주어진 역할만 처리해야 한다 * 추상화: 공통의 속성이나 기능을 묶는 것(클래스 정의) 배경 메서드와 데이터가 너무 많은 클래스는 이해하기가 쉽지 않으니 잘 살펴보고 적절하게 분리하는 것이 좋다. 일부 데이터와 메서드를 따로 묶을 수 있다면 어서 분리하라는 신호다. 함께 변경되는 일이 많거나 서로 의존하는 데이터들도 분리한다. 특정 데이터나 메서드 일부를 제거해도 다른 필드나 메서드들이 논리적으로 문제가 없다면 분리할 수 있다는 뜻이다. 절차 클래스의 역할을 분리할 방법을 정한다. 분리될 역할을 담당할 클래스를 새로 만든다 원래 클래스에 남은 역할과 클래스 이름이 어울리지 않는다면 적절히 바꾼다. 원래 클래스의 생성자에서 새로운 클래스의 인스턴스를 생성하여 필드..
단순한 출력 이상의 기능이 필요해지는 순간 그 데이터를 표현하는 전용 클래스를 정의하라 -> 나중에 특별한 동작이 필요해지면 이 클래스에 추가함으로써 점점 유용해진다. 절차 변수 캡슐화 단순한 값 클래스(value class) 만들기 생성자는 기존 값을 인수로 받아서 저장(setter), 이 값을 반환하는 getter 추가 정적 검사 값 클래스의 인스턴스를 새로 만들어서 필드에 저장하도록 setter를 수정 새로 만든 클래스의 getter를 호출한 결과를 반환하도록 getter 수정 테스트 함수 이름 바꾸기 리팩터링 예시: 레코드 구조에서 데이터를 읽어 들이는 단순한 주문(Order) 클래스 Before: Order 클래스의 우선순위(priority) 필드를 단순히 string 타입으로 사용 class ..
decode할 apk 파일: AppTest.apk 1. dex2jar 다운 다운 링크: https://sourceforge.net/projects/dex2jar/ dex2jar 다운 받아 압축을 풀어주세요. 그리고 해당 폴더 안에 decoding할 apk 파일을 넣어줍니다. 2. apk 파일을 jar 파일로 변환 터미널에서 dex2jar 폴더로 이동 아래 명령어 입력 $ sh ./d2j-dex2jar.sh AppTest.apk Permission denied 에러 발생 시 다음의 명령어로 권한 부여 $ sudo chmod +x d2j_invoke.sh 3. jar파일을 java 코드로 보기 JD-gui 다운 다운 링크: http://java-decompiler.github.io/#jd-gui-downlo..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/LDfOs/btrigC93u7K/tnmEU6NsO3rgKkxwonExH1/img.jpg)
쁘띠쁘띠한 내부 모습 6시 반?쯤 갔더니 손님이 별로 없어서 둘이서 넓은 자리에 앉을 수 있었다. 시간 조금 지나니까 자리 꽉꽉 차더라.. 일찍 오길 잘한 듯 ㅎㅎ 벽 쪽 테이블들은 메뉴판 대신 태블릿으로 메뉴 보고 주문할 수 있다. 하지만 우린 눈이 아파서 메뉴판 달라고 함.. 눈이 시려.. 늙어서 그런감.. 밥을 안 먹어서 안주부터~ 쉬림프 로제 파스타랑 치킨 누룽지 리조또 맛은 한스델리 느낌? ㅎㅎ 안주는 미리 밥 먹고 와서 나초나 치즈같은 간단한 걸 시키는 게 훨씬 나을 것 같다 ㅎㅎ 첫 와인은 '너를 응원해'랑 '언제나 고마워' 이렇게 와인 설명서랑 같이 와인을 줘서 좋았다 두 번째로 시킨 '우리 꽃길만 걷자'랑 '더 취하고 싶은 날' '더 취하고 싶은 날'은 도수가 19.5여서 당도가 5인데도..
배경 여러 함수를 한데 묶는 이유 하나는 도출 로직이 중복되는 것을 피하기 위해서다. 이 리팩터링 대신 여러 함수를 "클래스로 묶기"로 처리해도 된다. 원본 데이터가 코드 안에서 갱신될 때 → 클래스로 묶기 원본 데이터가 수정되면 일관성이 깨지는 경우 → 변환 함수 사용 변환 함수로 묶으면 가공한 데이터를 새로운 레코드에 저장 const base(aReading) = {...} const taxableCharge(aReading) = {...} ▼ function enrichReading(aReading){ const result = _.cloneDeep(original); result.baseCharge = calculateBaseCharge(result); result.taxableCharge = M..
function amountInvoiced(startDate, endDate) {...} function amountEceived(startDate, endDate) {...} function amountOverdue(startDate, endDate) {...} function amountInvoiced(aDateRange) {...} function amountEceived(aDateRange) {...} function amountOverdue(aDateRange) {...} 데이터 항목 여러 개가 여러 함수에서 몰려다니는 경우를 자주 볼 수 있다. 이런 데이터 무리를 발견하면 데이터 구조 하나로 모아주면 좋다. 데이터 뭉치를 데이터 구조로 묶었을 때 장점 데이터 사이의 관계 명확 매개변수의 수가 ..
배경 예: 대여한 지 30일이 지났는지를 기준으로 지불 기한이 넘었는지를 판단하는 간단한 함수가 있다. 이 함수의 매개변수는 지불 객체가 적절할까, 아니면 마감일이 적절할까? 지불 객체로 설정하는 경우 이 함수는 지불 객체의 인터페이스와 결합돼버린다. 대신 지불이 제공하는 여러 속성에 쉽게 접근할 수 있어서 내부 로직이 복잡해지더라도 이 함수를 호출하는 코드를 일일이 찾아서 변경할 필요가 없다. 실질적으로 함수의 캡슐화 수준이 높아지는 것 지불 객체가 적절할지 마감일이 적절할지에 대한 문제의 정답은 없다. 그래서 "함수 선언 바꾸기" 리팩터링을 진행하며 코드를 개선해 나가야 한다. 함수 선언 바꾸기: 함수명 + 매개변수 수정 절차 간단한 절차 함수 선언과 호출문들을 단번에 고칠 수 있는 간단한 상황일 때..