我是大学生(计算机科学),刚刚开始了C#编程课程。
对于我们的作业,我一直在使用一个名为“Display”的类,我在其中放置了可以在整个项目中多次使用的控制台输出。例如,请求继续或退出程序。我没有在Main()
中多次输入,而只是从Display
类调用该方法。
上一堂班的另一名学生告诉我,我不应该这样做。这是一个糟糕的编码实践,我应该只包括主类中的所有方法(包含Main()
),并且只在绝对需要时才使用其他类。
我只是在寻找一些意见和建议。
我被要求包含代码。我本来打算,但不想让这篇文章太久。我选择了一个相当短的作业。我想澄清一下,我只是在学习,所以代码并不像你们许多人所能写的那么优雅。建设性的批评非常受欢迎。
最终我只是在玩类的使用。我知道Display类中的一些方法可以很容易地在Main()中。
这是包含Main()
的Program类namespace Chapter_6_10
{
class Program
{
static void Main()
{
string triangle = "", result = " ";;
char printingCharacter = ' ';
int peakNumber = 0;
Display.Instructions();
Display.Continue();
// perform a do... while loop to build triangle up to peak
do
{
Console.Clear();
Request.UserInput(out printingCharacter, out peakNumber);
int counter = 1, rowCounter = 0;
do
{
do
{
triangle += printingCharacter;
rowCounter++;
}
while (rowCounter < counter);
counter++;
rowCounter = 0;
triangle += "\n";
}
while(counter != peakNumber);
// perform a do... while loop to build triangle from peak to base
do
{
do
{
triangle += printingCharacter;
rowCounter++;
}
while (rowCounter < counter);
counter--;
rowCounter = 0;
triangle += "\n";
}
while (counter != 0);
Console.Clear();
Console.WriteLine(triangle); // display triangle
Display.DoAgain(out result); // see if user wants to do another or quit
triangle = "";
}
while (result != "q");
}
}
这是Display类
namespace Chapter_6_10
{
// This class displays various outputs required by program
class Display
{
// This method display the instructions for the user
public static void Instructions()
{
Console.WriteLine("\nThis program will ask you to enter a character to be used "
+ " to create triangle."
+ "\nThen you will be asked to enter a number that will represent the"
+ "\ntriangles peak."
+ "\nAfter your values have been received a triangle will be drawn.");
}
// This method displays the choice to continue
public static void Continue()
{
Console.WriteLine("\n\nPress the enter key when you are ready to continue...");
Console.ReadLine();
}
// This method displays an error message
public static void Error(string ErrorType)
{
Console.WriteLine("\nYou have entered \"{0}\", which is a value that is not valid!"
+ "\nThis is not rocket science."
+ "\n\nTry agian...", ErrorType);
}
// This method will ask user to press enter to do again or 'q' to quit
public static void DoAgain(out string Result)
{
string input = " ";
Console.WriteLine("\nPress enter to run program again"
+ "\nor type the letter 'q' to close the application.");
input = Console.ReadLine();
// convert input to lowercase so that only one test needed
Result = input.ToLower();
}
}
这是请求类
namespace Chapter_6_10
{
// This class is used to get user input
class Request
{
public static void UserInput(out char PrintingCharacter, out int PeakNumber)
{
string input = " ";
char testCharacter = ' ';
int testNumber = 0;
// a do... while loop to get Printing Character from user
// use TryParse() to test for correct input format
do
{
Console.Write("\nPlease enter a character to be used to build triangle : ");
input = Console.ReadLine();
bool result = char.TryParse(input, out testCharacter);
if (result)
{
}
else
{
Console.Clear();
Display.Error(input);
input = " ";
}
}
while (input == " ");
// a do... while loop to get number from user
// use TryParse() to test for correct input format
do
{
Console.Write("\nPlease enter a number <between 1 and 10> for the peak of the triangle : ");
input = Console.ReadLine();
bool result = int.TryParse(input, out testNumber);
if (result)
{
if ((testNumber > 0) && (testNumber < 11))
{
}
else
{
Console.Clear();
Display.Error(testNumber.ToString());
input = " ";
}
}
else
{
Console.Clear();
Display.Error(input);
input = " ";
}
}
while (input == " ");
// assigned received values to 'outs' of method
PrintingCharacter = testCharacter;
PeakNumber = testNumber;
}
}
就是这样。这会被认为是一种无法实现的代码方式吗?我该如何改进呢?
感谢目前为止的所有输入。这对我很有价值。
答案 0 :(得分:15)
完善且精心设计的课程结构对于遵守object-oriented design原则非常重要。
以下是考虑将相关代码分解为单独类的几个原因:
它创造了分工并隔离了差异化任务。这有时被解释为Single Responsibility Principle,它表示每个对象(类)应该只有一个责任,并专注于完成单个任务。 Encapsulation在这里也很快成为一个重要的原则,基本上意味着数据与负责操作该数据的方法捆绑在一起。这也有助于减少错误进入代码的机会。
它可以帮助宣传code reuse。使用已编写的代码将现有类带入其他应用程序通常要容易得多,而不是将代码分散到整个应用程序中。为什么一遍又一遍地重写相同的代码?
精心设计的类结构可以创建逻辑层次结构,使您的代码更易于理解和概念化,并使您的应用程序从长远来看更容易维护。这就是为什么我们将计算机上的文件组织到文件夹中,以及我们生活中的其他一切(或者至少我们尝试过)的原因。
答案 1 :(得分:8)
这是一个糟糕的编码实践,我应该只包括主类中的所有方法[...],并且只在绝对需要时才使用其他类。
我绝对不同意。这种想法最终会导致一些爆炸性的厨房水槽课程,最终只会做所有。
如果我们谈论结构化编程,你的同事是对的,你可能只有子程序而没有类 - 组织功能的主要方法是将它分成子程序。但是,我们在这里谈论面向对象编程,它还为您提供了将功能划分为不同类的方法。毕竟,要使用类,否则我们不会调用此OOP!
如果我是你,我宁愿在你需要的时候采用一种相当自由的方法来定义新类。
P.S。:不言而喻,确实有最好的做法可以帮助您决定是否需要新课程,以及如何设计课程。 (参见例如Cody Gray的回答。)我只想在此指出,在OOP中主动避免类绝对没有意义。
答案 2 :(得分:6)
永远不会 倾听那些说“这是好习惯”或“这是不好的做法”的人,如果他们无法向您解释 为什么 这是好事还是坏事。就像在其他所有领域一样,编程中存在许多刻板印象,试图避免它们。
对于您的特定示例,这有点模糊,因为我实际上并不知道您的类的功能,我不认为在单独的类中分离IO功能是一个非常糟糕的主意。然而,这实际上取决于它的作用,是否独立等。还取决于个人品味:))
答案 3 :(得分:0)
一般来说,如果你多次输入相同的东西,而不是出现问题,我想。封装这样的显示例程实际上是很好的形式。它允许您轻松更改多个实例的输出,尤其是错误消息等内容。
他可能来自更多的C风格背景,而C#更像是一种类似Java的东西。允许自由使用课程,甚至鼓励。