2014-11-30 2 views
0

У меня есть следующий код:Как я могу проверить аргументы в методе из интерфейса, не нарушая DRY принцип

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 <= "); 
    } 
} 

Я нарушил DRY принцип, потому что повторить проверку в каждой реализации и документации повторы это тоже. Каков наилучший способ проверить аргументы в этой ситуации?

ответ

1

Учитывая, что это интерфейс, а интерфейсы в 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; 
    } 
} 

С выше реализации, вы не имеют для реализации метода в дочерних классах, и вы не рискуете повторить себя.

0

В Java 8 вы можете использовать метод по умолчанию,

interface Person { 

    default void setAge(int age) { 
     if (age < 0) { 
      throw new IllegalArgumentException(); 
     } 
     // ... 
    } 

} 

Когда Person реализован метод по умолчанию является не должны быть переопределены, он действует как не абстрактный метод в абстрактном классе, это может быть что-то, что вам нужно рассмотреть, прежде чем продолжить свой проект.

+0

Вы правы, но для меня это не так. Методы по умолчанию были действительно предназначены для поддержки функциональных интерфейсов, так как у вас может быть только один метод, который не имел реализации в функциональном интерфейсе. Мое чувство кишки состоит в том, чтобы идти с абстрактным классом, так как он передает намерение более четкое (и если это единственный метод, который у вас есть в вашем интерфейсе, нет никакой выгоды для того, чтобы он был интерфейсом). – Makoto

0

«Проверка аргументов» известна как validation. Существует множество методов проверки. Оставаться DRY, делая это непросто, но это возможно. Это сложно, потому что большинство дизайнов сосредотачиваются вокруг идеи о том, что все идет хорошо, а валидация - о том, когда они идут не так. Часто это ставит вас в положение, где валидация - cross cutting concern. То есть, ваш дизайн не сосредотачивается вокруг проверки, это просто еще одна задача, которую вы должны выполнить.

Один из способов достижения валидации (и оставаться сухим) без повторной настройки вашего дизайна - использовать Aspect Oriented Programming. Это наиболее полезно, если вы находитесь в ситуации, которая может быть описана с помощью таких правил, как: «Каждый раз, когда вызывается метод setAge(), нам нужно убедиться, что он положительный». Если это правило должно быть на многих разрозненных классах, которые не живут в какой-либо структуре, что позволит вам их унифицировать (скажем, имея возрастный класс), вы можете посмотреть в AOP.

+0

Хотя я уверен, что дело не в этом, я чувствую себя вынужденным указать, что накопление возраста редко является хорошей идеей, поскольку оно меняется со временем. Гораздо лучше хранить дату рождения и рассчитывать возраст каждый раз, когда он читается. – CandiedOrange

Смежные вопросы