문제 백준 2920 - 음계 코드 input = list(map(int, input().split())) ascending = True descending = True for i in range(1, 8): if(input[i] > input[i-1]): descending = False elif(input[i] < input[i-1]): ascending = False if ascending: print("ascending") elif descending: print("descending") else: print("mixed")
뒤엉킨 변경 소프트웨어는 변경에 유연하게 대처할 수 있어야 한다. 어떤 한 모듈이 (함수 또는 클래스가) 여러가지 이유로 다양하게 변경되어야 하는 상황. ex) 새로운 결제 방식을 도입하거나, DB를 변경할 때 동일한 클래스에 여러 메소드를 수정해야 하는 경우. 서로 다른 문제는 서로 다른 모듈에서 해결해야 한다. 모듈의 책임이 분리되어 있을수록 해당 문맥을 더 잘 이해할 수 있으며, 다른 문제는 신경쓰지 않아도 된다. 이와 관련된 리팩토링 기술은 3종류가 있다. 단계 쪼개기(Split Phase)를 사용해 서로 다른 문맥의 코드를 분리할 수 있다. 함수 옮기기 (Move Function)를 사용해 적절한 모듈로 함수를 옮길 수 있다. 모듈이 클래스 단위라면 클래스 추출하기 (Extract Class)를..
가변데이터 데이터를 변경하다보면 예상치 못했던 결과나 해결하기 어려운 버그가 발생하기도 한다. 함수형 프로그래밍 언어는 데이터를 변경하지 않고 복사본을 전달한다. 하지만 그밖의 프로그래밍 언어는 데이터 변경을 허용하고 있다. 따라서 변경되는 데이터 사용 시 발생할 수 있는 리스크를 관리할 수 있는 방법을 적용하는 것이 좋다. 이와 관련된 리팩토링으로는 변수 쪼개기 (Split Variable)을 사용해 여러 데이터를 저장하는 변수를 나눌 수 있다. 질의 함수와 변경 함수 분리하기 (Separate Query from Modifier)를 적용해서 클라이언트가 원하는 경우에만 사이드 이팩트가 있는 함수를 호출하도록 API를 개선할 수 있다. 가능하다면 세터 제거하기 (Remove Setting Method)..
전역 데이터 전역 데이터 (예, 자바의 public static 변수) 전역 데이터는 아무곳에서나 변경될 수 있다는 문제가 있다. 어떤 코드로 인해 값이 바뀐 것인지 파악하기 어렵다. 클래스 변수 (필드)도 비슷한 문제를 겪을 수 있다. 변수 캡슐화하기 (Encapsulate Variable)를 적용해서 접근을 제어하거나 어디서 사 용하는지 파악하기 쉽게 만들 수 있다. 파라켈수스의 격언, 약과 독의 차이를 결정하는 것은 사용량일 뿐이다. 변수 캡슐화하기 (Encapsulate Variable) 메소드는 점진적으로 새로운 메소드로 변경할 수 있으나, 데이터는 한번에 모두 변경해야 한다. 데이터 구조를 변경하는 작업을 그보다는 조금 더 수월한 메소드 구조 변경 작업으로 대체 할 수 있다. 데이터가 사용되는..
긴 매개변수 목록 함수에 매개변수가 많을수록 함수의 역할을 이해하기 어려워진다. 과연 그 함수는 한가지 일을 하고 있는게 맞는가? 불필요한 매개변수는 없는가? 하나의 레코드로 뭉칠 수 있는 매개변수 목록은 없는가? 어떤 매개변수를 다른 매개변수를 통해 알아낼 수 있다면, 매개변수를 질의 함수로 바꾸기 (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종류가 있다. 함수 선언 변경하기 변수 이름 바꾸기 필드 이름 바꾸기 함수 선언 변경하기 좋은 이름을 가진 함수는 함수가 어떻게 구현되었는지 코드를 보지 않아도 이름만으로 이해할 수 있다. 좋은 이름을 찾아내기 위해서 함수에 주석을 작성한 다음, 주석을 함수 이름으로 만들어보자. 함수의 매개변수는 ? 함수 내부의 문맥을 결정한다. 의존성을 결정한다. 변수 이름 바꾸기 많이 사용되는 변수일수록 이름이 더 중요해진다. 다이나믹 타입을 지원하는 언어에서는 타입을 이름에 넣기도 한다. 여러 함수에 걸쳐..
HTTP 월드 와이드 웹을 지탱하는 가장 중요한 기술 두 가지는 HTML과 HTTP이다. 이 두 기술은 팀 버너스 리가 웹을 발명할 때 함께 만들어졌다. 전 세계의 웹 브라우저, 서버, 웹 애플리케이션은 모두 HTTP(Hyper Text Tranfer Protocol)를 통해 서로 대화한다. 인터넷의 멀티미디어 배달부 수십억 개의 JPEG 이미지, HTML 페이지, 텍스트 파일, MPEG 동영상, WAV 음성 파일, 자바 애플릿 등이 인터넷을 항해한다. HTTP는 전 세계의 웹 서버로부터 이 대량의 정보를 빠르고, 간편하고, 정확하게 웹 브라우저로 옮겨준다. HTTP는 신뢰성 있는 데이터를 전송 프로토콜을 사용하게 때문에, 데이터가 지구 반대편에서 오더라도 전송 중 손상되거나 꼬이지 않음을 보장한다. 그..
REST API REST는 Representational State Transfer의 약자로 아키텍처 스타일이다. 아키텍처 스타일은 아키텍처 패턴과는 조금 다른데, 아키텍처 패턴은 어떤 반복되는 문제 상황을 해결하는 도구이고, 아키텍처 스타일은 반복되는 아키텍처 디자인을 의미한다. REST 아키텍처 스타일은 6가지 제약조건으로 구성되며, 이 가이드 라인을 따르는 API를 RESTfull API라고 한다. REST 제약 조건 클라이언트-서버(Client-Server) 상태가 없는(stateless) 캐시되는 데이터(Cacheable) 일관적인 인터페이스(Uniform Interface) 레이어 시스템(Layered System) 코드-온-디맨트(Code-On-Demand) 클라이언트-서버(Client-Se..
- Total
- Today
- Yesterday
- 릿코드
- 백준
- 노마드
- 알고리즘
- 코틀린
- 구현
- Spring
- 리팩토링
- 그리디
- 정렬
- webflux
- leetcode
- 스프링 부트
- 스프링
- 노마드코더
- 코테
- 북클럽
- MySQL
- 자료구조
- kotlin
- 문자열
- Algorithm
- 김영한
- 스프링부트
- 인프런
- Real MySQL
- 데이터베이스
- spring boot
- 파이썬
- mysql 8.0
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |