在一个方法中设置多个类的成员,这样好吗?

问题描述 投票:0回答:1

我有一个描述过程配置的类。

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

我需要得到 uidgid 来自 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++的新手,这个问题更多的是关于更好的类设计。

c++ class posix
1个回答
1
投票

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();  
}
© www.soinside.com 2019 - 2024. All rights reserved.