是使用私人还是公共方法

时间:2013-08-19 14:02:04

标签: c# encapsulation private-methods

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

具体来说,我之一的方法是读取一个包含数千个单词的.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;
}

2 个答案:

答案 0 :(得分:5)

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

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

在设计软件时,您应该开始考虑这种分类。在设计较小的系统时,更容易进行此分类。但是,随着系统规模的扩大,正确行事的重要性会大大增加。

答案 1 :(得分:4)

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

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

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

然后,您将创建一个在游戏过程中使用的单词提供程序的新实例。您的主HangmanGame现在不再需要为阅读单词文件或从集合中获取随机单词而烦恼。您只需致电wordprovider.GetRandomWord(),即可获得所需数据。这是关注点的分离。

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

您可以更进一步,在某些时候使用数据库或网络服务提供单词......您仍然只需要更改WordProvider,而不是您的游戏。

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