我有一个描述过程配置的类。
Class ProcessConfig
{
private:
std::string _username;
...
public:
const std::string &getUserName();
const std::string &setUserName();
...
}
我需要得到 uid
和 gid
来自 username
并将它们存储起来(我想是作为一个类成员,因为我以后需要使用它们)。
程序得到 username
的配置文件中,并将其设置为 setUserName()
方法(检查语法正确性并设置为类对象)。 我需要得到 uid 和 git,并将它们设置为对象(假如 username
是正确的,存在于 /etc/passwd
文件或抛出异常)。)
这里有3个问题:1.用一个setter方法设置两个值(uid和gid)是否是个好主意(setUidGid()
)? 它们都将从Posix返回的结构中获得。getpwnam(getUserName().toString())
函数,而Getter方法则不同。2.这样的函数在setter方法中可以使用吗?setUserName()
并从中设置不同的成员(setUidGid()
). 或者说,最好是将三个成员都从中设置(username
, uid
, gid
).3.将这种相互关联的实体存储为不同的类成员可以吗?有什么更好的解决方案吗?
我是C++的新手,这个问题更多的是关于更好的类设计。
1. 用一个setter方法(setUidGid())设置2个值(uid和gid)是个好主意吗?
我不明白为什么不这样做,你可以有一个单一的setter,如果要创建一个用户,然后设置uid和gid,你也可以为它做一个构造函数。
2. 是否可以在setter方法setUserName()中使用这种函数,并从中设置不同的成员(setUidGid())。或者最好是将三个成员(username, uid, gid)全部设置。
如果你要做一个setter来设置这三个成员,你应该在方法的命名中明确,你可以做的是为每个属性做3个私有setter和一个公共setter,也许可以命名为,比方说 setAll(std::string username, std::string uid, std::string gid)
并从里面调用这3个设置器,或者直接在那里设置,我不觉得有什么问题,只要命名清楚就可以了......
3. 把这种相互关联的实体存储成不同的类成员可以吗?有什么更好的解决办法吗?
这并没有错,你也可以用这三个字段做一个不同的类结构,然后在所有者类中实例化,根据它的内容而定,如果它只有这三个属性,或者说,其他一些相关的属性,那是可以的,但是如果你的类有更多的与用户没有直接关系的属性,最好把这些字段封装在它自己的类中,这是一个设计的问题。
所以,一个按要求有getters和setters的类的例子,其设计模式如上所述,是这样的(假设一个类有用户子类的需求,为了简单起见,采用内联方法)。
#include <iostream>
class User
{
private:
std::string _username;
std::string _gid;
std::string _uid;
public:
const std::string &getUserName() const
{
return _username;
}
//The other getters
void setAllProperties(std::string username, std::string uid, std::string gid)
{
_username = username;
_gid = gid;
_uid = uid;
}
};
class ProcessConfig
{
private:
User user;
//...
int someUnrelatedProperty;
double yetAnotherProperty;
//...
public:
const User &getUser() const
{
return user;
}
void setUser(std::string username, std::string uid, std::string gid)
{
user.setAllProperties(username, uid, gid);
}
};
int main()
{
ProcessConfig process;
process.setUser("name", "uid", "gid");
std::cout << process.getUser().getUserName();
}