"Комплимент дающего" мини-программа


Я довольно новыми для программирования и я решил сделать небольшую программу на C# консольное на практике. Программа запрашивает ввод пользователя и выдает случайную "комплимент", он также имеет небольшой шанс дают бонус "комплимент". Как я могу улучшить мой код и что же вы рекомендуете мне попробовать добавить? -ПС. "комплименты" в основном шутка.

Мой код:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Compliment_giver
{
class Program
{
    static void Main(string[] args)
    {
        Greeting();
        start:
        string answer = Console.ReadLine();
        if(answer != "yes" && answer != "no")
        {
            Console.WriteLine("Unexpected input, please type either \"yes\" or \"no\"");
            goto start;
        }
        while(answer == "yes")
        {
            Console.Clear();
            string result = RandomCompliment();
            Console.WriteLine("\n{0}\n",result);
            if (BonusCompliment())
                Console.WriteLine("BONUS COMPLIMENT!\nYou are Very Lucky\n");
            Console.Write("Would you like another compliment? : ");
            goto start;
        }
    }

    public static string RandomCompliment()
    {
        string[] compliment = new string[10];
        compliment[0] = "Your hair smells nice";
        compliment[1] = "Your face is ok I guess";
        compliment[2] = "You're probably smarter than a penguin";
        compliment[3] = "Your body appears to be human";
        compliment[4] = "You seem pleasant";
        compliment[5] = "You likely aren't the most annoying person in the world";
        compliment[6] = "You are talanted... at something possibly";
        compliment[7] = "Your eyes are of good color";
        compliment[8] = "Your are the best looking person in a room by yourself";
        compliment[9] = "You are right all the time, exept only when you are not";

        Random number = new Random();
        int rng = number.Next(0, 10);

        string _result = compliment[rng];

        return _result;
    }

    public static void Greeting()
    {
        Console.WriteLine("Welcome to the Compliment Giver 3000!");
        Console.WriteLine("This program is designed to give free compliments to make you feel better");
        Console.Write("Do you want a compliment?    yes/no: ");
    }

    public static bool BonusCompliment()
    {
        Random percentage = new Random();
       int bonus = percentage.Next(1, 101);

        if (bonus <= 3)
            return true;
        else
            return false;
    }

}
}


3004
30
задан 25 февраля 2018 в 05:02 Источник Поделиться
Комментарии
3 ответа

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

Я всегда думаю, что люди не стеснялись в выражениях рано в комментарии код, потому что он экономит Агро позже. Некоторые мои замечания (особенно форматирование/стиль/очки именования) будете чувствовать себя как педантичность, но вопрос в том, что крошечные проекты становятся небольшие проекты становятся среднего размера проектов, и прежде чем вы это знаете у вас есть зверь на руках. Поэтому его стоит получать маленькие вещи рано.

Форматирование


  • Как правило, класс должен быть отступ внутри пространства имен. имея две скобки на том же уровне отступа, как вы сделали в конце фрагмента выглядит странно.

  • вторая линия bool BonusCompliment() не отступ правильно

Именования

Выбрать именования и придерживайтесь его неукоснительно. Это позволит сделать код более простым для чтения.


  • compliment это последовательность комплиментов, так должно быть во множественном числе

  • Не сокращайте названия, если его действительно очевиден (int rng), как это делает ваш код труднее читать. Я должен был догадаться, что это расшифровывается как "генератор случайных чисел", но даже полный его названа не правильно - это значение возвращается в генератор, а не генератор сам. Лично я бы назвал это index

  • Почему подчеркивание в string _result? его общее соглашение в некоторых кодовых баз для обозначения переменных класса с подчеркивания как способ отличить их, но это локальная переменная.

  • C# код не обычно использовать символ подчеркивания для разделения слов в имена идентификаторов, так что ваше пространство выглядело немного места для меня

Стиль

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


  • Вы не бандаж однострочный оператор if. Многие программисты (включая меня) считают, что это плохая практика - посмотрим на это

  • Количество литералов в коде блоки называют магией чисел , которая является практикой, которая как правило, не рекомендуются, потому что они делают код трудно читать. Например с (bonus <= 3) не совсем понятно, для случайного читателя, что значение числа '3' является. Это возраст мамы недавно приобрели подержанный автомобиль? Температура в тот день? Дать магия значение цифр, определяющих его как класс постоянным вне метода. Это также означает, что если это число изменяется на более позднюю дату, изменения только в одно место, уменьшая возможность ошибки.

