Поместите циклы while в метод - PullRequest
0 голосов
/ 18 апреля 2020

Есть ли способ поместить циклы while, которые находятся внутри метода AddToStock, в отдельный метод ValidateInput? Я также приложил код ReadInteger. (Аналогично ReadDecimal / ReadString / ReadDate)

Код AddToStock:

private static void AddToStock()
{
    //Get item id
    int itemid = ReadInteger("\nItem ID:");

    //Confirm item id is greater than 0
    while (itemid <= 0)
    {
        Console.WriteLine("Item ID Cannot Be Less Than 1, Please Try Again");
        //Get item id
        itemid = ReadInteger("Item ID:");
    }

    //Get item name
    string itemname = ReadString("Item Name:");

    //While item name input empty
    while (string.IsNullOrWhiteSpace(itemname))
    {
        Console.WriteLine("You Didn't Enter An Item Name, Please Try Again");
        itemname = ReadString("Item Name:");
    }

    //Get item quantity
    int itemquantity = ReadInteger("Quantity:");

    //Confirm item quantity is greater than 0
    while (itemquantity <= 0)
    {
        Console.WriteLine("Quantity Cannot Be Less Than 1, Please Try Again");
        //Get item quantity
        itemquantity = ReadInteger("Quantity:");
    }

    //Get item price
    decimal itemprice = ReadDecimal("Price Paid:");

    //Confirm item price is greater than 0
    while (itemprice <= 0)
    {
        Console.WriteLine("Item Price Cannot Be Less Than Or Equal To £0.00, Please Try Again");
        //Get item price
        itemprice = ReadDecimal("Item Price:");
    }

    //Get item date added
    DateTime itemdate = ReadDate("Date Added:");
    //Add item to stock
    Employee_UI.AddToStock(itemid, itemname, itemprice, itemquantity, itemdate);
    Console.WriteLine("\nItem Added To Stock!");
}

Код ReadInteger:

private static int ReadInteger(string prompt)
{
    while (true)
    {
        Console.WriteLine(prompt);
        try
        {
            Console.Write("> ");
            return Convert.ToInt32(Console.ReadLine());
        }
        //If input not integer
        catch (Exception)
        {
            Console.WriteLine("Couldn't Understand That As A Number, Please Try Again");
        }
    }
}

Любая помощь очень ценится! Все еще новичок во всем этом :)

Ответы [ 2 ]

0 голосов
/ 18 апреля 2020

Хорошая идея отделить проверку контента от ошибок формата контента. Если вы хотите разделить проверку контента и ввод данных, я бы go сделал следующее: просто полностью разделил валидацию в классе stati c. В классе вы можете проверить тип, который вы хотите проверить, в общем случае c. Когда условия для всех полей одного типа похожи, что-то вроде

public static class StockInputFieldValidator
{
    public static bool ValidateItem<T>(object o)
    {
        if (typeof(T) == typeof(int)) return ((int) o > 0);
        if (typeof(T) == typeof(float)) return ((float) o > 0);
        if (typeof(T) == typeof(decimal)) return ((decimal) o > 0);
        if (typeof(T) == typeof(string)) return !string.IsNullOrWhiteSpace((string) o);
        return true;
    }
}

public static class ValidatedStockInputReader
{
    static void ReadItem(string caption, out string s)
    {
        while (true)
        {
            Console.Write(caption + ">");
            string result = Console.ReadLine();
            if (StockInputFieldValidator.ValidateItem<string>(result))
            {
                s = result;
                return;
            }
            Console.WriteLine("Please provide valid "+result?.GetType().Name+ " input for " + caption);
        }
    }

    static void ReadItem(string caption, out DateTime s)
    {
        while (true)
        {
            Console.Write(caption + ">");
            if (DateTime.TryParse(Console.ReadLine(), out DateTime result))
                if (StockInputFieldValidator.ValidateItem<DateTime>(result))
                {
                    s = result;
                    return;
                }
                else Console.WriteLine("Invalid value for " + caption);
            Console.WriteLine("Please provide valid "+ result.GetType().Name+" input for " + caption);
        }
    }

    static void ReadItem(string caption, out int s)
    {
        while (true)
        {
            Console.Write(caption + ">");
            if (int.TryParse(Console.ReadLine(), out int result))
                if (StockInputFieldValidator.ValidateItem<int>(result))
                {
                    s = result;
                    return;
                }
                else Console.WriteLine("Invalid value for " + caption);
            Console.WriteLine("Please provide valid " + result.GetType().Name + " input for " + caption);
        }
    }

    static void ReadItem(string caption, out decimal s)
    {
        while (true)
        {
            Console.Write(caption + ">");
            if (decimal.TryParse(Console.ReadLine(), out decimal result))
                if (StockInputFieldValidator.ValidateItem<decimal>(result))
                {
                    s = result;
                    return;
                }
                else Console.WriteLine("Invalid value for " + caption);
            Console.WriteLine("Please provide valid " + result.GetType().Name + " input for " + caption);
        }
    }

    public static void GetStockInput(out int citemid, out string citemname, out int citemquantity, out decimal citemprice, out DateTime citemdate)
    {
        ReadItem("Item ID:", out  citemid);
        Console.WriteLine("Input was itemid=" + citemid);
        ReadItem("Item Name:", out  citemname);
        Console.WriteLine("Input was itemname=" + citemname);
        ReadItem("Quantity:", out  citemquantity);
        Console.WriteLine("Input was quantity=" + citemquantity);
        ReadItem("Price:", out  citemprice);
        Console.WriteLine("Input was itempricepaid=" + citemprice);
        ReadItem("Date:", out  citemdate);
        Console.WriteLine("Input was itemdatetime=" + citemdate);
    }
}
0 голосов
/ 18 апреля 2020

Нет необходимости создавать дополнительный метод. Вы можете просто изменить свой метод ReadInteger, чтобы проверить, находится ли входное целое число в диапазоне.

Примечание. Вместо использования Convert.ToInt32() и перехвата исключения лучше следовать стандартному способу, то есть используйте метод int.TryParse().

Попробуйте что-то вроде этого:

private static int ReadInteger(string prompt, int minimum = int.MinValue)
{
    while (true)
    {
        Console.WriteLine(prompt);
        Console.Write("> ");

        int value;
        if (!int.TryParse(Console.ReadLine(), out value))
        {
            Console.WriteLine("Couldn't Understand That As A Number, Please Try Again");
        }
        else if (value < minimum)
        {
            Console.WriteLine($"The number Cannot Be Less Than {minimum}. Please Try Again");
        }
        else
        {
            return value;
        }
    }
}

Использование:

int itemid = ReadInteger("\nItem ID:", minimum: 1);

Затем вы можете следовать той же логике c для других ReadXXXX методов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...