Принцип единой ответственности - загрузка списка из файла? - PullRequest
2 голосов
/ 23 июля 2011

Скажите, у меня есть класс автомобиля:

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. Мой старый инстинкт ООП заключался в том, чтобы поместить это как метод, подобный LoadFromFile (), в класс CarService. Однако, поскольку я сейчас изучаю SRP и тестируемость, я не уверен в этом.

В соответствии с принципом единой ответственности, как правильно спроектировать это? Должен ли я иметь класс CarLoader?

UPDATE

Я думаю, что решение должно быть одинаковым в самых разных языках, но я буду использовать C ++. Мой вопрос был бы идентичным, если бы я использовал C #, Java или python.

Ответы [ 2 ]

1 голос
/ 23 июля 2011

В зависимости от языка, на котором вы собираетесь это реализовать, я бы сказал, что либо функции load_carservice, либо эквивалентного статического метода будет достаточно.

Можно сказать, что решение статического метода нарушает SRP, поскольку формат сериализации может измениться, в то время как остальная часть класса останется прежней. Это одна из причин, почему я никогда не программирую на языках, которые заставляют меня все ставить на уроки. Если ваш язык вынуждает вас сделать это, и вы хотите строго придерживаться SRP, то потребуется дополнительный класс.

0 голосов
/ 23 июля 2011

Вы, вероятно, должны не иметь класс CarLoader.По крайней мере, исходя из того, что вы показали, ваш класс CarService тоже не выглядит очень полезным.По крайней мере, сразу, он выглядит как (если он вообще делает что-нибудь полезное), ваш CarService в основном пытается построить set поверх List.Я думаю, что написал бы код примерно так:

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 уже знает, как добавлять и удалять элементы ...

...