在哪里初始化另一个类的集合

时间:2015-05-27 23:09:03

标签: c# winforms class-design

初始化对象集合的最佳位置在哪里?我开始研究一个以前对数据库调用非常敏感的旧项目...所以我们有类似的东西:

public class Car
{
    public int ID { get; set; }
    public string Make { get; set; }

    public Car(int id) {}

    public void AddCar() {}
    public void EditCar() {}
    public void PopulateAllCarInfo() {}
}

public class CarCollection : IEnumerable
{
    public int this[int index] { get return CarIDs[index - 1] }

    public CarCollection(string database)() // Populates CarIDs

    public List<int> CarIDs;

    public Car GetCarByID(int id){
        Car c = new Car(id);
        c.PopulateAllCarInfo();
        return c;    
    }
}

因此,为了检索完整的集合,我需要这样做

CarCollection cars = new CarCollection("database");
List<Car> carDetails = new List<Car>();
foreach (int carID in cars)
{
    Car c = new Car(carID);
    c.PopulateAllCarInfo();
    carDetails.Add(c);
}

我是团队的新手,我将重构这一点以了解代码库。填充汽车系列的最佳方式是什么?单独的类是否过度杀伤?

我正在考虑尝试创建一个新的CarCollection ...

public CarCollection
{
    // This method would populate the info for all cars
    public List<Car> RetrieveCars("database") {}

    // Leave this so I can still retrieve only Car data for single cars if I want
    public List<int> ListCarIDs() {}
}

将涉及只访问一辆汽车的方法移至Car

public Car
{
    public Car GetCarByID(int id) {} // Populate Car
}

问题:CarCollection类是否过度杀伤?你在哪里放置检索集合的方法? (注意我们没有使用MVC或任何其他模式)

我确实找到了这个,但它没有任何关于如何检索完整集合的建议:https://softwareengineering.stackexchange.com/questions/196125/is-it-a-good-practice-to-create-a-classcollection-of-another-class

2 个答案:

答案 0 :(得分:1)

  

填充汽车系列的最佳方式是什么?

类不应该从数据源填充自己的数据 - 最糟糕的是,将类绑定到特定的数据源,最多会增加对某些数据源的弱依赖性。

通常,诸如 repository 之类的类负责使用对象的构造函数或公共属性从源加载数据,并使用该数据创建对象。

因此,在您的情况下,一个好的设计是创建一个CarRepository,它可以通过从源加载数据来创建Car的集合,并将任何更改保存回源。

  

CarCollection类是否过度杀伤?

是的 - 当你只需要迭代集合(而不是添加它)时,你应该只能使用List<Car>作为具体类型和IEnumerable<Car>。您肯定不应实现非通用IEnumerable,因为在枚举集合时会丢失类型安全性。

答案 1 :(得分:1)

在我看来,您的项目正在使用Active Record模式,其中每个类都是数据库存储中表的映射。如果这是真的,那么您的问题的答案将是:

  

填充汽车系列的最佳方式是什么?

我会在你的Car类中定义一个静态函数来检索Car的集合。例如:

public class Car
{
    //.....

    public static IEnumerable<Car> FetchAll() 
    { 
        // code to retrieve all car will be put here
    }
    public static Car FetchOne(int carID)
    {
        // code to retrieve one car will be put here
    }
    public static Car FetchBy(string make, int year )
    {
        // further codes to retrieve car by conditions can be put here
    }
    // and so on....
}

在您的实施代码中,您可以使用以下内容:

IEnumerable<Car> allCar = Car.FetchAll();

Pro:对汽车数据库的所有查询都在一个地方。

缺点:1)如果您需要查询与Car有关系的不同表中的字段,则会增加复杂性。 2)你的课程将与数据库实现相结合,这会降低代码的可扩展性,就像@(D Stanley)所提到的那样。