【问题标题】:How to change a class without re-coding?如何在不重新编码的情况下更改课程?
【发布时间】:2018-12-05 13:16:30
【问题描述】:

我正在我的项目中创建一个驾驶执照对象,所有员工都将拥有一个与他们唯一的时钟编号相关联的驾驶执照对象。我的数据库中有一个单独的表格用于驾驶执照,但将来需要添加更多类型的车辆,有没有在不重新编码的情况下做到这一点? 我数据库中的列与下面类的属性相同

public class LicenseDTO
{
    public int ClockNo { get; set; }
    public bool CBalance { get; set; }
    public bool MR16 { get; set; }
    public bool OrderPicker { get; set; }
    public bool Reach { get; set; }
    public bool Pedestrian { get; set; }
    public bool Lorry { get; set; }
    public bool Sweeper { get; set; }
    public bool Washer { get; set; }
}

编辑

我已经尽力做到最好,但我觉得它真的很啰嗦,可以用更有效的方式来完成。这是我的代码的更新版本。

public class LicenseDTO
{
    public int ClockNo { get; set; }
    public List<Common.VehicleTypeDTO> Vehicles { get; set; }
}

public class VehicleTypeDTO
{
    public string VehicleType { get; set; }
    public bool Allowed { get; set; }
}

private void btnClockCardIn_Click(object sender, EventArgs e)
    {
        Common.LicenseDTO License = new Common.LicenseDTO();
        List<Common.VehicleTypeDTO> Vehicles = new List<Common.VehicleTypeDTO>();
        Common.VehicleTypeDTO CBalance = new Common.VehicleTypeDTO();
        Common.VehicleTypeDTO MR16 = new Common.VehicleTypeDTO();
        License.Vehicles = Vehicles;
        CBalance.VehicleType = "CBalance";
        CBalance.Allowed = true;
        MR16.VehicleType = "MR16";
        MR16.Allowed = false;
        License.Vehicles.Add(CBalance);
        License.Vehicles.Add(MR16);
        foreach (Common.VehicleTypeDTO Vehicle in License.Vehicles)
        {
            MessageBox.Show(Vehicle.VehicleType + " " + Vehicle.Allowed);
        }
    }

【问题讨论】:

  • 不重新编码?可能是通过 xml 文件,但为什么呢?
  • 基本上我已经参加了一年的实习,也是最后一个实习的学生,所以没有人会维护这些应用程序,以防万一
  • 而不是定义“车辆”列表,而是为每个带有类型标识符的许可证收集车辆。
  • 不要太拘泥于试图保持你的代码简短。冗长不是犯罪。我看不出你的编辑有什么问题。它似乎做你想做的事。如果您不顾一切,请在创建时内联您的 VehicleTypeDTO 属性设置:new Common.VehicleTypeDTO() { VehicleType = "CBalance", Allowed = true};
  • 好的,谢谢你的帮助:)

标签: c# sql-server winforms


【解决方案1】:

为什么不创建一个包含车辆类型的表?将来您可以访问您的表格并插入更多类型。

public class VehicleTypeDTO
{
    public int Id{ get; set; }
    public string Name{ get; set; }
}

public class LicenseDTO
{
    public int Id { get; set; }
    public List<VehicleTypeDTO> VehicleTypes { get; set; }
}

【讨论】:

  • 为您创建一个示例(控制台应用程序)github.com/parxal/53633241,并请检查:Database Diagram.JPG,Database script.sql
【解决方案2】:

您应该创建了一个具有 ClockNo 和 CBalance 属性的实体 LicenseDTO 以及一个 Vehicle 类型的数组。这将是一个界面。 Vehicle 接口可以定义车辆具有的任何常用方法。并且所有未来的车辆都必须实现该接口。这样您就不必更改任何代码。您当前的代码不能在不编辑的情况下“更改”。您可以尝试使用另一个实现上述接口的实体类来扩展您的 LicenseDTO 类。但如果不进行编辑,您将无能为力。

如果您想要可维护性,请从使用接口、存储库模式、抽象类和依赖注入开始。

【讨论】:

    【解决方案3】:

    不要在数据库中使用多个位列来指示不同类型的车辆,而是使用一个 VehicleType 表。然后,您可以添加任意数量的不同车辆类型,并使用 VehicleTypeID 来唯一标识它们。然后,您可以将越来越多的车辆类型添加到表中,而无需编写更多代码。

    VehicleType
        VehicleTypeID int
        VehicleTypeName varchar(50)
    
    public class LicenseDTO
    {
        public int ClockNo { get; set; }
        public int VehicleTypeID { get; set; }
    }
    

    如果您想针对单个 ClockNo 拥有多种类型的车辆,请使用 int 列表:

    public class LicenseDTO
    {
        public int ClockNo { get; set; }
        public List<int> VehicleTypes { get; set; }
    }
    

    或者,您可以引用 VehicleType 对象而不仅仅是 ID。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-10
      • 2010-09-07
      • 2011-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多