C++ 中的 OOD:只有一种方法有 class?
OOD in C++: Having a class with just one method?
我正在用 C++ 编写一个程序,考虑到面向对象的设计,它在数据库中记录二手车。我有一个按年份对汽车进行排序的函数,但该函数应该是它自己的方法 class、汽车中的方法 class,还是任何 class 之外的函数?我们被教导说在面向对象设计中,一切都应该在它自己的 class 中,并且每个 class 应该只承担一个责任,所以我倾向于将函数作为一个方法在它自己的class,不过好像没必要。我应该怎么办?
它应该是一个独立的函数,而不是任何 class 的成员。像这样:
void sortCars(Car * lot, unsigned int numCars)
...
将其包装在没有其他成员的 class 中毫无意义;这样做不会解决任何问题,也不会使任何事情变得更容易。
使它成为 Car
的成员没有意义,这样做会使它访问它不需要的 class 的私有成员,这是自找麻烦.
"Everything should be in its own class" 是一个粗略的准则,更适用于名词 (Car
) 而不是动词 (sortCars
)。
正如@meet 所说,尽量避免使用全局函数。另外,我认为确定数据库与汽车之间的关系类型很重要。
例如,在我看来,一辆二手车有一个(与 is-a 相反,它会进入继承)数据库,因此,它可以作为一个单独的函数而不是 class 自己的!
尽管我更喜欢使用一个简单的函数来完成这项工作并将其放在某个名称空间中,例如
namespace CarUtils {
void sort(Car *carsArr, const size_t & arrSize) {
// code ...
}
};
但是,随着您学习更多的东西,例如 STL 以及 algorithms
和 vectors
等功能,您会发现 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());
这种方法更好,因为说实话,您不应该为不同类型的排序(如按里程或按容量等)一次又一次地编写排序函数。
但是..再次回到我们只在需要函数的地方使用函数的理念..我们可以使用 lambdas(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
传递给编译器。
我正在用 C++ 编写一个程序,考虑到面向对象的设计,它在数据库中记录二手车。我有一个按年份对汽车进行排序的函数,但该函数应该是它自己的方法 class、汽车中的方法 class,还是任何 class 之外的函数?我们被教导说在面向对象设计中,一切都应该在它自己的 class 中,并且每个 class 应该只承担一个责任,所以我倾向于将函数作为一个方法在它自己的class,不过好像没必要。我应该怎么办?
它应该是一个独立的函数,而不是任何 class 的成员。像这样:
void sortCars(Car * lot, unsigned int numCars)
...
将其包装在没有其他成员的 class 中毫无意义;这样做不会解决任何问题,也不会使任何事情变得更容易。
使它成为 Car
的成员没有意义,这样做会使它访问它不需要的 class 的私有成员,这是自找麻烦.
"Everything should be in its own class" 是一个粗略的准则,更适用于名词 (Car
) 而不是动词 (sortCars
)。
正如@meet 所说,尽量避免使用全局函数。另外,我认为确定数据库与汽车之间的关系类型很重要。
例如,在我看来,一辆二手车有一个(与 is-a 相反,它会进入继承)数据库,因此,它可以作为一个单独的函数而不是 class 自己的!
尽管我更喜欢使用一个简单的函数来完成这项工作并将其放在某个名称空间中,例如
namespace CarUtils {
void sort(Car *carsArr, const size_t & arrSize) {
// code ...
}
};
但是,随着您学习更多的东西,例如 STL 以及 algorithms
和 vectors
等功能,您会发现 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());
这种方法更好,因为说实话,您不应该为不同类型的排序(如按里程或按容量等)一次又一次地编写排序函数。
但是..再次回到我们只在需要函数的地方使用函数的理念..我们可以使用 lambdas(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
传递给编译器。