初始化对象集合的最佳位置在哪里?我开始研究一个以前对数据库调用非常敏感的旧项目...所以我们有类似的东西:
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
答案 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)所提到的那样。