首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >面向对象编程的帮助或建议?

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

Stack Overflow用户
提问于 2018-06-09 08:53:50
回答 1查看 63关注 0票数 -1

我是个新手程序员。我已经写了9到11周的脚本了。不管我是如何按照你们推荐的帖子买书的。我正在努力学习"OOP",这可能是一个小小的挑战。我已经做了书后面的练习。第一个练习告诉我要编写一个控制台应用程序,提示用户输入运动类型和教练名称。

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

我的代码:

代码语言:javascript
复制
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;
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-09 09:15:50

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

代码语言:javascript
复制
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;
    }
}

现在你不必处理一项可能没有教练名字或类型的运动,你可以摆脱那些丑陋的“没有给出”的值:

代码语言:javascript
复制
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);
}

请注意,任何时候都不存在无效的体育项目。

这种方法确实创建了更多的临时变量,但这并不一定是一件坏事,在交易中,您永远不必担心在使用之前验证一个Sport。

如果您确实希望保持类的可变性,就像在原始代码中一样,我建议不要使用Not Given,因为它们被认为是code smell。例如,如果有人给他们的孩子取名为“没有给予”,而他长大后成为了一名教练,那么这种做法就会失败。为了表示缺少的值,惯例是简单地使用null

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

代码语言:javascript
复制
public static string GetSportsName()
{
    Console.Write("Enter Sports Name : ");
    var typeOfSport = Console.ReadLine();
    return typeOfSport;
}

您还会注意到,我将大多数变量声明更改为使用var,这允许编译器从赋值中推断类型。

最后要注意的是,用数字来命名变量(例如sport01)是一种糟糕的形式。如果您有多个,请将它们放入数组或List中。如果你没有多个,不要只在上面放一个01,因为开发人员可能会期望在某个地方有一个02或03。如果你确实需要两个逻辑上不属于一个列表的实例,给它们起个名字来描述它们的用途,例如morningSporteveningSport之类的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50769988

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档