Oop 单一责任原则-从文件加载列表?

Oop 单一责任原则-从文件加载列表?,oop,class-design,single-responsibility-principle,Oop,Class Design,Single Responsibility Principle,假设我有一辆汽车: class Car { string GetMake() string GetModel() int GetYear() } 我有一个定制的CarService类,它包含一个汽车列表: class CarService { void AddCar(Car car) void RemoveCar(Car car) List<Car> GetCars() ... other methods removed for clarity...

假设我有一辆汽车:

class Car 
{
  string GetMake()
  string GetModel()
  int GetYear()
}
我有一个定制的CarService类,它包含一个汽车列表:

class CarService
{
  void AddCar(Car car)
  void RemoveCar(Car car)
  List<Car> GetCars()
   ... other methods removed for clarity...
}
class服务
{
无效添加车(汽车)
无效删除车辆(汽车)
列表GetCars()
…为清晰起见,删除了其他方法。。。
}
现在,我想将一个汽车列表从文件加载到CarService类。我以前的OOP本能是将其作为一个类似于CarService类上的LoadFromFile()的方法。然而,随着我对SRP和可测试性的了解,我不太确定

遵循单一责任原则,正确的设计方法是什么?我应该上货车课吗

更新


我认为解决方案应该在各种语言中是相同的,但是我将使用C++。如果我使用C#、Java或python,我的问题将是相同的。

根据您要用什么语言来实现这一点,我想说一个
load\u carservice
函数或等效的静态方法就足够了

静态方法解决方案可能会违反SRP,因为序列化格式可能会更改,而类的其余部分保持不变。这就是为什么我从不使用强迫我把所有东西都放在一个类中的语言编程的原因之一。如果您的语言迫使您这样做,并且您希望严格遵守SRP,那么将需要额外的类。

您可能不应该有
CarLoader
类。至少根据您所展示的内容,您的
CarService
类看起来也不是很有用。至少马上,你的
CarService
基本上是在
列表上构建一个
集。我想我应该这样写代码:

class Car { 
// ...
    friend std::istream &operator>>(std::istream &is, std::Car &c) { 
        return is >> c.model >> c.year >> c.color;
    }
    friend std::ostream &operator<<(std::ostream &os, std::Car const &c) {
       return os << c.model << "\t" << c.year << "\t" << c.color;
};

std::set<Car> cars;

std::ifstream car_file("cars.txt");

// read data from the file:
std::copy(std::istream_iterator<Car>(car_file),
          std::istream_iterator<Car>(),
          std::inserter(cars));
class车{
// ...
friend std::istream&operator>>(std::istream&is,std::Car&c){
返回值为>>c.model>>c.year>>c.color;
}

friend std::ostream&operatorWell我不太可能使用静态方法,因为我从可测试性的角度了解到这些方法是有害的。我不一定要严格遵守SRP,但如果通常认为它是更好的设计,那么我可能会选择SRP解决方案。对不起,是的,CarService确实有其他功能,而不是我的解决方案是聪明的,并且很好地利用C++语言。我的CARService类很可能会被重构得更好,但是我更关心的是从SRP范例下从一个文件加载一个对象的一般情况。在你的例子中,如果有两个不同的文件类型我想加载F,那会怎么样呢?rom?@User:这要看情况。根据具体情况,使用代理类提供来自不同来源的转换可能很有用,但很难对这样一个一般性问题给出非常具体的建议。