2

假设我有一个汽车类:

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...
}

现在我想将汽车列表从文件加载到 CarService 类。我以前的 OOP 直觉是将其作为 CarService 类上的 LoadFromFile() 之类的方法。但是,当我现在正在学习 SRP 和可测试性时,我不太确定。

遵循单一职责原则,正确的设计方法是什么?我应该有一个 CarLoader 类吗?

更新

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

4

2 回答 2

1

根据您要实现的语言,我会说一个load_carservice函数或等效的静态方法就足够了。

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

于 2011-07-22T22:48:34.683 回答
0

你可能应该CarLoader上课。至少根据您所展示的内容,您的CarService课程看起来也不是很有用。至少马上,它看起来(如果它有任何用处的话)你CarService基本上是在尝试setList. 我想我会写这样的代码:

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));

std::set已经知道如何添加和删除项目...

于 2011-07-23T00:19:32.897 回答