C++中的 OOD:拥有一个只有一个方法的类
OOD in C++: Having a class with just one method?
我正在用C++编写一个程序,并考虑到面向对象设计,它将二手车的记录保存在数据库中。我有一个按年份对汽车进行排序的函数,但该函数应该是其自身类中的方法、汽车类中的方法,还是只是任何类之外的函数?我们被教导说,在面向对象设计中,一切都应该在它自己的类中,每个类应该只有一个责任,所以我倾向于将函数作为它自己的类中的方法,但这似乎没有必要。我该怎么办?
它应该是一个独立的函数,而不是任何类的成员。 像这样:
void sortCars(Car * lot, unsigned int numCars)
...
将其包装在一个没有其他成员的类中是没有意义的;这样做不会解决问题,也不会使任何事情变得更容易。
让它成为Car
的成员是没有意义的,这样做会让它访问它不需要的类的私人成员,这是自找麻烦。
"一切都应该在自己的类中"是一个粗略的准则,更适用于名词(Car
)而不是动词(sortCars
)。
即使我倾向于使用一个简单的函数来完成这项工作并将其放在某个命名空间中,例如
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());
这种方法更好,因为说实话,您不应该一次又一次地为不同类型的排序(如按里程或按容量等)编写排序函数。
但是......再次回到我们的哲学,只在需要函数的情况下使用函数......我们可以在:)使用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,它会进入继承)数据库,因此,它可以作为一个单独的函数来实现,而不是它自己的类!
- C++有没有办法强制重写一组方法,如果其中一个方法在子类中具有重写?
- 从 int 中剥离位时,编译器会警告一个转换,但不警告其他转换.有解决方法吗?
- 为什么一个方法对同一个变量有常量和非常量参数?
- 是否有其他方法将.dll文件从一个项目复制到我的启动项目中的可执行文件旁边
- 是否有一个很好的方法可以在C 11中打印出像JSON一样的Trie结构(仅迭代解决方案)的扁平命名空间
- 我有一个启用了代理存根支持的 ATL 项目,在哪里可以找到 xdlldata.h 文件中所有方法的实现
- 你如何断言一个对象在c++中有一个特定的方法
- 有什么方法可以部分实例一个C 模板
- 有什么方法可以增加一个角色
- 我可以有一个仅使用工厂方法创建的成员变量吗?
- C++如果我有一个对象指针,是在堆栈或堆上分配的方法变量
- 有什么方法可以制作一个程序,随机选择10-20个字符串并用C++向用户显示
- C++是否有任何方法可以将一组派生类存储在基类的一个向量中,并仍然访问它们的成员
- 如果我有一个固定大小的填充ascii数字的char数组,我知道它指的是一个无符号整数,那么将其转换为无符号整数的最快方法
- 如果一个基类有2个派生类,并且这些类每个都有一个派生类.那么我可以为大多数派生类扩展一个基方法*一次*吗
- 是否有可能有一个基类方法来调用它的所有派生类的相同(但被重写的方法)?
- javascript中的闭包与c++中的类实例(它有一个私有成员和一个公共方法)相当吗
- 重载一个方法只是为了在C++中报告一个更好的错误.有更好的方法吗
- 是否有某种方法可以使C ++类中的一个函数在不同的线程中运行
- 当您有一个二维数组(C++)时调用析构函数的正确方法是什么?