C++中的 OOD:拥有一个只有一个方法的类

OOD in C++: Having a class with just one method?

本文关键字:有一个 方法 拥有 中的 OOD C++      更新时间:2023-10-16

我正在用C++编写一个程序,并考虑到面向对象设计,它将二手车的记录保存在数据库中。我有一个按年份对汽车进行排序的函数,但该函数应该是其自身类中的方法、汽车类中的方法,还是只是任何类之外的函数?我们被教导说,在面向对象设计中,一切都应该在它自己的类中,每个类应该只有一个责任,所以我倾向于将函数作为它自己的类中的方法,但这似乎没有必要。我该怎么办?

它应该是一个独立的函数,而不是任何类的成员。 像这样:

void sortCars(Car * lot, unsigned int numCars)
  ...
将其

包装在一个没有其他成员的类中是没有意义的;这样做不会解决问题,也不会使任何事情变得更容易。

让它成为Car的成员是没有意义的,这样做会让它访问它不需要的类的私人成员,这是自找麻烦。

"一切都应该在自己的类中"是一个粗略的准则,更适用于名词(Car)而不是动词(sortCars)。

即使我倾向于使用一个简单的函数来完成这项工作并将其放在某个命名空间中,例如

namespace CarUtils {
    void sort(Car *carsArr, const size_t & arrSize) {
        // code ...
     }
};

但是,随着您将学习更多诸如STL之类的东西以及诸如algorithmsvectors之类的功能,您会发现sort算法内置。

现在你只需要给你comparison function-objects

namespace CarUtils {  // i would still put things in namespace :)
       struct SortByMileage {
              bool operator()(const Car & c1, const Car & c2) {
                  return c1.mileage < c2.mileage;
              }
       };
       struct SortByYear {
              bool operator()(const Car & c1, const Car & c2) {
                  return c1.purchaseDate.year < c2.purchaseDate.year;
              }
       };
};

然后在您的代码中:

// #include <algorithm>  // include this file.
std::sort(cars, cars + sizeOfCarArr, CarUtils::SortByMileage());
// and to sort by year
std::sort(cars, cars + sizeOfCarArr, CarUtils::SortByYear());

这种方法更好,因为说实话,您不应该一次又一次地为不同类型的排序(如按里程或按容量等)编写排序函数。

但是......再次回到我们的哲学,只在需要函数的情况下使用函数......我们可以在:)使用lambda(C++11特性)

std::sort(cars, cars + sizeOfCarArr, [](const Car & c1, const Car & c2) {
       return c1.mileage < c2.mileage;
});
std::sort(cars, cars + sizeOfCarArr, [](const Car & c1, const Car & c2) {
       return c1.purchaseDate.year < c2.purchaseDate.year;
});

要使用 C++11,您需要将-std=c++11传递给编译器。

正如@meet所说,尽量避免使用全局函数。另外,我认为确定数据库与汽车的关系类型很重要。

例如,在我看来,二手车具有-a(而不是is-a,它会进入继承)数据库,因此,它可以作为一个单独的函数来实现,而不是它自己的类!

相关文章: