面向对象的编程帮助或建议?

时间:2018-06-09 00:53:50

标签: c# oop

我是一名新手程序员。我已经写了大约9到11周的脚本。我有没有按照你们很多推荐的帖子购买书籍。我正在努力学习“OOP”,这可能没那么具有挑战性。我在书的后面做过练习。第一个练习告诉我制作一个控制台应用程序,提示用户进行一种运动,以及教练的名字。

  1. 我的第一个问题是,我的问题是对吗?
  2. 是否有其他方法可以做同样的事情,但是在不同的过程中?
  3. 我确实意识到我没有任何“尝试/捕获”,练习告诉我不要添加这个练习题。所以我们稍后会担心这件事。
  4. 我的代码:

    static void Main(string[] args)
    {
        Sport sport01 = new Sport();
        sport01.TypeOfSport = GetSportsName();
        sport01.CoachesName = GetCoachesName();
        Console.WriteLine();
        Console.WriteLine(sport01.ToString());
        System.Threading.Thread.Sleep(8000);
    }
    // Prompting user input for type of sport.
    public static string GetSportsName()
    {
        string typeOfSport;
        Console.Write("Enter Sports Name : ");
        typeOfSport = Console.ReadLine();
        return typeOfSport;
    }
    // Prompting user inout for coaches name.
    public static string GetCoachesName()
    {
        string coachesName;
        Console.Write("Enter Coaches Name : ");
        coachesName = Console.ReadLine();
        return coachesName;
    }
    
    class Sport
    {
        protected string typeOfSport;
        protected string coachesName;      
        public Sport()
        {
            typeOfSport = "Not Given";
            coachesName = "Not Given";
        }
        public Sport(string typeOS, string coachesN)
        {
            typeOfSport = typeOS;
            coachesName = coachesN;
        }
        public string TypeOfSport
        {
            get { return typeOfSport; }
            set { typeOfSport = value; }
        }
        public string CoachesName
        {
            get { return coachesName; }
            set { coachesName = value; }
        }
        public override string ToString()
        {
            return "\n" + "\n" +
               "\nSports Name : " + typeOfSport +
               "\n" +
               "\nCoaches Name : " + coachesName;
        }
    }
    

1 个答案:

答案 0 :(得分:0)

将课程视为immutable有时会更好;一旦创建,它永远不会改变。例如:

class Sport
{
    protected readonly string typeOfSport;
    protected readonly string coachesName;      

    public Sport(string typeOfSport, string coachesName)
    {
        this.typeOfSport = typeOfSport;
        this.coachesName = coachesName;
    }
    public string TypeOfSport
    {
        get { return typeOfSport; }
    }
    public string CoachesName
    {
        get { return coachesName; }
    }
    public override string ToString()
    {
        return "\n" + "\n" +
           "\nSports Name : " + typeOfSport +
           "\n" +
           "\nCoaches Name : " + coachesName;
    }
}

现在你不必处理一个可能没有教练姓名或类型的运动,你可以摆脱那些丑陋的" Not Given"值:

static void Main(string[] args)
{
    var typeOfSport = GetSportsName();
    var coachesName = GetCoachesName();
    var sport = new Sport(typeOfSport, coachesName);
    Console.WriteLine();
    Console.WriteLine(sport.ToString());
    System.Threading.Thread.Sleep(8000);
}

请注意,任何运动都不存在无效。

这种方法确实创造了更多临时变量,但这并不一定是坏事,在交易中你永远不必担心在使用之前验证一项运动。

如果您确实希望将课程保持为可变,就像在原始代码中一样,我建议不要使用magic number(即" Not Given"),因为这些被认为是一个code smell。例如,如果有人给他们的孩子命名并且没有给出他们的话,那就会破坏。他长大成为一名教练。为了表示缺失值,惯例是简单地使用null

此外,通常建议您在第一次使用变量时声明变量,如下所示:

public static string GetSportsName()
{
    Console.Write("Enter Sports Name : ");
    var typeOfSport = Console.ReadLine();
    return typeOfSport;
}

您还会注意到我将大多数变量声明更改为使用var,这允许编译器根据所分配的值推断出类型。

作为最后一点,用一个数字命名变量(例如sport01)是不好的形式。如果您有多个,请将它们放入数组或List。如果你没有多个,不要只在那里放一个01,因为开发人员可能会认为某处有02或03。如果确实需要两个逻辑上不属于列表的实例,请给出描述其用途的名称,例如: morningSporteveningSport或其他。