zoukankan      html  css  js  c++  java
  • 定义enum,我用struct { enum Type{};};

    本文仅仅讨论如何在SolidMCP中定义更可读的enum,也算是攻克Clean Code和Readable Code的副作用。

     -- Piaoger


    >> 几种定义enum的方法

     其实这几种形式的主要的区别在于:

    是否为enum的定义放在一个被嵌套的enum Type内;

    enum Type是嵌套在struct还是在namespace之内。

    1. 无嵌套

    enum DateTimeKind
    {
    kUnspecified = 0,
    kLocalTime = 1,
    kUtcTime = 2
    };

    inline bool isUtc(DateTimeKind kind)
    {
    return kind == kUtcTime;
    }

    2. enum Type嵌套在namespace内

    namespace DateTimeKind
    {
    enum Type
    {
    kUnspecified = 0,
    kLocalTime = 1,
    kUtcTime = 2
    };
    }

    inline bool isUtc(DateTimeKind::Type kind)
    {
    return kind == DateTimeKind::kUtcTime;
    }

    3. enum Type嵌套在struct内

    struct DateTimeKind
    {
    enum Type
    {
    kUnspecified = 0,
    kLocalTime = 1,
    kUtcTime = 2
    };
    }

    inline bool isUtc(DateTimeKind::Type kind)
    {
    return kind == DateTimeKind::kUtcTime;
    }

    4. 类中的enum Type嵌套在struct内

    类中是不可以有namespace的,所以enum Type只能放到struct内

    class DateTime
    {
    public:
    struct Kind
    {
    enum Type
    {
    kUnspecified = 0,
    kLocalTime = 1,
    kUtcTime = 2
    };
    };

    private:
    // Data Members
    };

    inline bool isUtc(DateTime::Kind::Type kind)
    {
    return kind == DateTime::Kind::kUtcTime;
    }

    5.类的无嵌套enum

    class DateTime
    {
    public:
    enum Kind
    {
    kUnspecified = 0,
    kLocalTime = 1,
    kUtcTime = 2
    };
    };

    inline bool isUtc(DateTime::Kind kind)
    {
    return kind == DateTime::kUtcTime;
    }

    >> 嵌套 Or 不嵌套?

    相对而言,Piaoger更喜欢嵌套的形式,这样可以减少名字冲突的机会,并且更具有可读性。

    可读性上来讲,DateTime::Kind::kUtcTime 肯定大于DateTime::kUtcTime,我们可以很清楚看出kUtcTime是Time Kind.

    至于减少名字冲突,你想为一个类中多个enum都加上一个kUnknown的时候,你就会发现问题了,通常也只能像下面加上一些后缀以示区别:

    class ClassName
    {
    public:
    enum EnumXX
    {
    kUnknownXX = 0,
    kValue1XX = 1,
    kValue2XX = 2
    };

    enum EnumYY
    {
    kUnknownYY = 0,
    kValue1YY = 1,
    kValue2YY = 2
    };
    };


    >> struct Or namespace

    namespace的弱点在于它不能继承,而且还不能用在class和struct内。而struct形式,则是可能某些傻傻的编译器会在struct内偷偷生成代码,如默认构造函数。

    鉴于这种傻傻的编译器少见,并且namespace的形式难以统一,Piaoger最终还是选择了struct { enum Type{};};这种形式,即上面提到的的第三种与第四种形式。


    >> 尽量把常用的enum放在class之外定义

    这样也可以避免一些没有必要的include(尽管enum也可以前向声明).

    Qt在qnamespace.h中定义了大量的常用enum。(...\src\corelib\global\qnamespace.h)

    我则比较喜欢用在每个Module中加一个XXXTypes.h,把一些相关的enum定义和class前向声明和都放到这个文件内。


  • 相关阅读:
    spring boot的application配置文件
    C# WinForm 中英文实现, 国际化实现的简单方法
    VS2012 2013 显示查找功能 无法具体定位 解决方法
    C#使用HttpWebRequest 进行请求,提示 基础连接已经关闭: 发送时发生错误。
    VS 默认开发环境如何更改
    C# winfrom HttpWebRequest 请求获取html网页信息和提交信息
    C# 定时器 Timers.Timer Forms.Timer
    HTTP 错误 500.21
    配置iis时,浏览项目提示 无法识别的属性“targetFramework”。请注意属性名称区分大小写。
    asp xml对象转换为string
  • 原文地址:https://www.cnblogs.com/piaoger/p/2365220.html
Copyright © 2011-2022 走看看