2

随着我继续在 C# 中进一步增强我的刽子手游戏以帮助我学习语言并像程序员一样思考,我认为其中的一些方法应该放在单独的类中。现在,所有代码都在 Form 类(Windows Form)上。这使得调用所需的方法变得非常容易,因为我只需要使用方法名称并使用必要的参数。而且,由于它只是一个简单的刽子手游戏,这可能是最好的方法。我不知道。

具体来说,我已经读取了一个包含数千个单词的 .txt 文件的方法之一,将其拆分为一个数组,对数组进行洗牌,然后调用另一个方法来做其他事情。

当我阅读了一些关于 C# 的文献时,有人告诉我你想尽可能多地隐藏你的类。这样你就不能通过传递它无法处理的数据来破坏你的类。但这似乎意味着我必须向该类添加一个属性才能访问它,此外还必须创建该类的对象,才能使用我想要的方法。这似乎是一种拜占庭式的方式来访问该方法。

正如有经验的程序员所看到的,我还没有像程序员那样思考。我的重点是尽早养成正确的习惯,而不是以后再改掉坏习惯。

所以问题基本上是应该在这样的简单程序中将此方法设置为私有吗?最佳做法是什么?

有问题的代码如下(读取文件、表单数组、随机播放等的方法):

private void ReadFile(StringBuilder hintlength, string[] wordlist, string lettercountpath) 
{
  string fileContent = File.ReadAllText(lettercountpath); //Read file
  string[] array = fileContent.Split((string[]null, StringSplitOptions.RemoveEmptyEntries); //Form array

  Random rand = new Random(); 

  for (int i = 0; i < array.Length; i++) // Shuffle algorithm 
  {
    int randIndex = rand.Next(i, array.Lenth);
    string temp = array[randIndex];
    array[randIndex] = array[i];
    array[i] = temp;
  }

  for (int i = 0; i < 10; i++0)  //Assigns shuffled array into wordlist array
    wordlist[] = array[i];

  if (j > 9) //Checks counter to see how many times it's been clicked
     j =0;

  Start.Enabled = false;
  NewWord.Enabled = false;

  WordSelection(hint length, wordlist); // Calls WordSelection method 

  radioButton1.Enabled = false;
  radioButton2.Enabled = false;
  radiobutton3.Enabled = false;

  if (remainderWords == 1) // Checks remaining words counter
     remainderWords = 10;
}
4

2 回答 2

5

您应该根据类成员在设计中的位置来设置类成员的可见性,而不是根据类的大小或任何其他考虑因素。

  • 如果方法或字段表示或执行与类的工作方式相关的事情,但与类的用户看到它的方式无关,则将成员标记为私有。它的花哨名称是“实现细节”:您不想让它们暴露以确保您以后可以更改它们。
  • 如果一个方法或一个字段对于类对其用户所做的事情是必不可少的,则将该成员公开:否则,没有人能够使用该成员,从而使整个类变得无用。
  • 如果您的类是为继承而设计的,并且方法或字段准备供此类及其子类独占使用,则使该方法受到保护。
  • 如果方法或字段是需要在同一程序集中的其他类可见的实现细节,则将 member 设为internal. 您可以混合internalprotected,进一步限制对同一程序集中的派生类的访问。

在设计软件时,您应该在脑海中开始进行这种分类。当您设计较小的系统时,进行这种分类要容易得多。但是,随着系统规模的增加,正确操作的重要性会大大增加。

于 2013-08-19T14:14:12.663 回答
4

每个职责都有一个类的概念。对于您的 Hangman 程序,您需要一个从文件中读取的随机单词。这是构建新类的好时机:读取一个单词文件并给你一个随机单词的类。

您将保密的部分是单词的实际集合。主游戏通过了解整个集合没有任何好处,它只需要一个随机单词。因此,您可以构建类似的东西:

public class HangmanWordProvider
{
    private string[] _words;

    public HangmanWordProvider(string inputfile) {
        // code to read file into _words variable here
    }

    public string GetRandomWord()
    {
        // code to return a random word from the collection
    }
}

然后,您将创建一个单词 provider 的新实例以在游戏中使用。您的 mainHangmanGame现在不再需要阅读 word 文件或从集合中获取随机单词。你只需打电话给你wordprovider.GetRandomWord(),就知道你得到了所需的数据。这是关注点分离。

现在想象一下你的游戏在增长,你想确保提供者不会连续两次返回相同的单词。这将是您在 中构建的东西WordProvider,而无需触及游戏类本身。

您可以走得更远,在某些时候使用数据库或网络服务来提供文字……您仍然只需要更改WordProvider,而不是您的游戏。

类中的private部分是关于隐藏其他类不需要知道的部分的实现。在您的情况下,游戏不需要知道单词列表是如何存储的、从哪里加载的,或者您使用什么方式来获得随机结果。它只需要知道它如何获得一个随机单词。

于 2013-08-19T14:14:34.467 回答