хорошая практика управления тесно связанными классами (класс внутри класса) - PullRequest
0 голосов
/ 08 мая 2018

Все началось просто.

Я создал пару классов. Чтобы упростить обслуживание, я определил структуру под названием Parameters для каждого класса. Эти параметры регулярно меняются. Это было легко и удобно. Я мог бы создать параметры, используя A :: Parameters или B :: Parameters, мог передавать их, возвращать их и так далее ... Параметры действительно принадлежали конкретному классу, но иногда они мне также нужны где-то снаружи.

class A{
public:
struct Parameters{
    int a;
}
private:
Parameters para;
}

class B{
public:
struct Parameters{
    double b;
}
private:
Parameters para;
}

Со временем мой Parameters становился все более и более сложным. Я даже начал с добавления некоторых простых функций и вскоре после некоторых более сложных функций. Теперь они больше не ощущают себя структурой, они больше похожи на собственный класс. Я знаю, что разница между классом и структурой очень мала в C ++, но я использую структуры главным образом для хранения необработанных данных и классов для всего остального. Поэтому я решил изменить их на классы:

class A{
public:
class Parameters{
    int a;
}
private:
Parameters para;
}

class B{
public:
class Parameters{
    double b;
}
private:
Parameters para;
}

Все работает хорошо, за исключением того, что это действительно немного неудобно для меня. Иногда я определяю классы в классах, но в основном как частный класс, и в большинстве случаев он очень маленький и простой без большого количества кода. В этом случае здесь исходный код становится действительно грязным. Я хотел бы иметь собственный файл для этих классов параметров сейчас.

Теперь я вижу пару возможностей и не могу решить, какая из них лучше:

  • Должен ли я создать новый файл Parameters.cpp / Parameters.h и сохранить каждый класс Parameters в соответствующем пространстве имен, например:

    namespace A{ class Parameters{ int a; } }

    namespace B{ class Parameters{ double b; } }

Это тогда эквивалентно определению классов Parameters в классе A / B?

  • Должен ли я создать собственный файл для каждого из классов и поместить класс в пространство имен A или B? (Я бы не хотел менять имя класса Parameter на A_Parameters, B_Parameters и т. Д.)

  • Или как-то можно объявить класс только в A class A{ public: class Parameters; } и поместите определение класса где-нибудь еще (в другом файле). Обратите внимание, что я создаю экземпляры Parameters в классе A.

Полагаю, главный вопрос в том, что считается хорошей практикой / что бы вы сделали? Один класс на файл, несколько пространств имен в одном файле, переименование классов ...

...