public class Program {
private const int MumsBirthday = 3;

public bool IsItMumsBirthday(int dayOfMonth) {
return dayOfMonth == MumsBirthday;
}
}

Упрощений


  • public static string RandomCompliment() может просто return compliment[rng]; вместо того, чтобы сохранить его в переменной и возвращал

  • BonusCompliment() не нужно if/else. Просто использовать return bonus <= 3

Смешанная


  • Используя метки и goto сайта обычно не одобряется в большинстве языков программирования, которые реализуют его - можно погуглить немного обсуждения по этому вопросу. Как и все эти 'правила', если вы думаете, что нашли подлинный использования, что может быть лучше представленными в других языковых конструкций, непременно воспользуюсь goto. Как правило, хотя поведение вы пытаетесь реализовать осуществляется с do/while такой

bool wantsMoreCompliments = true;
while(wantsMoreCompliments) {
string answer = null;
do {
if(answer != null) {
// Write error message to console
}
answer = Console.ReadLine()
} while(answer != "yes" && answer != "no")
// Do something with answer
// Decide if wantsMoreCompliments
}


  • Ее также стоит отметить, что использование goto здесь эффективно превращает ваш while петли в if блок - там никогда не собирается быть случай, когда он повторяется более одного раза, так как он доберется до конца и просто выскакивает из петли.

  • в public static string RandomCompliment() вы создаете массив строк комплимент. В большинстве случаев вы сможете справиться как Новичок, последовательности объекты должны быть представлены список структура данных, а не массив. Для более подробного обсуждения этой темы см. здесь.

  • Рассмотрите возможность использования коллекции для инициализации тестов за комплименты список, так как это гораздо меньше информации, чем так, как вы сделали это:

List<string> compliments = new List<string> {
"Your hair smells nice",
"Your face is ok I guess"
// More compliments
};

Редактировать

В ответ на ваш вопрос о том, как использовать список с генератором случайных чисел, вы могли бы сделать это вот так:

предполагая, что compliments список мы определили выше:

int index = number.Next(compliments.Count);
return compliments[index];

32
ответ дан 25 февраля 2018 в 09:02 Источник Поделиться

Все Бен Уэйнрайтс указателями фантастические.

Существуют, однако, две вещи, которые я считаю важными, которые были опущены.


  1. Использование Random может вызвать серьезные головные боли в будущем. Согласен, в вашем случае использовать, это крайне маловероятно, чтобы быть проблемой, это хорошая вещь, чтобы тщательно разобраться, а это не то, что вы, вероятно, чтобы обнаружить на свой собственный. Вот подробное объяснение проблемы.
    В сущности, вы не должны создавать новый Random экземпляров каждый раз, когда вы хотите генерировать случайные числа. Вы должны делиться случаях (но не в разных потоках), чтобы убедиться, что вы не генерировать те же "случайные" числа. В данном случае, я бы повторно работать ваш код должен быть:

    class Program
    {
    private static readonly Random _random = new Random();

    public static string RandomCompliment()
    {
    // ...
    int rng = _random.Next(0, 10);

    string _result = compliment[rng];

    return _result;
    }

    public static bool BonusCompliment()
    {
    int bonus = _random.Next(1, 101);
    if (bonus <= 3)
    return true;
    else
    return false;
    }
    }

    Обратите внимание, что можно пометить поле как readonly* чтобы лучше прояснить наши намерения, что _random должен быть один экземпляр.


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

* Благодаря Джесси С. овощерезка за предложение!

7
ответ дан 26 февраля 2018 в 11:02 Источник Поделиться

В дополнение к отличной Бен Уэйнрайт и всеобъемлющего обзора, я хотел бы добавить:


  1. При приеме пользовательского ввода, вы всегда должны очистить его и нормализовать его. Обрезать пробелы и преобразовать в верхнем или нижнем регистре. Если пользователь ввел "да", то ваша программа не совпадает с "Да", например не.

  2. При возврате результата логического выражения становится яснее и менее подвержено ошибкам, чтобы просто вернуть выражение. Например,

Вместо:

if (bonus <= 3)
return true;
else
return false;

просто выполните:

return bonus <= 3;

6
ответ дан 25 февраля 2018 в 10:02 Источник Поделиться