왜 추상화 계층을 만드는가 HttpConnection connection = HttpConnection.connect("http://example.com/server"); conncetion.send("Hello Server"); connection.close(); 예를 들어 사용자의 어떤 장치에서 실행되면서 서버에 메시지를 보내는 코드를 작성한다고 가정해보자. 이때, 최상위 계층에서는 HTTP 프로토콜이 어떻게 구현되는지 알 필요도 없이 서버에 메시지를 보내는 것에만 신경을 쓰면서 코드를 작성할 수 있다. 이와 비슷하게 HTTP 프로토콜을 구현하기 위한 코드를 작성한 엔지니어는 데이터가 무선 신호에 변조되는 방법에 대해 아무것도 몰라도 문제가 없을 것이다. HttpConnection 코드를 구현한 개발..
이번에는 코틀린에서 람다(lambda)를 다루는 방법에 대해 알아보자! 1. 람다(lambda) 2. Closure 람다(lambda) 코틀린의 람다는 자바와는 근본적으로 다른 한 가지가 있다. 바로 코틀린에서는 함수를 변수에 할당하거나, 파라미터로 넘길 수 있다는 것이다. 이는 곧, 함수 그 자체로 값이 될 수 있다는 점이다. fun main() { val hamburgers = listOf( Hamburger("불고기버거", 1_000), Hamburger("치즈버거", 2_000), Hamburger("새우버거", 3_000), Hamburger("빅맥", 4_000), Hamburger("싸이버거", 5_000), ) // 람다를 만드는 방법 1 val isShrimpBurger = fun(ham..
가변데이터 데이터를 변경하다보면 예상치 못했던 결과나 해결하기 어려운 버그가 발생하기도 한다. 함수형 프로그래밍 언어는 데이터를 변경하지 않고 복사본을 전달한다. 하지만 그밖의 프로그래밍 언어는 데이터 변경을 허용하고 있다. 따라서 변경되는 데이터 사용 시 발생할 수 있는 리스크를 관리할 수 있는 방법을 적용하는 것이 좋다. 이와 관련된 리팩토링으로는 변수 쪼개기 (Split Variable)을 사용해 여러 데이터를 저장하는 변수를 나눌 수 있다. 질의 함수와 변경 함수 분리하기 (Separate Query from Modifier)를 적용해서 클라이언트가 원하는 경우에만 사이드 이팩트가 있는 함수를 호출하도록 API를 개선할 수 있다. 가능하다면 세터 제거하기 (Remove Setting Method)..
긴 매개변수 목록 함수에 매개변수가 많을수록 함수의 역할을 이해하기 어려워진다. 과연 그 함수는 한가지 일을 하고 있는게 맞는가? 불필요한 매개변수는 없는가? 하나의 레코드로 뭉칠 수 있는 매개변수 목록은 없는가? 어떤 매개변수를 다른 매개변수를 통해 알아낼 수 있다면, 매개변수를 질의 함수로 바꾸기 (Replace Parameter with Query) 를 사용할 수 있다. 기존 자료구조에서 세부적인 데이터를 가져와서 여러 매개변수로 넘기는 대신, 객체 통째로 넘기기 (Preserve Whole Object) 를 사용할 수 있다. 일부 매개변수들이 대부분 같이 넘겨진다면, 매개변수 객체 만들기 (Introduce Parameter Object) 를 적용할 수 있다. 매개변수가 플래그로 사용된다면, 플래..
긴 함수 짧은 함수 VS 긴 함수 함수가 길수록 이해하기 어려워진다. VS 짧은 함수는 더 많은 문맥전환을 필요로 한다. 과거에는 작은 함수를 사용하는 경우에 더 많은 서브루틴 호출로 인한 오버헤드가 있었다. 작은 함수에 좋은 이름을 사용했다면 해당 함수의 코드를 보지 않고도 이해할 수 있다. 어떤 코드에 주석을 남기고 싶다면, 주석 대신 함수를 만들고 함수의 이름으로 의도를 표현해보자. 이에 해당하는 리팩토링 기술은 7종류가 있다. 문제의 99%는 함수 추출하기(Extract Funtion)로 해결할 수 있다. 함수로 분리하면서 해당 함수로 전달해야 할 매개변수가 많아진다면 다음과 같은 리팩토링을 고려해볼 수 있다. 임시 변수를 질의 함수로 바꾸기 (Replace Temp with Query) 매개변수..
중복 코드 중복 코드의 단점 비슷하진, 완전히 동일한 코드인지 주의 깊게 봐야한다. 코드를 변경할 때, 동일한 모든 곳의 코드를 변경해야 한다. 이에 해당하는 리팩토링 기술은 3종류 가 있다. 동일한 코드를 여러 메소드에서 사용하는 경우, 함수 추출하기 (Extract Function) 코드가 비슷하게 생겼지만 완전히 같지는 않은 경우, 코드 분리하기 (Slide Statements) 여러 하위 클래스에 동일한 코드가 있다면, 메소드 올리기 (Pull Up Method) 함수 추출하기 (Extract Function) 의도와 구현 분리하기 무슨 일을 하는 코드인지 알아내려고 노력해야 하는 코드라면 해당 코드를 함수로 분리하고 함수 이름으로 무슨 일을 하는지 표현할 수 있다. 한줄 짜리 메소드도 괜찮다. ..
이해하기 힘든 이름 깔끔한 코드에서 가장 중요한 것 중 하나는 “좋은 이름”이다. 함수, 변수, 클래스, 모듈의 이름 등 모두 어떤 역할을 하며 어떻게 쓰이는지 직관적이어야 한다. 이에 해당하는 리팩토링 기술은 3종류가 있다. 함수 선언 변경하기 변수 이름 바꾸기 필드 이름 바꾸기 함수 선언 변경하기 좋은 이름을 가진 함수는 함수가 어떻게 구현되었는지 코드를 보지 않아도 이름만으로 이해할 수 있다. 좋은 이름을 찾아내기 위해서 함수에 주석을 작성한 다음, 주석을 함수 이름으로 만들어보자. 함수의 매개변수는 ? 함수 내부의 문맥을 결정한다. 의존성을 결정한다. 변수 이름 바꾸기 많이 사용되는 변수일수록 이름이 더 중요해진다. 다이나믹 타입을 지원하는 언어에서는 타입을 이름에 넣기도 한다. 여러 함수에 걸쳐..
의미있는 이름 의도를 분명히 밝혀라 변수(혹은 함수나 클래스)의 존재 이유는? 수행 기능은? 사용 방법은? int d; //경과 시간(단위: 날짜) 이름 d는 아무 의미도 드러나지 않는다. 경과 시간이나 날짜라는 느낌이 안 든다. 측정하려는 값과 단위를 표현하는 이름이 필요하다. int elapsedTimeInDays; int daysSinceCreation; int daysSinceModification; int fileAgeIndDays; 의도가 드러나는 이름을 사용하면 코드 이해와 변경이 쉬워진다.그릇된 정보를 피하라 hp, aix, sco는 변수 이름으로 적합하지 않다. 유닉스 플랫폼이나 유닉스 변종을 가리키는 이름이기 때문이다. 실제 List가 아니라면, accountList라 명명하지 않는다...
- Total
- Today
- Yesterday
- 파이썬
- 북클럽
- mysql 8.0
- 코틀린
- kotlin
- 김영한
- 코테
- 문자열
- 구현
- 자료구조
- Real MySQL
- 알고리즘
- 리팩토링
- spring boot
- 스프링부트
- 릿코드
- webflux
- 노마드
- 데이터베이스
- 백준
- 노마드코더
- 그리디
- MySQL
- 정렬
- 스프링 부트
- 스프링
- Spring
- Algorithm
- 인프런
- leetcode
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 29 | 30 | 31 |