Я очень часто борюсь с этим вопросом и не могу найти чёткого решения.Я думаю, что знаю мотивацию геттеров / сеттеров.
Предварительная информация:
При реализации реальных данных обычно данные инкапсулируются в более чем один слой.Например:
// 1st stage data types ------------------------------
struct Cartesian
{
int32_t x;
int32_t y;
int32_t z;
}
struct GeoLocation
{
double_t latitude;
double_t longitude;
int32_t altitude;
}
// 2nd stage data types ------------------------------
struct Drone
{
Cartesian baseOffset; // m
Cartesian velocity; // m/s
}
struct Plane
{
GeoLocation location; // semicircle
Cartesian velocity; // knots
}
// 3rd stage data types ------------------------------
struct Swarm
{
Plane base;
Drone member[10];
}
В C ++ я использую классы вместо структур (потому что почему бы и нет?).И проблема возникает, когда данные о Swarm[3].member[8].velocity.x
получены по некоторому каналу связи.Поймите, что в системе может быть больше одного роя.
Требование:
По правилам MISRA C ++ функция не может возвращать неконстантную ссылку на любой класс.член, потому что член не должен быть изменен без разрешения / знаний этого класса.
Вопрос:
Когда я использую методы получения и установки, я не могу сказать "Swarm[3].member[8].velocity.x
«;вместо этого я могу сказать это несколькими способами:
1. Это недопустимо, поскольку функции get () возвращают ссылку на const и не могут вызвать set ().
Swarm[3].getMember(8).getVelocity().setX(5)
;(или set("X", 5)
)
2. Этот метод переносит всю нагрузку на класс Swarm.Хотя для тех, кто вызывает класс Swarm, код кажется короче, его очень сложно кодировать и выполнять обслуживание в фоновом режиме в случае изменения.
Swarm[3].setMemberVelocity(8,X,5)
3. Этот метод несколько промежуточен, но здесь проблема в том, что вы, возможно, жертвуете эффективностью, потому что каждый раз, когда новые данные поступают первыми, вы создаете временную переменную, получаете ее, заполняете и устанавливаете.
Cartesian tempVelocity = Swarm[3].getMember(8).getVelocity();
tempVelocity.x = 5;
Swarm[3].setMemberVelocity(8, tempVelocity);
Какой из этих трех методов является лучшим?Или есть какие-нибудь альтернативы, которые я мог бы использовать?
Заранее спасибо.