首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >物业自动升级

物业自动升级
EN

Code Review用户
提问于 2013-07-14 18:44:20
回答 2查看 191关注 0票数 0

我正在创建一个应用程序,只是为了实践c#以及新的编程方法。所以我想到了一个想法,我创建了一个应用程序来存储关于“士兵”前的信息。姓名、军衔、头衔等.但这里的诀窍是,我希望士兵头衔在军衔增加时自动升级。

我创建了一个小应用程序来演示这个想法.

士兵类

代码语言:javascript
复制
public class Soldier
{
    public string Name { get; private set; }
    public int Rank { get; private set; }
    public string Title { get; private set; }

    public Soldier(string name)
    {
        Name = name;
        RefreshTitle();
    }

    public void Rankup(int rank = -1)
    {
        if (-1 != rank)
            Rank = rank;
        else
            Rank++;

        RefreshTitle();
    }

    public void RefreshTitle()
    {
        Title = SoldierRankLibrary.GetSoldierTitle(Rank);
    }
}

士兵级图书馆

代码语言:javascript
复制
public class SoldierRankLibrary
{
    private static readonly Dictionary<int, string> RankDictionary = new Dictionary<int, string>
                                                          {
                                                              {0, "Novice"},
                                                              {1, "Second Lieutenant"},
                                                              {2, "First Lieutenant"},
                                                              {3, "Captain"},
                                                              {4, "Major"},
                                                              {5, "Lieutenant Colonel"},
                                                              {6, "Colonel"}
                                                              //etc...
                                                          };

    public static string GetSoldierTitle(int requiredRank)
    {
        return RankDictionary.FirstOrDefault(rank => rank.Key == requiredRank).Value;
    }
}

使用代码

代码语言:javascript
复制
static void Main()
{
    //Create new soldier...
    var soldier = new Soldier("Daniel");

    //Print soldier info...
    PrintSoldierInfo(soldier);

    //Upgrade soldier...
    soldier.Rankup();

    //Print soldier info...
    PrintSoldierInfo(soldier);

    Console.Read();
}

static void PrintSoldierInfo(Soldier soldier)
{
    Console.WriteLine("****************************************");
    Console.WriteLine("Name: {0}", soldier.Name);
    Console.Write("Rank: ");
    switch (soldier.Rank)
    {
        case 0:
            Console.WriteLine("novice");
            break;
        case 1:
            Console.WriteLine("*");
            break;
        case 2:
            Console.WriteLine("**");
            break;
        case 3:
            Console.WriteLine("***");
            break;
        case 4:
            Console.WriteLine("****");
            break;
        case 5:
            Console.WriteLine("*****");
            break;
        case 6:
            Console.WriteLine("******");
            break;
        case 7:
            Console.WriteLine("*******");
            break;
    }
    Console.WriteLine("Title: {0}", soldier.Title);
    Console.WriteLine("****************************************");
    Console.WriteLine();
}

结论

我真的在等待你的答案,我希望你给我详细的信息,我错过了什么,什么我可以做得更好,我如何改进这个代码。

EN

回答 2

Code Review用户

回答已采纳

发布于 2013-07-15 17:55:39

摆脱SoldierRankLibrary

  • GetSoldierRank()属于Soldier类。这就是Rank { get; set; }的作用。
  • Dictionary将被一个enum取代(见下文)。enum不需要在任何类的内部。可以在枚举上使用布尔运算符("<“、"==”、.)

使用Enum代替字典

  • 你的字典是模仿Enum的。换句话说,Enum固有地将一个数字与一个名称相关联。一般来说,使用Enum比字符串更好。
  • 如果效果更好,可以分别使用OfficerRankEnlistedRank枚举。
  • 我喜欢@Nik的“未知”的回答。但我会把它改成"0“而不是”1“。枚举变量的自然默认值为零。
  • 如果基础int值在代码的其他位置很重要,只需确保您将级别按期望的顺序排列即可。

士兵类

  • RankTitle似乎是同一回事。您真的需要通过其基本(整数)值来引用士兵的军衔吗?
  • 显式设置构造函数中的变量。我们都知道.NET类型的默认值,但您想表达的是意图和意义。
  • 在构造函数中彻底设置整个状态。再一次,意图和意义。
  • Rankup() -将名称更改为Promote()。不要传递整数,传递有意义的东西。我们将使用Rank枚举,这样就可以完成账单了。
  • RefreshTitle() -过时了。职级/头衔是一回事。Rank枚举使我们不必处理字符串和int。
  • 财产误用。拥有一个private Title set和一个public RefreshTitle()是没有意义的。将Property视为一种方法。许多现有的代码只是通过使用公共get属性而消失的。
  • 覆盖ToString()。现在PrintSoldierInfo()消失了。

新码

代码语言:javascript
复制
public enum Rank {undefined, BuckPrivate, Sergeant, Lieutenant, Captain}

public class Soldier {
    public string   Name { get; protected set; }
    public Rank     Rank { get; protected set; }

    public Soldier (string name) {
        Name = name ?? "No Name";       // null coalescing.
        Rank = Rank.undefined;   // maybe private if enlisted or lieutenant if officer 
    }

    public void Promote (Rank newRank) {
        if ((int)this.Rank < (int)newRank ) this.Rank = newRank;
        // we don't allow Demotion in this method. 
    }

   public override string ToString() {
       Stringbuilder me = new Stringbuilder();  // need to import System.Text to use Stringbuilder

// C# string formatting avoids clumsy string concatination; clearer and less error prone
       me.AppendLine("Name: {0}  Rank: {1}", Name,Rank); 

       return me.ToString();  // Stringbuilder must be converted to a string.
   }
}

使用士兵

代码语言:javascript
复制
Soldier grunt = new Soldier("Sad Sack");
grunt.Promote(Rank.Sergeant);
Console.WriteLine (grunt); // ToString() is automagically called.
票数 3
EN

Code Review用户

发布于 2013-07-15 06:30:55

您可以将Rank类型更改为某些enum

代码语言:javascript
复制
public enum Rank
{
    Unknown = -1,
    Novice = 0,
    SecondLieutenant = 1,
    ....
}

public static class SoldierRankLibrary
{
    private static readonly Dictionary<int, string> RankDictionary = new Dictionary<Rank, string>
                                                      {
                                                          {Rank.Novice, "Novice"},
                                                          ....
                                                      };

     public static string DisplayName(this Rank rank)
     {
         if (RankDictionary.ContainsKey(rank))
         {
             return RankDictionary[rank];
         }
         return rank.ToString();
     }
}

public class Soldier
{
     public string Name { get; private set; }
     public Rank Rank { get; private set; }
     public string Title { get { return Rank.DisplayName(); } }

     public Soldier(string name, Rank rank = Rank.Unknown)
     {
         Name = name;
         Rank = rank;
     }

     public void Rankup()
     {
         Rank++;
     }
}
票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/28471

复制
相关文章

相似问题

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