На каком слое должно быть зафиксировано исключение?

1

Я реализовал Queue а затем обертку вокруг него с именем ImplementStackUsingQueue. Примечание. Мой вопрос не имеет ничего общего с точностью или логикой реализации. Его касается только обработки исключений.

Реализация очереди выглядит

 public synchronized boolean add(int x) {
        if (currentSize == maxSize) {
            throw new IllegalStateException("The queue is full: front size: " + rear);
        }

        queue[rear++] = x; // USE.
        rear = (rear + 1) % maxSize;     // NEXT.
        currentSize++;

        return true;
    }

Обертка, использующая эту очередь для реализации стека, выглядит так:

  public void push(T x) {
        queue2.add(x);
        queue2.addAll(queue1);
        queue1 = queue2;
        queue2 = new LinkedList<T>();
    }

Теперь моя обложка, на данный момент, будет полагаться на базовую Queue чтобы выбросить IllegalStateException. Мой вопрос заключается в том, является ли хорошей практикой полагаться на базовые компоненты для исключения исключений ИЛИ стоит ли дублировать условие обработки исключений currentSize = maxSize в ImplementStackUsingQueue и обрабатывать исключения до того, как управление перейдет в базовые слои?

  • 0
    Вы не показываете документацию для основной очереди. Является ли исключение частью его документированной и проверенной функциональности?
  • 0
    Это исключение, как задокументировано, но просто любопытно, почему эта информация является требованием для моего вопроса?
Показать ещё 1 комментарий
Теги:
exception

1 ответ

2

Эта тема очень основана на мнениях, но на протяжении многих лет существует определенный консенсус. Один из них: "Не используйте исключения для управления потоком",

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

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

"стоит ли дублировать условие обработки исключений currentSize = maxSize в реализацииStackUsingQueue и обрабатывать исключения до того, как управление перейдет в базовые слои?" Нет, базовый уровень должен просто указывать, может ли он добавить элемент в очередь или нет:

public synchronized boolean add(int x) {
    if (currentSize == maxSize) {
        return false; // indicate in the javadocs when the false is returned
    }

    queue[rear++] = x; // USE.
    rear = (rear + 1) % maxSize;     // NEXT.
    currentSize++;

    return true;
}

Трудно понять, что делает "push", поскольку queue1 и queue2 могут быть изменены или использованы в другом месте. Если можно выделить изменения в очередях, тогда должно быть нормально, чтобы "push" возвращал false, если было невозможно добавить элемент в очередь. Если очередь не принимает нулевые элементы, то вы можете вернуть значение null, если невозможно было вставить элемент в очередь, в противном случае вернуть элемент нажатым. Но имейте в виду, что было бы прекрасно, если бы "толчок" выдавал исключения. Например, он может вызывать NPE, если queue2 имеет значение null.

Опять же, это очень основано на мнениях, так что, судя по моему мнению, с солью.

  • 2
    Я никогда не понимал значение «Не использовать исключения для управления потоком», как это было опубликовано в настоящее время. Исключением является управление потоком с каналом на стороне данных. Когда это изречение впервые появилось более 20 лет назад, оно означало «не используйте исключения как goto's в одном методе», и поверьте мне, я видел код, который это сделал. Изречение в том виде, в каком оно используется в наши дни, кажется мне бессмысленным.
  • 0
    Я слышу тебя. На мой взгляд, исключения являются ветвями для использования. Что-то вроде «Я должен позвонить своему менеджеру». Как только исключение обработано, сценарий использования может быть продолжен / перезапущен.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню