我刚接触编程,因此决定制作一个小型C#控制台程序进行练习。该程序要求用户输入并给出一个随机的“补偿”,它也很少有机会给出额外的“补偿”。我该如何改善我的代码,还建议谁推荐我添加? -ps。 “赞美”大多是个玩笑。

我的代码:

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;
    }

}
}


评论

我见过的最好的C#初学者程序。继续学习!

赞美中的拼写/语法(它们是硬编码的,所以从技术上讲是对的,对吗?):有才华->有才华,你是->你是或你是。

请不要更新您问题中的代码以合并答案的反馈,否则会违反“代码审查”的“问题+答案”样式。这不是一个论坛,您应该在其中保留问题的最新版本。收到答案后,请查看您可能会做什么和可能不会做什么。

@ Hosch250不会弹出气泡或任何东西,但是我很少在多个地方使用诸如goto之类的奥秘构造来遇到C#代码。继续学习确实是个好主意。

#1 楼

不要因为我写了多少而气disc。我是专业的软件开发人员,我的同事们因为我的代码审查太过刻薄而取笑我。我认为您所做的实际上对于第一个程序而言非常整洁,并且我喜欢您显然已经在有意识地努力将事情分解为有用的功能(许多初学者做得不好)。

我一直认为人们不应该在代码审查中尽早提出建议,因为这样可以节省以后的工作。我的某些要点(尤其是格式/样式/命名点)感觉像是书呆子,但是问题是,小项目变成了小项目,变成了中等大小的项目,并且在您不知道它的位置上就遇到了野兽。因此,值得尽早将一些小知识弄清楚。在片段末尾具有相同缩进级别的两个大括号看起来很奇怪。 >选择命名约定,并认真遵守。这将使您的代码更易于阅读。



bool BonusCompliment()是一系列恭维,因此应为复数形式。 。我不得不猜测这代表“随机数生成器”,但是即使未缩写它也没有正确命名-它是生成器返回的值,而不是生成器本身。我个人可能将其称为compliment

为什么在int rng中使用下划线?在某些代码库中,通常的约定是在类变量前加下划线作为区分它们的一种方式,但这是一个局部变量。
C#代码通常不使用下划线来分隔标识符名称中的单词,因此您的命名空间在我看来有点不合时宜

样式

风格要点通常是有争议的,因此其他人可能不同意我所做的观察。调查要点,研究那里的意见并形成您自己的意见。完成此操作后,请确保您始终保持一致。


不要用单行if语句括起来。许多程序员(包括我在内)都认为这是不好的做法-看看此代码块中的数字文字被称为魔术数字,通常不建议这样做,因为它们会使代码更难阅读。例如,对于index,临时读者并不太清楚数字“ 3”的含义是什么。妈妈最近购买的二手车已经到了年龄吗?那天的温度?通过在方法之外将其定义为类常量来给出幻数的含义。这也意味着,如果以后更改此数字,则只需在一个地方进行更改,从而减少出错的可能性。

/>


string _result可以只是(bonus <= 3)而不是将其保存到变量中并返回该变量。只需使用public static string RandomCompliment()


其他


使用标签,大多数实现该功能的编程语言都不会使用return compliment[rng];关键字-您可以在Google搜索关于这一点的讨论很多。与所有这些“经验法则”一样,如果您认为找到了用其他语言构造无法更好地表示的真实用例,则务必使用BonusCompliment()。不过,通常情况下,您尝试实现的行为是通过这样的if/else完成的:

public class Program {
    private const int MumsBirthday = 3;

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



还值得注意的是,在这里使用return bonus <= 3可以有效地将goto循环变成goto块-永远不会出现循环超过一次的实例,因为它到达终点并只是跳出循环。在do/while中,您将创建一个恭维字符串数组。在大多数情况下,您将作为初学者处理,对象序列应由List 数据结构而不是数组表示。有关此主题的更多详细讨论,请参见此处。
请考虑使用集合初始化程序作为恭维列表,因为这比您做的方式复杂得多:

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是我们在上面定义的列表:

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


评论


\ $ \ begingroup \ $
我很满意反馈,最初我试图将这些称赞放入一个List(甚至在一个类中),但是我找不到让它们返回整数的方法,所以我可以使结果随机(或另一个)方式相同)。
\ $ \ endgroup \ $
–BlackBox
18-2-25在21:38

\ $ \ begingroup \ $
嘿@Stav_K-我刚刚编辑了答案,以包括对如何实现的说明(在底部)。希望有帮助!
\ $ \ endgroup \ $
–本·温赖特(Ben Wainwright)
18-2-25在21:47



\ $ \ begingroup \ $
“”我一直认为人们不应该在代码审查中提早采取措施,因为这样可以在以后节省农业。“” 100%这个。 +1
\ $ \ endgroup \ $
– Finn O'leary
18-2-26在9:47

\ $ \ begingroup \ $
我想补充一点,不应将随机数生成器(Random实例)称为数字,它仍然是您的建议。在随机数部分= new Random(); int rng = number.Next(0,10);,除了应避免的缩写外,名称在逻辑上也应相反。
\ $ \ endgroup \ $
– RaimundKrämer
18-2-26在10:47

\ $ \ begingroup \ $
您的观点是“遵循此建议的有用副作用之一是,您将能够使用不那么冗长的集合初始化程序声明列表” –使用列表没有好处。 在数组上。数组也允许这样做。 var compliments = new [] {“ a”,“ b”};
\ $ \ endgroup \ $
–Rob
18-2-26在11:28



#2 楼

本·温赖特的所有指针都很棒。

但是,我认为有两件重要的事情被忽略了。未来。当然,在您的用例中,这几乎不可能成为一个问题,透彻理解是一件好事,因为您自己可能不会发现。这是对该问题的详细说明。
本质上,您每次生成随机数时都不应创建新的Random实例。您应该共享实例(但不能跨线程共享),以确保您不会持续生成相同的“随机”数。在这种情况下,我会将您的代码重新编写为:

相比而言,这有点次要,但是每次您要求随机称赞时,您都会创建一个新数组。您实际上并不需要每次都做所有的工作,只需要做一次即可。再次,我将其从方法中重构出来,因此它只创建了一次,并从中读取了方法。

#3 楼

除了Ben Wainwright的出色而全面的评论之外,我还要补充:


在接受用户输入时,应始终对其进行清理和规范化。修剪空格,并转换为大写或小写。例如,如果用户输入“ YES”,则您的程序将与“ yes”不匹配。
返回布尔表达式的结果时,更简单并且更容易出错,只需返回表达式即可。例如,

而不是:

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


简单地做:

return bonus <= 3;


评论


\ $ \ begingroup \ $
(欢迎来到CR!)(您似乎错过了本·温赖特的第二次简化。)
\ $ \ endgroup \ $
–灰胡子
18-2-25在23:33