아래 목록은 다양한 프로그램을 검토하고 리팩터링하면서 만들었다. 프로그램을 수정할 때마다 나는 "왜?"라고 자문한 다음 그 답을 기록했다. 코드를 읽으면서 나쁜 냄새를 정리하다 보니 목록이 상당히 길어졌다. 주석 부적절한 정보 다른 시스템에(소스 코드 관리 시스템, 버그 추적 시스템, 기록 관리 시스템) 저장할 정보를 주석으로 저장하는 것은 적절하지 못하다. 예를 들어 작성자, 변경 이력 같은 정보는 코드만 번잡하게 만든다. 쓸모 없는 주석 오래된 주석, 엉뚱한 주석, 잘못된 주석은 더 이상 쓸모가 없다. 쓸모 없는 주석은 아예 달지 않는 편이 가장 좋다. 쓸모 없어진 주석은 가능한 빨리 삭제하는 것이 좋다. 쓸모 없는 주석은 코드와 무관하게 혼자서 따로 놀며 코드를 그릇된 방향으로 이끈다. 중복된 주석..
첫째, 돌려보자 SerialDate 코드에서 데이비드는 엄청난 절제력과 전문가 정신을 보여준다. 의도와 목적을 고려하건대, SerialDate는 분명히 '우수한' 코드다. 그럼에도 여기서는 낱낱이 까발긴다. SerialDateTests라는 클래스는 단위 테스트 몇 개를 포함한다. 실패하는 테스트 케이스는 없지만, 테스트 케이스를 훑어보면 모든 경우를 점검하지 않는다는 사실이 드러난다. 그래서 나는 클로버를 이용해 테스트 코드를 조사했다. 클로버에 따르면 커버리지는 50% 정도였다. 클래스를 철저히 이해하고 리펙터링하려면 높은 커버리지가 필요했다. 그래서 나는 독자적으로 단위 테스트를 구현했다. SerialDate를 리팩터링하면서 나는 모든 테스트 케이스를 통과하게 코드를 손 볼 작정이다. 둘째, 고쳐보자..
JUnit JUnit의 저자는 많다. 하지만 시작은 켄트 벡과 에릭 감마 두 사람이다. 코드는 잘 분리되었고, 표현력이 적절하다. 저자들이 모듈을 아주 좋은 상태로 남겨두었지만 보이스카우트 규칙에 따라 개선해보자. 기존 코드 더보기 package junit.framework; public class ComparisonCompactor { private static final String ELLIPSIS = "..."; private static final String DELTA_END = "]"; private static final String DELTA_START = "["; private int fContextLength; private String fExpected; private String f..

2022.04.01 - [Android] - Android RecyclerView - ConcatAdapter ConcatAdapter ConcatAdapter를 통해 하나의 RecyclerView에서 쉽게 여러 ViewType을 추가할 수 있습니다. 하지만 LayoutManager는 Adapter에 붙는게 아닌 RecyclerView에 붙기 때문에 하나의 LayoutManager만 사용할 수 있다는 단점이 있습니다. 만약 요구사항이 아래와 같다면? NestedScrollView ScrollView에 Horizontal부분과 Grid부분을 추가하고, Grid 영역 RecyclerView의 height를 wrap_content로 설정하면 해결할 수 있습니다. 하지만 ListView, RecyclerView..

Kotlin DSL DSL(Domain Specifit Language)은 특정 분야에 특화된 언어를 말합니다. Gradle은 Groovy라는 DSL을 사용하는데 KTS를 통해 Kotlin으로 Gradle을 구성할 수 있습니다. 특징 Groovy 언어로 매우 오랜 시간 잘 사용했고, 문제점이 없었기 때문에 굳이 KTS를 사용할 필요가 있을까 싶지만 가장 큰 장점은 Kotlin을 사용하는 점이라고 생각합니다. 다른 언어를 배울 필요없이 친숙하고 쉽게 구현할 수 있기 때문입니다. 친숙한 구문 컴파일 과정에서 에러 확인 Android Studio 적극 지원 하지만 장점만 존재하는 것은 아닙니다. 실제 Clean 작업 후 Build를 거치면 Groovy보다 느리다고 합니다.(링크) 적용 방법 1. buildSr..
ConcatAdapter RecyclerView 1.2.0에서 새롭게 출시한 어댑터입니다. 이름에서 알 수 있듯 여러 어댑터를 연결하는 역할을 합니다. 기존 어댑터의 문제점은 하나의 어댑터에서 여러 ViewHolder를 관리할 때 객체 지향의 의미가 퇴색되고 코드가 쉽게 더러워졌습니다. ConcatAdapter를 통해 하나의 RecyclerView에서 여러 ViewHolder를 쉽게 관리할 수 있고, 기존 Adapter를 연결할 수 있습니다. 사용법 사용법은 매우 간단합니다. 생성자로 vararg 형태로 기존 Adapter를 넘겨주면, 순서대로 RecyclerView에 표시됩니다. 또한 데이터가 변경됐을 때 adapter의 notifyDataSetChanged(), ListAdapter라면 submitL..
Args Args 클래스를 통해 시작은 좋았으나 확정성이 부족했던 모듈을 소개하고, 개선하여 정리하는 단계를 살펴본다. Args의 사용법은 생성자에 인수 문자열과 형식 문자열을 넘기고, Args에 값을 질의하여 인수를 얻는다. package com.objectmentor.utilities.args; import static com.objectmentor.utilities.args.ArgsException.ErrorCode.*; import java.util.*; public class Args { private Map marshalers; private Set argsFound; private ListIterator currentArgument; public Args(String schema, Strin..
동시성이 필요한 이유? 동시성은 결합을 없애는 전략이다. 즉, 무엇과 언제를 분리하는 전략이다. 무엇과 언제를 분리하면 애플리케이션 구조와 효율은 극적으로 나아진다. 단일 스레드 프로그램에서 Break Point를 걸어놓으면 무엇을 언제 실행하는지 알 수 있다. 스레드가 하나인 프로그램은 무엇과 언제가 서로 밀접하다. 구조적인 관점에서 프로그램은 거대한 루프 하나가 아니라 작은 협력 프로그램 여럿으로 보인다. 시스템을 이해하기가 쉽고 문제를 분리하기도 쉽다. 응답시간과 작업 처리량 개선 미신과 오해 반드시 동시성이 필요한 상황이 존재한다. 하지만, 동시성은 어렵다. 다음은 동시성과 관련된 일반적인 미신과 오해다. - 동시성은 항상 헝능을 높여준다? 대기 시간이 아주 길어 스레드가 프로세서를 공유할 수 있..
- Total
- Today
- Yesterday
- DART
- rxjava
- viewmodel
- commit
- 연산자
- Coroutine
- Android
- ViewModelProvider
- Kotlin
- 클린 코드
- observable
- Flowable
- 보이스카우트 규칙
- ViewModelStoreOwner
- DSL
- 코루틴
- isActive
- null
- 클린코드
- git
- clean code
- CancellationException
- ConcatAdapter
- Exception
- TDD
- 함수
- Flutter
- ConcatAdapter.Config
- Widget
- gradle
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |