2014-12-31 3 views
1

Я не знаю, что лучшие практики в моем случае исключения:Лучшая практика - обработка

1:

public class garage { 

    private List<Car> cars = new ArrayList<Cars>(); 

    public String getCarSeatSomething(String carName, String brandName) { 
      for(Car car : cars){ 
       if(car.getName().equals(carName)){ 
       Seats seats = car.getSeats(); 
       List<Brand> brands = seats.getBrands(); 
       for(Brand brand: brands){ 
        if(brand.getName().equals(brandName)){ 
         return brand.something(); 
        } 
       } 
       } 
      } 
      return null; 
    } 
     ... 
} 

У меня есть много способа, как это, так что я буду иметь некоторый избыточный код это решение.

Кроме того, в моей программе это не «нормально», что мы не находим машину, поэтому я думаю, что мне нужно использовать Exception no?

2:

public class Garage { 

    private List<Car> cars = new ArrayList<Car>(); 

    public Something getCarSeatSomething(String carName, String brandName) { 
      Car car = searchCar(carName); 
      if(car == null) 
       return null; 
      else{ 
       Seats seats = car.getSeats(); 
       return seats.getSomething(brandName); 
      } 
    } 
     ... 
} 


public class Seats { 

    private List<Brand> brands = new ArrayList<Brand>(); 

    protected Something getSomething(brandName){ 
       Brand brand = searchBrand(brandName); 
       if(brand == null) 
       return null; 
       else 
       return brand.something(); 
    } 
     ... 
} 

Меньше избыточного кода и меньше кода для каждого метода класса гаража, так как поиск только в searchBrand и searchCar. Но у меня всегда есть проблема исключений.

Итак, мое последнее решение заключается в том, чтобы бросать исключение в методы searchBrand и searchCar, добавлять броски во все методы (например, getCarSeatSomething), которые используют searchBrand/searchCar и пытаться ... уловить, когда я использую эти методы (например, getCarSeatSomething).

Верно ли это? Если нет, у вас есть лучшие идеи?

+1

Напишите код, чтобы использовать значения - и избегайте исключений, за исключением случаев, когда происходит нечто исключительное (и часто не восстанавливаемое на немедленном уровне). В основном, спросите их: что происходит, когда запрос * не * может быть выполнен? кто виноват? что, как ожидается, будет сделано по этому поводу? – user2864740

+0

Если я не нахожу машину, например, я должен ее зарегистрировать. Это ошибка вызывающего абонента, а не объекта, который содержит автомобили. – kaoziun

+4

«избегайте ** исключений **, ** кроме ** когда что-то ** исключительное ** происходит» - awesome :-) – Leo

ответ

0

Похоже, что название автомобиля и название бренда будут введены пользователем. В этом случае вы должны ожидать, что пользователи будут предоставлять имена, которые не существуют. Это не исключение. Верните null и в верхнем слое верните сообщение об ошибке пользователю. Кажется разумным, что вы можете попытаться «получить» что-то и не получить его вообще. null подходит здесь. Но убедитесь, что вы согласны с этим поведением в своем приложении и документируете его.

0

Чтобы описать ситуацию: у вас есть сложная иерархия данных, с возможно цепь, доступ:

x.getLiat().get(3).getAs().lookupB("a1").getC(); 

Это может привести к конструкции либо с ожидаемым NullPointerExceptions быть обработано (некрасиво) или Excptions.

Java 8 предлагает Optional<T> явно обрабатывать в одном выражении то, что иначе могло бы быть пустым.

x.getA().orElse(a).getB().orElseThrow(() -> new XException()).getC(); 

Еще лучше использовать потоки java 8 с фильтрацией, отображением, найти любые/первые возможности.

private List<Car> cars = new ArrayList<>(); 

public Optional<String> getCarSeatSomething(String carName, String brandName) { 
    return cars.stream() 
     .filter((car) -> car.getName().equals(carName)) 
     .flatMap{(car) -> car.getSeats()) 
     .flatMap((seats) -> seats.getBrands()) 
     .filter((brand) -> brand.getName().equals(brandName)) 
     .findFirst(); 
} 
0

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

Если необязательно для объекта, который должен содержать атрибут, то методы getter не должны генерировать исключение.

Некоторые сценарии будут включать оба случая, когда в некоторых контекстах доступ к атрибуту является обязательным, а в других контекстах он является необязательным. Затем вы должны предоставить два метода «getter», которые будут генерировать исключение, если атрибут не может быть возвращен, а другой - необязательным.Я рекомендую использовать соглашение об именах методов getEntity для обязательных методов получения и findEntity для дополнительных методов получения.

В случае, когда объект должен содержать определенный атрибут, а метод getter не может выполнить запрос, у вас есть искаженный объект. Если ваша сущность бросает исключения, потому что она не может вернуть обязательные атрибуты, у вас есть ошибка или проблемы с тем, как вы создали объект.

Сущности никогда не должны создаваться без обязательных атрибутов. Конструкторы и фабрики должны применять обязательные атрибуты. Для объектов, которые должны быть созданы и не полностью сформированы (например, объекты доступа к данным), отдельная проверка должна применяться к объектам до их использования. Или отделите объект домена и DAO на отдельные, но эквивалентные типы.

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