枚举、类、命名空间和长名称

enum, classes, namespaces and long names

本文关键字:命名空间 枚举      更新时间:2023-10-16

据我所知,与类相关的枚举应该在类中声明,如下所示:

namespace Sensors {
class MySensor {
 public:
     enum class SensorStatus {
         kSensorActive,
         kSensorInactive
     }
     SensorStatus GetCurrentStatus(void);
};
}

我遇到的问题是,它会导致程序的另一部分出现以下代码。

 Sensors::MySensor::SensorStatus current_status = mySensor.GetStatus();
 switch (current_status):
     case Sensors::MySensor::SensorStatus::kSensorActive:  // 47 characters!
          printf("Sensor is active.");
          break;
     case Sensors::MySensor::SensorStatus::kSensorInactive:  // 49 characters!
          printf("Sensor is inactive.");
          break;

我很欣赏它非常清楚kSensorActivekSensorInactive指的是什么,没有歧义。但是,如果您尝试遵循指定 80 个字符的样式指南,我们最终会得到很多换行符,恕我直言,这会降低清晰度。如果我们有一个接受两个不同枚举器的函数,则会出现长行的一个例子; MyFunction(NamespaceA::MyFirstClass::MyFirstEnum::AnEnumerator, NamespaceB::MySecondClass::MySecondEnum::ADifferentEnumerator) - 高达 127 个字符。

这些长名字很常见还是我错过了什么?

首先,你重复一些东西:

如果您

已指定名称中的SensorStatus,则名称kSensorActive不必说Sensor。或者,如果SensorMySensor 内,您可以从SensorStatus中删除它。也许两者都有。

将事物包装在类和命名空间中背后的想法是,您可以一遍又一遍地使用相同的名称,用于"相同类型的东西",而不是始终具有完全唯一的名称。

您也可以在本地使用 using 更改名称,如下所示

using Status = Sensors::MySensor::SensorStatus;

然后我们Status::kSensorActive你以前使用长东西的地方。

要在不降低整体范围清晰度的情况下缩短长度,您至少有 2 个选项:

  1. 别名类型即。 using Status = Sensors::MySensor::SensorStatus;
  2. 一个typedef即。 typedef Sensors::MySensor::SensorStatus Status2;

在此函数的作用域内使用这些函数,以便它是本地的,并且不明确的名称不会在整个代码中传播。这是一个活生生的例子。