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 に違反していると言えるかもしれません。クラスの残りの部分は同じままで、シリアル化形式が変更される可能性があるからです。これが、すべてをクラスに入れることを強いる言語でプログラミングしたことがない理由の 1 つです。あなたの言語がこれを強制し、SRP を厳密に守りたい場合は、追加のクラスが必要になります。

于 2011-07-22T22:48:34.683 に答える
0

あなたはおそらくクラスを持つべきではありません。CarLoader少なくともあなたが示したことに基づいて、あなたのCarServiceクラスもあまり役に立たないようです。少なくともすぐに、(それが何か役に立つなら)基本的に の上にを構築しようとしているように見えます。私は次のようなコードを書くと思います:CarServicesetList

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 に答える