이번 프로젝트에서 웹에서 내려주는 link, url, scheme, javainterface을 가지고 앱에서 동작을 분기하거나 특정 페이지를 보내야 하는 작업을 하였다.
param, host, scheme 같은 경우에는 Uri.parse()를 통해서 getQueryParmeter, scheme, host를 사용하면 되지만 단순 문자열 포함 체크 시에는 contains()를 사용한다.
하지만 각 웹 팀마다 대문자, 소문자 규칙이 달라서 contains() 함수에서 분기 처리가 잘못되는 버그가 발생하였다. 따라서 각 팀끼리 합의하에 모두 대문자로 치환 후 포함 체크를 하자고 해서 uppercase()를 사용하였다.
대문자 치환을 위해서 반복되는 uppercase() 함수 사용은 귀차니즘을 발동시켰다. 귀차니즘을 없애기 위해 uppercase()를 적용하여 문자열을 포함 체크를 할 수 있는 확장함수를 만들어 보았다.
fun String?.containsUpperCase(compare: String?): Boolean {
if (this.isNullOrEmpty() || compare.isNullOrEmpty()) return false
return this.uppercase().contains(compare.uppercase())
}
포함 여부를 체크할 두개의 String 중 하나라도 null이거나 empty 이면 false를 반환하며 값이 존재할 경우 비교 문자열을 각각 uppercase()로 대문자 치환 후 포함 여부를 체크하는 로직이다.
여기서 만족하면 될 것을 내 눈에는 또 다른 반복되는 귀찮니즘을 발견하였다...
먼저 귀찮니즘이 발견된 부분부터 보자.
when {
url.containsUpperCase("naver.com") &&
url.containsUpperCase("kakao.com") &&
url.containsUpperCase("youtube.com") -> {
....
}
url.containsUpperCase("naver.com") ||
url.containsUpperCase("kakao.com") ||
url.containsUpperCase("youtube.com") -> {
....
}
}
여기서 보면 naver.com, kakao.com, youtube.com을 모두 포함하고 있는 url일 경우와 셋 중에 하나를 포함하고 있는 url일 경우 두 가지 조건이 있었다. 굳이 3개 비교 확장함수를 사용해야 할까? 하는 생각에 이것도 커스텀 확장함수를 만들어서 귀찮니즘을 줄이고 싶었다.
먼저 OR 연산자를 사용할 것인지, AND 연산자를 사용할 것인지에 대한 옵션을 만든다.
object Operate {
const val AND = 1
const val OR = 2
}
vararg를 사용하여 비교할 문자열을 array로 받을 수 있도록 설정하며 operate를 통해 연산자 옵션을 지정할 수 있도록 매개변수를 설정한다. 그리고 AND연산자일 경우와 OR연산자일 경우 두 가지 케이스를 나눠서 로직을 만든다.
fun String?.containsMultiTarget(operate: Int, vararg targets: String?): Boolean {
if (operate == Operate.AND) {
for (target in targets) {
if (!this.containsUpperCase(target)) {
return false
}
}
return true
} else {
for (target in targets) {
if (this.containsUpperCase(target)) {
return true
}
}
return false
}
}
AND 연산자
- 비교할 문자열 중 하나라도 문자열이 포함되어 있지않으면 조건이 충족하지 않으므로 false을 반환
OR 연산자
- 비교할 문자열 중 하나라도 문자열이 포함되어 있으면 조건을 충족하는 것이므로 true를 반환
이렇게 커스텀 확장함수 덕분에 문자열 포함 여부 체크에 관해서는 아주 편안하게 코딩 중이다.
'개발 이모저모' 카테고리의 다른 글
시작일부터 종료일 표현해보기 (0) | 2022.12.15 |
---|---|
카카오 주소 및 키워드 api를 활용한 주소 검색 서비스 제작 (0) | 2021.11.16 |
지도에 중복 위경도 마커를 찍어보자 (0) | 2021.11.16 |
SharedPreference를 이용한 최근 검색어 리스트 만들기 (0) | 2021.11.16 |
HTTP 통신 로그 이쁘장하게 찍어보기 (0) | 2021.11.16 |