Геттеры и сеттеры в C ++ - PullRequest
       3

Геттеры и сеттеры в C ++

2 голосов
/ 21 декабря 2010

Я писал простую программу и разработал простую текстовую абстракцию - расположение на экране X / Y, размер поля X / Y, текст внутри и выравнивание.

Но теперь у меня есть эта абстракция, которая является просто набором получателей и установщиков. Обычно я просто делаю это общедоступным элементом данных, но проблема в том, что я не могу просто добавить элементы данных, потому что в будущем существует альтернативный путь кода, в котором они не существуют в моем коде, но внешняя библиотека. Теперь у меня ужасно неуклюжий интерфейс get / set (несколько улучшенный цепочкой методов). Что я могу сделать, чтобы сделать его чище?

Редактировать: определение моего класса.

class Text {
public:
    enum TextLayout {
        TopLeft,
        TopRight,
        BottomLeft,
        BottomRight,
        Center
    };
    // Text
    virtual string GetText() = 0;
    virtual Text* SetText(const string& ref) = 0;
    virtual Text* SetText(string&& ref) = 0;

    // Position
    virtual int GetPositionX() = 0;
    virtual Text* SetPositionX(int x) = 0;
    virtual int GetPositionY() = 0;
    virtual Text* SetPositionY(int y) = 0;
    virtual int GetSizeX() = 0;
    virtual Text* SetSizeX(int sizex) = 0;
    virtual int GetSizeY() = 0;
    virtual Text* SetSizeY(int sizey) = 0;
    virtual TextLayout GetTextLayout() = 0;
    virtual Text* SetTextLayout(TextLayout layout) = 0;

    virtual std::shared_ptr<Font> GetFont() = 0;
    virtual Text* SetFont(const std::shared_ptr<Font>&) = 0;
    virtual Text* SetFont(std::shared_ptr<Font>&&) = 0;

    virtual Text* SetColour(unsigned int colour) = 0;
    virtual unsigned int GetColour() = 0;

    virtual Render* GetRender() = 0;

    virtual ~Text();
};

Ответы [ 2 ]

3 голосов
/ 21 декабря 2010

Вы должны точно описать каждую концепцию. ср Принцип единой ответственности

Я думаю: Должен быть класс Position, а у вашего класса есть член позиции. Должен быть класс Size, а у вашего класса есть член size. Тогда у вас на 4 функции меньше. И более чистая капсула.

РЕДАКТИРОВАТЬ: убрал мой комментарий о передаче аргументов по ссылкам вместо возврата копией

1 голос
/ 21 декабря 2010

Я не вижу ничего плохого в вашем коде.Однако вы можете разделить его на несколько интерфейсов, например, IPositionable (x, y), IResizable (width, height), IAlignable (...). Затем создайте суперинтерфейс ITextField, который расширяет IPositionable, IResizable и IAlignable.Но если вы не собираетесь использовать эти меньшие интерфейсы где-либо еще - это просто излишество.Это основная идея, но я обычно делю интерфейсы на наименьшие логические группы битов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...