C ++: предложения по проектированию для обработки многих переменных конфигурации - PullRequest
1 голос
/ 28 января 2020

Я занимаюсь рефакторингом устаревшей кодовой базы. У них было более 100 переменных конфигурации publi c и более 90 методов для функциональности в одном классе. Я нахожусь в процессе разбиения большого класса на несколько маленьких классов на основе особенностей. Поскольку эти переменные конфигурации считываются из файла конфигурации и устанавливаются в эти переменные, я заканчиваю тем, что пишу много методов получения и установки. Это хороший дизайн, чтобы иметь так много сеттеров и геттеров вместо прямого назначения? Любые хорошие рекомендации по дизайну приветствуются. Ниже приведен фрагмент кода РЕДАКТИРОВАТЬ:

class config {
public:
void Setvalue(int val) {value_ = val;}
int Getvalue(){return value_;}
void SetisEnabled(bool value) {isEnabled_ = value;}
bool GetisEnabled() {return isEnabled_; }
void SetorgCity(string city) {orgCity_ = city; } 
string GetorgCity(){return orgCity_;}
void SetorgState(string state) {orgState_ = state; } 
string GetorgState(){return orgState_;}
..
private:
    int value_;
    bool isEnabled_;
    string orgCity_;
    string orgState_;
    string orgCounty_;
    string orgName_;
    string mytypeval1_;
    string mytypeval2_;
    string mytypeval3_;
    string mytypeval4_;
}

or 

class Config
{
    int value_;
    bool isEnabled_;
    string orgCity_;
    string orgState_;
    string orgCounty_;
    string orgName_;
    string mytypeval1_;
    string mytypeval2_;
    string mytypeval3_;
    string mytypeval4_;
}

Config sampleConfig;
sampleConfig.isEnabled_ = true;
sampleConfig.value_ = 1234;
...

Ответы [ 2 ]

3 голосов
/ 28 января 2020

Является ли это хорошим дизайном, когда вместо прямого назначения есть так много сеттеров и геттеров?

Нет ничего плохого в использовании простых struct s для хранения данных:

struct SomeData
{
    std::string some_name;
    int some_value;
    float another_value;
}

, поскольку struct члены по умолчанию public, вы можете просто написать:

SomeData mydata;
mydata.some_name = "a name";
...
std::cout << mydata.some_value;
0 голосов
/ 28 января 2020

Одна из возможностей для вашего config класса - это операция, скажем, initFromConfig(), которая инициализирует все свои переменные экземпляра из внешнего файла конфигурации. Это избавит вас от необходимости иметь операции установки.

Кроме того, для операций получения более эффективно будет возвращать const string &, а не string.

С двумя вышеупомянутыми сделанными изменениями ваш класс config будет выглядеть следующим образом:

class config {
public:
  initFromConfigFile(const string & fileName); // initialises foo_ and bar_
  const string & getFoo() { return foo_; }
  const string & getBar() { return bar_; }
private:
  string  foo_; 
  string  bar_; 
};
...