C+中的OOD+;:只有一个方法的类? 我在C++中编写程序,并考虑面向对象的设计,在数据库中保存旧汽车的记录。我有一个按年份对汽车进行排序的函数,但是这个函数应该是它自己类中的一个方法,还是汽车类中的一个方法,或者只是任何类之外的一个函数?我们被教导在面向对象的设计中,一切都应该在它自己的类中,每个类应该只有一个职责,所以我倾向于在它自己的类中将函数作为一种方法,但这似乎是不必要的。我该怎么办
它本身应该是一个函数,而不是任何类的成员。大概是这样的:C+中的OOD+;:只有一个方法的类? 我在C++中编写程序,并考虑面向对象的设计,在数据库中保存旧汽车的记录。我有一个按年份对汽车进行排序的函数,但是这个函数应该是它自己类中的一个方法,还是汽车类中的一个方法,或者只是任何类之外的一个函数?我们被教导在面向对象的设计中,一切都应该在它自己的类中,每个类应该只有一个职责,所以我倾向于在它自己的类中将函数作为一种方法,但这似乎是不必要的。我该怎么办,c++,function,class,methods,object-oriented-analysis,C++,Function,Class,Methods,Object Oriented Analysis,它本身应该是一个函数,而不是任何类的成员。大概是这样的: void sortCars(Car * lot, unsigned int numCars) ... 在没有其他成员的类中包装这一点是没有意义的;这样做不会解决任何问题,也不会让事情变得更容易 让它成为Car的成员是没有意义的,这样做会让它可以访问该类的私有成员,而这些成员并不需要,这是自找麻烦 “一切都应该在它自己的类中”是一个粗略的准则,它更适用于名词(Car)而不是动词(sortCars)。正如@meet所说,尽量避免使用全局
void sortCars(Car * lot, unsigned int numCars)
...
在没有其他成员的类中包装这一点是没有意义的;这样做不会解决任何问题,也不会让事情变得更容易
让它成为Car
的成员是没有意义的,这样做会让它可以访问该类的私有成员,而这些成员并不需要,这是自找麻烦
“一切都应该在它自己的类中”是一个粗略的准则,它更适用于名词(
Car
)而不是动词(sortCars
)。正如@meet所说,尽量避免使用全局函数。此外,我认为确定数据库与汽车之间的关系类型很重要
例如,在我看来,一辆二手车有一个-a(而不是is-a,它将进入继承)数据库,因此,它可以作为一个单独的函数而不是自己的类来实现 尽管我倾向于使用一个简单的函数来完成这项工作,并将其放在某个名称空间中,如
namespace CarUtils {
void sort(Car *carsArr, const size_t & arrSize) {
// code ...
}
};
然而,当您了解更多类似STL的内容以及算法
和向量
等功能时,您会发现排序
算法在build中
现在您只需要给出您的比较函数对象
:
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;
}
};
};
namespace-CarUtils{//我还是会把东西放在namespace:)
结构排序码{
布尔运算符()(常数车和c1、常数车和c2){
返回c1.里程
然后在代码中:
// #include <algorithm> // include this file.
std::sort(cars, cars + sizeOfCarArr, CarUtils::SortByMileage());
// and to sort by year
std::sort(cars, cars + sizeOfCarArr, CarUtils::SortByYear());
/#包含//包含此文件。
std::sort(cars,cars+sizeofcarar,CarUtils::SortByMileage());
//按年份分类
std::sort(cars,cars+sizeofcarar,CarUtils::SortByYear());
这种方法更好,因为,老实说,您不应该一次又一次地为不同种类的排序编写排序函数,如按里程数或按容量等
但是。。再次回到我们的哲学,即只在需要函数的地方使用函数。。我们可以使用lambdas(C++11特性):)
std::sort(cars,cars+sizeofcarar,[](const Car&c1,const Car&c2){
返回c1.里程
要使用C++11,您需要将
-std=C++11
传递给编译器。此外,即使该类不包含数据成员,也只包含一个方法的类是否需要构造函数?您对cars使用什么类型的容器(例如数组)?您是否熟悉标准库容器(例如,vector
)?@beta这将是一个用于汽车的阵列,是的。很抱歉,我对此并不熟悉,我对c++@beta中的类和面向对象设计的知识非常有限。我只是被教导使用“使用名称空间std”,如果这适用于你所说的话。我要给你的最好建议是,不要再认为OOP/OOD是一种近乎宗教层面的神圣事物。设计是由许多因素驱动的,最后一个因素是团队的需要,团队必须顺利合作。没有OO方法可以证明问题的一个分区比另一个分区更正确。另外,OOP并不意味着任何东西都必须在类中。类是有用的抽象。但不是“必须”。例如,不能针对某个方法说任何话:void SortByAge(CarList&cars)代码>或<代码>CarList Sortbage(const CarList&cars)代码>一辆车怎么会有一个数据库?因为数据库是这类车的一个属性?你没有一个没有任何汽车的二手车数据库。数据库将包含汽车信息,如年龄等。。这个年龄将是car的一个成员/属性。类可以包含访问此属性的方法。。但是用这个属性做任何事情,比如(排序)不是汽车的属性。。它不应该是课堂的一部分。
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;
});