У меня есть Vehicle
разных видов Fuel
(бензин, гелий, электричество...), чтобы зарядить их. По-видимому, нефть и электроэнергия имеют разные единицы. Я собираюсь обрабатывать различные виды топлива аналогичным образом с FuelingStation
в будущем. Как хранить информацию о Fuel
?
Объект Fuel
с количеством и единицами? Объект типа FuelType
и float fuelAmount
Внутри класса Vehicle
?
Я разочарован. Это широкий вопрос, но каковы общие предложения?
Я думаю, что разные классы для нескольких видов топлива - это не правильное решение, потому что это не топливная ответственность, чтобы рассчитать его потребление, а автомобиль. Я считаю, что вместо этого должны быть несколько типов автомобилей, которые используют разные виды топлива и реализуют calculateFuelConsumption()
и fillFuel()
разному.
Для типов топлива я считаю, что все необходимо, простое перечисление и моделирование. Класс Fuel
не нужен, пока он не будет использоваться для хранения различных специфических свойств топлива, которые, похоже, не имеют места здесь.
Ниже я считаю, что это разумное решение, которое реализует перечисление для различных видов топлива, статическую карту для извлечения названий топливных единиц и заводскую схему для создания различных типов автомобилей на основе их типа топлива:
class Car
{
public:
enum FuelType
{
UNKNOWN_FUEL,
PETROLEUM_FUEL,
ELECTRICITY_FUEL,
HELLIUM_FUEL
};
Car();
FuelType getFuelType() const { return m_fuelType; }
std::string getFuelUnit(FuelType type) { return m_fuelUnits.at(type); }
virtual float calculateFuelConsumption(float distance, float speed) const = 0;
virtual void fill(FuelType fuelType) = 0;
private:
FuelType m_fuelType;
static std::map < FuelType, std::string> m_fuelUnits;
};
std::map < Car::FuelType, std::string> Car::m_fuelUnits
{
{ Car::UNKNOWN_FUEL, "unknown" },
{ Car::PETROLEUM_FUEL, "litres" },
{ Car::ELECTRICITY_FUEL, "Ah" },
{ Car::HELLIUM_FUEL, "cubic metres" }
};
class PetrolFueledCar : public Car
{
public:
// ...
float calculateFuelConsumption(float distance, float speed) const { /* ... */ }
void fill(FuelType fuelType) { /* ... */ }
};
class HelliumPoweredCar : public Car
{
public:
// ...
float calculateFuelConsumption(float distance, float speed) const { /* ... */ }
void fill(FuelType fuelType) { /* ... */ }
};
class CarFactory
{
public:
static unique_ptr<Car> newCar(Car::FuelType fuelType)
{
if (fuelType == Car::PETROLEUM_FUEL)
return new PetrolFueledCar;
if (fuelType = Car::HELLIUM_FUEL)
return new HelliumPoweredCar;
// ...
}
};