创建一个类似于类的“Name”属性的枚举

时间:2015-04-10 17:33:56

标签: c# enums renaming

我们的团队一直在慢慢重构代码以实现SOLID实践并实施更好的命名约定。我们遇到了一个问题,我们的枚举当前与我们需要创建的另一个类名称相同 - " Department。"

现在,我们有一个代表不同部门的枚举,例如:

Department.HumanResource
Department.InformationTechnology

这允许我们在这种情况下使用该枚举快速引用基于友好名称的部门而不是基础整数ID:

Employee.IsInDepartment(Department.InformationTechnology)

它不是" Type"或"状态"或类似的东西,这是命名枚举的常用方法。我们认为可能像" DepartmentName"但这感觉有点奇怪,因为系类会有#34;姓名" property,此枚举也应该是Department类的属性。

我意识到命名是主观的,所以我想提出问题:

我们是从错误的角度看待这个吗?还有另一种方法可以实现这一点,我们正在忽视它吗?

5 个答案:

答案 0 :(得分:1)

因为你提到想要拥有" enum"是函数类的表示(但不一定每次使用引用都会加载类'数据),您可能会考虑这样的方法。它可以使代码感觉像枚举,类似于类的功能,但不会在数据存储之前进行任何不必要的访问以填充属性,直到需要它们为止。

public class Department
{
  public int ID { get; private set; }

  //follow this pattern for property values that need to be populated from a data store.
  private string name;
  public string Name
  {
     get{ EnsureLoad(); return name; }
     set{ EnsureLoad(); name = value; }
  }

  public static Department HR{ get{ return GetEmptyDepartment( 1 ); } }
  public static Department IT{ get{ return GetEmptyDepartment( 2 ); } }

  private static Department GetEmptyDepartment(int departmentId)
  {
       return new Department()
       {
           ID = departmentId
       };
  }

  private void EnsureLoad()
  {
     //if not loaded
     //lazy load properties using the ID property against the data store.
  }
}

答案 1 :(得分:0)

在所有这些情况下(虽然你的例子存在极大的缺陷,但它会弹出很多)我通常将枚举命名为<thing>Type,或者你的DepartmentType。可以说它是否100%正确,但很容易理解。

至于为什么存在缺陷,实际的部门列表应该来自数据库,因为这个列表会随着时间的推移而发展。每次在企业中添加新部门时,您都不希望继续重新编译项目。

答案 2 :(得分:-1)

对不起,这是DepartmentType以及命名约定的最佳实践的方法,无论你喜不喜欢,你有一个具体的类,如果你想遵循最佳实践,这必须被命名为部门,这使我们得到枚举这必须是遵循命名约定的最佳实践的DepartmentType,所以既然你需要class和enum,我会像这样实现它:

创建枚举:

public enum DepartmentType {IT, HR,..... }
在Department类中,将Enum添加为属性:

public Class Department
{
  public Name {get;set;}
  .
  .
  .

  public DepartmentType {get;set;}

}

现在您可以使用DepartmentType枚举,无论您是否具有部门对象,或者您希望在任何方法中将其用作普通文件。

修改

另一种方法是去除Enum并在Department类中创建静态int值:

   public class Department
    {
       Public string Name {get;set;}
       ...
       ...
       ...
       public static readonly int IT = 1;
       public static readonly int HR = 2;
     }

现在您可以将它用作Department.ITDepartment.HR,.....而无需实例化Department类的对象,简而言之就像Enum一样使用。

答案 3 :(得分:-1)

这取决于。您希望通过enum完成什么?如果你想要关注不同部门类型而不管部门的名称是什么,那么让enum DepartmentType变得非常有意义。例如:

if (department.Name == "Information Technology")
如果您的IT部门名称已更改但您仍希望在该部门执行相同的操作,则

可能会很糟糕。然而,

if (department.Type == DepartmentType.InformationTechnology)

不关心部门的名称是什么;只要它代表IT部门,您的应用程序仍然有效。

此外,正如其他答案所述,如果您希望唯一地标识您真正想要使用其主键的部门。通过为您的班级分配static readonly字段,您仍然可以在代码中获得可读性:

public static readonly int InformationTechnology = 1;

允许您在不明确引用数字的情况下访问ID:

if (department.Id = Department.InformationTechnology)

虽然这种方法的缺点是,如果要在没有魔术整数的情况下继续检查,则在添加新的Id时仍需要重新编译代码。

答案 4 :(得分:-1)

在课堂上使用consts:

public class Department
{

     //Property to hold the department ID
     public int DepartmentID{ get; set; }

     public const int HumanResources = 1;
     public const int InformationTechnology = 2;
     //And so on..

}

然后,如果Employee.IsInDepartment需要一个int,你可以使用:

Employee.IsInDepartment(Department.HumanResources)...