Как я могу проверить аргументы в методе из интерфейса, не нарушая принцип СУХОЙ
У меня есть следующий код:
public interface Person {
/***
*@Throws Exception x must be greater than 0 ****/
setAge(int x);
}
public class Man implements Person {
setAge(int x) {
if(x <= 0) thrown new Exception("x <= ");
}
}
Я нарушил принцип СУХОГО, потому что я повторяю проверку в каждой реализации, и документация повторяет это тоже. Какой лучший способ проверить аргументы в этой ситуации?
3 ответа
Учитывая, что это интерфейс, и интерфейсы в Java 7 и ниже не могут содержать какую-либо реализацию, значит, вам нужно принять проектное решение. Вам требуется жесткость интерфейса, или вы можете сделать с абстрактным классом?
Если вы можете использовать абстрактный класс для этого метода, я бы порекомендовал сделать это, так как это сделает реализацию (и получение) значения, о котором вы заботитесь, немного проще.
public abstract class Person {
protected int age;
public void setAge(int age) {
if(0 > age) {
throw new IllegalArgumentException("Age must be greater than 0");
}
this.age = age;
}
}
В вышеописанной реализации вам не нужно реализовывать метод в дочерних классах, и вы не рискуете повториться.
В Java 8 вы можете использовать метод по умолчанию,
interface Person {
default void setAge(int age) {
if (age < 0) {
throw new IllegalArgumentException();
}
// ...
}
}
когда Person
Реализован метод по умолчанию, который не требуется переопределять, он действует как неабстрактный метод внутри абстрактного класса, что может потребоваться рассмотреть перед продолжением разработки.
"Проверка аргументов" называется проверкой. Есть много методов выполнения проверки. Оставаться сухим при этом не легко, но возможно. Это сложно, потому что большинство проектов основано на идее, что дела идут хорошо, а валидация - когда они идут не так. Часто это ставит вас в положение, когда валидация является сквозной задачей. То есть, ваш дизайн не основан на проверке, это просто еще одна работа, которую вы должны выполнить.
Один из способов добиться валидации (и оставаться СУХИМЫМ) без необходимости переделывать свой дизайн - это использовать Аспектно-ориентированное программирование. Это наиболее полезно, если вы находитесь в ситуации, которую можно описать с помощью правил, таких как: "Каждый раз, когда вызывается любой метод setAge(), мы должны убедиться, что он положительный". Если это правило должно присутствовать во многих разнородных классах, которые не живут в какой-либо структуре, которая позволила бы вам объединить их (скажем, с помощью класса Age), то вы можете рассмотреть AOP.