Попытка понять валидацию данных заданных методов в формате true / false

1

В настоящее время я работаю над проектом, который включает в себя создание массива объектов (в данном случае, аппаратных средств из созданного класса ToolItem), а затем создание файла класса, управляющего этими данными. Класс, который я создаю сейчас, называется HardwareStore, имеет методы для поиска, вставки и удаления частных элементов данных для элементов в моем массиве. Используя метод с именем assign() из ранее упомянутого класса ToolItem, я вызываю методы набора для каждого элемента данных и назначаю их пятну в массиве. Назначение выглядит так:

public void assign(int quality, String name, int id, int numInStock, double price)
    {
        setQuality(quality);
        setToolName(name);
        setID(id);
        setNumberInStock(numInStock);
        setPrice(price);
    }

Мой метод вставки в настоящее время выглядит так:

public int insert(int quality, String name, int id, int numInStock, double price)
    {
        //testing the unique ID passed by the user,
        //making sure there isn't an object in the
        //array with the same ID
        testArray = searchArray(id);

        //array holds a max of 10 objects
        if (numberOfItems == 10)
        {
            System.out.println("Array is full");
            return 0;
        }
        //-1 is sentinel value from search method,
        //telling me there isn't an object with the
        //same specified ID
        else if (testArray == -1)
        {   
            for (index = 0; index < toolArray.length; index++)
            {
                if (toolArray[index].getToolID() == 0)
                {
                    toolArray[index].assign(quality, name, id, numInStock, price);
                    numberOfItems++;    //counter for array
                    return 1;          
                }
            }//end for loop
        }
        return -1;    //sentinel value telling me there was a dupe ID

    }//end insert

Я должен проверять toolArray[index].assign(quality, name, id, numInStock, price); используя таким образом логическую переменную:

boolean oK = toolArray[index].assign(quality, id, numInStock, price);

Если oK == true, я затем увеличиваю количество элементов в массиве. Для того, чтобы это сработало, мне нужно было бы assign() иметь возвращаемый тип boolean. Так мне объяснили:

Да, вам понадобится метод Assign. Все, что входит в это, - это призывы "установить" значения к назначенным местам. Метод присваивания возвращает значение в зависимости от того, было ли присвоено значение/вставлено значение. Вам нужно будет проверить значение oK, чтобы убедиться, что оно истинно или ложно.

Моя проблема: я не знаю, как изменить возвращаемый тип assign() на boolean и заставить метод работать правильно. Моя первая мысль была чем-то вроде:

if (setQuality(quality) == true)
{
    return true;
}
else if (setToolName(name) == true)
{
    return true;
}
else
    return false;

но это, очевидно, не работает и приводит к нескольким ошибкам компилятора:/Я просто не понимаю логику такого рода проверки данных. Если кто-то это понимает и может мне помочь, я бы очень признателен!

Теги:
arrays
validation
boolean

2 ответа

1
Лучший ответ

Ну, учитывая, что ваш метод назначения содержит только методы setter, которые присваивают примитивным значениям или строкам внутренние поля, мало что может пойти не так, потому что самый простой способ добиться того, что вы хотите, - это просто вернуть true в конце assign():

public boolean assign(int quality, String name, int id, int numInStock, double price)
{
    setQuality(quality);
    setToolName(name);
    setID(id);
    setNumberInStock(numInStock);
    setPrice(price);
    return true;
}

Теперь, если у вас есть определенные значения, которые являются незаконными для ваших параметров, например отрицательное целое число для id или null для имени, вы можете добавить проверку внутри каждого из ваших методов setter для недопустимых значений. Если эти значения пройдены, вы можете выбросить Exception такое как IllegalArgumentException или вы можете создать настраиваемое исключение, даже если хотите. Вот как он будет искать метод setID():

void setID(int id) throws IllegalArgumentException {
    if(id < 0) {
        throw new IllegalArgumentException();
    } else {
        this.id = id;
    }
}

Затем, предполагая, что все ваши сеттеры выбрасывают одно и то же исключение, вы можете добавить блок try/catch к методу assign() и вернуть false если какие-либо методы setter получили незаконные значения. Код будет выглядеть так:

public boolean assign(int quality, String name, int id, int numInStock, double price)
{
    try {
        setQuality(quality);
        setToolName(name);
        setID(id);
        setNumberInStock(numInStock);
        setPrice(price);
    } catch (IllegalArgumentException iae) {
        return false;
    }
    return true;
}

Если по какой-либо причине ваши методы должны бросать разные исключения, вы можете отделить исключение в блоке catch например:

catch (ExceptionOne e1 | ExceptionTwo e2 ....) {
    return false;
}

Использование Исключения в этом случае в порядке, так как одно из этих значений является недопустимым, это системный логический сбой и следует отметить. Незаконный идентификатор или имя повреждает вашу системную логику и поэтому следует обрабатывать с правильным исключением. Кроме того, это, вероятно, никогда не произойдет или произойдет очень редко, поэтому это будет буквально "исключение" для логики вашей программы.

Однако, если, например, у вас была функция, которая запрашивает у пользователя имя требуемого инструмента, и пользователь дает вам неправильное имя инструмента, вам не нужно выделять исключение, потому что это не делает вашу систему есть ошибка, что просто пользователь не знает, как использовать систему или просто не зная имена его инструментов. В этом случае вы можете просто вернуть значение ошибки как null или false.

  • 0
    Спасибо ему за быстрый ответ! Я собираюсь проверить это очень быстро и посмотреть, работает ли он, но он определенно выглядит так, как должен! Мои методы set имеют свои собственные исключения (по крайней мере, я думаю, что они основаны на том, что вы сказали). Например, если элемент данных качества не находится между 1 и 3, его значение равно 0, т. Д. Так меня проинструктировали, хотя мне нравится твой путь лучше :)
  • 0
    @FuegoJohnson милости просим :). Дайте мне знать, если вы застряли
Показать ещё 3 комментария
1

Обратите внимание, что я изменил возвращаемый тип... от void до boolean

public boolean assign(int quality, String name, int id, int numInStock, double price)
    { 

     return
        (setQuality(quality) &&
        setToolName(name) &&
        setID(id) &&
        setNumberInStock(numInStock) &&
        setPrice(price))
    }

Затем обратите внимание, что я изменил предложения с условием. Если я скажу return A && B, это означает, что он вернет true, если оба A и B являются истинными, поэтому, следуя этой логике, вы строите все возвращаемое предложение и сэкономите себе много Ifs..

Использование исключений в качестве структуры управления потоком - это плохая практика и антипаттерн.

  • 0
    Ух ты, я даже не думал делать это так! Мне нравится простота. Спасибо за простой для понимания ответ. Я проверю это и посмотрю, как это работает. Очень признателен!
  • 0
    Я получаю сообщение об ошибке компилятора: «Оператор && не определен для типа (ов) аргументов void, void»: /
Показать ещё 1 комментарий

Ещё вопросы

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