在一个方法中设置多个 class 成员是个好主意吗?

Is it a good idea to set multiple class members in one method?

我有一个 Class 描述进程配置:

    Class ProcessConfig
    {    
     private:
        std::string _username;
        ...
     public:
        const std::string &getUserName();
        const std::string &setUserName();
        ...
    }

我需要从 username 中获取 uidgid 并存储它们(我想作为 class 成员,因为我以后需要使用它们)。

程序从配置文件中获取 username 并使用 setUserName() 方法设置它(检查值的语法正确性并设置为 class 对象)。比我需要获取 uid 和 git 并将它们设置为对象(如果 username 是正确的并且存在于 /etc/passwd 文件中或抛出异常)。

这里有3个问题: 1. 用一个 setter 方法 (setUidGid()) 设置 2 个值(uid 和 gid)是个好主意吗?它们都是从 Posix getpwnam(getUserName().toString()) 函数返回的结构中获得的。 Getter 方法会有所不同。 2. 在 setter 方法 setUserName() 中使用这种功能并设置不同的成员是否可以(setUidGid())。或者最好从它设置所有三个成员 (usernameuidgid)。 3. 可以将这些相互关联的实体存储为不同的 class 成员吗?有更好的解决方案吗?

我是 C++ 的新手,这个问题更多的是关于更好的 class 设计。

1. Is this a good idea to set 2 values (uid and gid) with one setter method (setUidGid())?

我不明白为什么不可以,你可以有一个 setter,如果要创建一个用户然后设置 uid 和 gid 你也可以为它创建一个构造函数。

2. Is this ok to use such kind of function in setter method setUserName() and also set different members from it (setUidGid()). Or it is better to set all three members from it (username, uid, gid).

如果你打算制作一个 setter 来设置所有三个你应该清楚方法的命名,你可以做的是为每个 setter 制作 3 个私有 setter =34=] 和一个 public setter 可能被命名,比方说 setAll(std::string username, std::string uid, std::string gid) 并从其中调用所有 3 个 setter,或者直接将它们设置在那里,我不只要命名清楚就没问题..

3. Is it ok to store such interconnected entities as different class members? Any better solution?

没有错,你也可以用这三个字段做一个不同的class/struct并在所有者class中实例化它,取决于它的内容,如果它只有这三个属性,或者, 比方说一些其他相关的属性, 没关系, 但是如果你有一个 class 有更多与用户没有直接关系的属性, 最好将字段封装在它自己的 class 中, 它是设计问题。

所以一个 class 的例子与 getters 和 setters 如所描述的设计模式看起来像这样(假设 class 需要一个用户 sub-class 并为简单起见使用内联方法):

#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();  
}