我的代码:
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;
}
}
}
#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 \ $
您的观点是“遵循此建议的有用副作用之一是,您将能够使用不那么冗长的集合初始化程序声明列表” –使用列表没有好处。
\ $ \ 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
评论
我见过的最好的C#初学者程序。继续学习!赞美中的拼写/语法(它们是硬编码的,所以从技术上讲是对的,对吗?):有才华->有才华,你是->你是或你是。
请不要更新您问题中的代码以合并答案的反馈,否则会违反“代码审查”的“问题+答案”样式。这不是一个论坛,您应该在其中保留问题的最新版本。收到答案后,请查看您可能会做什么和可能不会做什么。
@ Hosch250不会弹出气泡或任何东西,但是我很少在多个地方使用诸如goto之类的奥秘构造来遇到C#代码。继续学习确实是个好主意。