Является ли хорошей идеей установить несколько членов класса в одном методе? - PullRequest
0 голосов
/ 08 мая 2020

У меня есть класс, который описывает конфигурацию процесса:

    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. Это хорошая идея установить 2 значения (uid и gid) с помощью одного метода установки (setUidGid())? Оба они будут получены из структуры, возвращаемой функцией Posix getpwnam(getUserName().toString()). Методы получения будут другими. 2. Можно ли использовать такую ​​функцию в методе установки setUserName(), а также устанавливать из него разные члены (setUidGid()). Или лучше установить из него все три члена (username, uid, gid). 3. Можно ли хранить такие взаимосвязанные объекты как разные члены класса? Есть ли лучшее решение?

Я новичок ie в C ++, и этот вопрос больше о лучшем дизайне классов.

1 Ответ

1 голос
/ 08 мая 2020

1. Это хорошая идея - установить 2 значения (uid и gid) с помощью одного метода установки (setUidGid ())?

Я не понимаю, почему нет, у вас может быть один установщик , если вы собираетесь создать пользователя, а затем установить uid и gid, вы также можете создать для него конструктор.

2. Можно ли использовать такую ​​функцию в методе установки setUserName (), а также устанавливать из нее разные члены (setUidGid ()). Или лучше установить все три члена из него (имя пользователя, uid, gid).

Если вы собираетесь сделать сеттер, чтобы установить все три, вы должны быть ясны в именах методов, вы можете сделать 3 частных установщика для каждого свойства и сеттер publi c, который может быть назван, скажем, setAll(std::string username, std::string uid, std::string gid), и вызвать все 3 установщика изнутри него или просто установить их там напрямую, я не не вижу там проблемы, пока понятное название ..

3. Можно ли хранить такие взаимосвязанные объекты как разные члены класса? Есть ли лучшее решение?

Это не неправильно, вы также можете создать другой класс / структуру с этими тремя полями и создать его экземпляр в классе владельца, в зависимости от его содержимого, если он только имеет эти три свойства или, скажем так, некоторые другие связанные свойства, это нормально, но если у вас есть класс, который имеет больше свойств, которые напрямую не связаны с пользователем, лучше инкапсулировать поля в его собственный класс, это вопрос design.

Таким образом, пример класса с геттерами и сеттерами, которые требуются, с описанным шаблоном проектирования, будет выглядеть следующим образом (при условии, что класс, которому требуется подкласс пользователя, и со встроенными методами для простоты ):

#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();  
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...