특정 프로그램에 대한 인터페이스를 만들려고 할 때 일반적으로 유효성이 검사되지 않은 입력에 의존하는 예외가 발생하지 않도록 노력하고 있습니다.
그래서 종종 발생하는 일은 다음과 같은 코드를 생각한 것입니다 (이것은 예제를위한 예일뿐입니다. 예를 들어 Java의 기능을 신경 쓰지 마십시오).
public static String padToEvenOriginal(int evenSize, String string) {
if (evenSize % 2 == 1) {
throw new IllegalArgumentException("evenSize argument is not even");
}
if (string.length() >= evenSize) {
return string;
}
StringBuilder sb = new StringBuilder(evenSize);
sb.append(string);
for (int i = string.length(); i < evenSize; i++) {
sb.append(' ');
}
return sb.toString();
}
자, 그것은 evenSize
실제로 사용자 입력에서 파생 되었다고 가정하십시오 . 그래서 나는 그것이 확실하지 않다. 그러나 예외가 발생할 가능성이있는이 메소드를 호출하고 싶지 않습니다. 그래서 나는 다음과 같은 기능을합니다 :
public static boolean isEven(int evenSize) {
return evenSize % 2 == 0;
}
그러나 이제 동일한 입력 유효성 검사를 수행하는 두 가지 검사가 있습니다. if
명령문 의 표현식 과 명시 적 체크인입니다 isEven
. 코드가 중복되어 좋지는 않으므로 리팩토링하십시오.
public static String padToEvenWithIsEven(int evenSize, String string) {
if (!isEven(evenSize)) { // to avoid duplicate code
throw new IllegalArgumentException("evenSize argument is not even");
}
if (string.length() >= evenSize) {
return string;
}
StringBuilder sb = new StringBuilder(evenSize);
sb.append(string);
for (int i = string.length(); i < evenSize; i++) {
sb.append(' ');
}
return sb.toString();
}
문제가 해결되었지만 이제 다음과 같은 상황이 발생합니다.
String test = "123";
int size;
do {
size = getSizeFromInput();
} while (!isEven(size)); // checks if it is even
String evenTest = padToEvenWithIsEven(size, test);
System.out.println(evenTest); // checks if it is even (redundant)
이제 우리는 중복 검사를 받았습니다. 우리는 이미 값이 짝수임을 알고 있지만 padToEvenWithIsEven
이미이 함수를 호출 한 것처럼 항상 true를 반환하는 매개 변수 검사를 수행합니다.
지금 당장 isEven
은 문제가되지 않지만, 매개 변수 확인이 더 번거 롭다면 비용이 너무 많이들 수 있습니다. 게다가, 중복 통화를 수행하는 것은 단순히 기분이 좋지 않습니다.
때로는 "유효한 유형"을 도입하거나이 문제가 발생할 수없는 함수를 만들어이 문제를 해결할 수 있습니다.
public static String padToEvenSmarter(int numberOfBigrams, String string) {
int size = numberOfBigrams * 2;
if (string.length() >= size) {
return string;
}
StringBuilder sb = new StringBuilder(size);
sb.append(string);
for (int i = string.length(); i < size; i++) {
sb.append('x');
}
return sb.toString();
}
그러나 이것은 똑똑한 사고와 상당히 큰 리 팩터가 필요합니다.
중복 isEven
매개 변수 검사를 수행하고 이중 매개 변수 검사를 수행 할 수있는 일반적인 방법이 있습니까? 솔루션이 실제로 padToEven
잘못된 매개 변수로 호출하지 않고 예외를 트리거 하고 싶습니다 .
예외없이 나는 예외가없는 프로그래밍을 의미하지는 않지만, 사용자 입력이 의도적으로 예외를 트리거하지 않는 반면, 일반 함수 자체에는 여전히 매개 변수 검사가 포함되어 있습니다 (프로그래밍 오류로부터 보호하기 위해).
padToEvenWithIsEven
하지 않는다는 것을 기억해야 합니다. 호출 코드의 프로그래밍 오류 로부터 자신을 보호하기 위해 입력에 대한 유효성 검사를 수행합니다 . 이 유효성 검사의 범위는 호출 코드를 작성하는 사람이 잘못된 매개 변수에 전달할 위험에 대비하여 검사 비용을 부과하는 비용 / 위험 분석에 따라 다릅니다.