使用嵌套C类和枚举的利弊,如何权衡?
- 内容介绍
- 相关推荐
本文共计966个文字,预计阅读时间需要4分钟。
使用嵌套的公共C类和枚举的优缺点如下:
优点:
1.代码组织:嵌套结构有助于将相关功能组织在一起,提高代码的可读性和可维护性。
2.封装性:通过将枚举和类嵌套,可以更好地封装逻辑和数据,减少外部依赖。
3.扩展性:当需要添加新的类型或功能时,可以在嵌套结构内部进行,而不影响外部代码。
缺点:
1.可读性:嵌套结构可能会降低代码的可读性,特别是对于不熟悉这种结构的人来说。
2.复杂性:嵌套结构可能会增加代码的复杂性,使得理解和修改变得更加困难。
3.性能:在某些情况下,嵌套结构可能会对性能产生负面影响,尤其是在递归或深层嵌套时。
例如,假设有一个名为`printer`的类,该类存储有关输出托盘的信息:
java
class printer { public std::string name; enum TYPE { TYPE_LOCAL, TYPE_NETWORK };} 使用嵌套的公共C类和枚举的优缺点是什么?例如,假设您有一个名为printer的类,此类还存储有关输出托盘的信息,您可以:class printer { public: std::string name_; enum TYPE { TYPE_LOCAL, TYPE_NETWORK, }; class output_tray { ... }; ... }; printer prn; printer::TYPE type; printer::output_tray tray;
或者:
class printer { public: std::string name_; ... }; enum PRINTER_TYPE { PRINTER_TYPE_LOCAL, PRINTER_TYPE_NETWORK, }; class output_tray { ... }; printer prn; PRINTER_TYPE type; output_tray tray;
我可以看到嵌套私人枚举/课程的好处,但是当谈到公共场所/办公室时,办公室就分开了 – 它似乎更像是一种风格选择.
那么,你更喜欢哪个?为什么?
嵌套类嵌套在类中的类有几个副作用我通常认为是缺陷(如果不是纯粹的反模式).
让我们想象下面的代码:
class A { public : class B { /* etc. */ } ; // etc. } ;
甚至:
class A { public : class B ; // etc. } ; class A::B { public : // etc. } ;
所以:
> Privilegied Access:A :: B具有对A的所有成员(方法,变量,符号等)的特权访问,这削弱了封装
> A的范围是符号查找的候选者:来自B内部的代码将看到来自A的所有符号作为符号查找的可能候选者,这可能会混淆代码
> forward-declaration:如果没有给出完整的A声明,就无法转发A :: B.
>可扩展性:除非您是A的所有者,否则无法添加另一个A :: C类
>代码详细程度:将类放入类只会使标题更大.你仍然可以将它分成多个声明,但是没有办法使用类似命名空间的别名,导入或使用.
作为一个结论,除非例外(例如嵌套类是嵌套类的一个私密部分……即便如此……),我认为普通代码中的嵌套类没有任何意义,因为缺陷超出了大小的优势.
此外,它有点笨拙地尝试模拟命名空间而不使用C命名空间.
在pro方面,你隔离了这个代码,如果是私有的,那么它就无法使用,但是来自“外部”类……
嵌套枚举
优点:一切.
骗局:没什么.
事实是枚举项将污染全球范围:
// collision enum Value { empty = 7, undefined, defined } ; enum Glass { empty = 42, half, full } ; // empty is from Value or Glass?
通过将每个枚举放在不同的命名空间/类中,可以避免这种冲突:
namespace Value { enum type { empty = 7, undefined, defined } ; } namespace Glass { enum type { empty = 42, half, full } ; } // Value::type e = Value::empty ; // Glass::type f = Glass::empty ;
注意C 0x定义了类枚举:
enum class Value { empty, undefined, defined } ; enum class Glass { empty, half, full } ; // Value e = Value::empty ; // Glass f = Glass::empty ;
正是出于这种问题.
本文共计966个文字,预计阅读时间需要4分钟。
使用嵌套的公共C类和枚举的优缺点如下:
优点:
1.代码组织:嵌套结构有助于将相关功能组织在一起,提高代码的可读性和可维护性。
2.封装性:通过将枚举和类嵌套,可以更好地封装逻辑和数据,减少外部依赖。
3.扩展性:当需要添加新的类型或功能时,可以在嵌套结构内部进行,而不影响外部代码。
缺点:
1.可读性:嵌套结构可能会降低代码的可读性,特别是对于不熟悉这种结构的人来说。
2.复杂性:嵌套结构可能会增加代码的复杂性,使得理解和修改变得更加困难。
3.性能:在某些情况下,嵌套结构可能会对性能产生负面影响,尤其是在递归或深层嵌套时。
例如,假设有一个名为`printer`的类,该类存储有关输出托盘的信息:
java
class printer { public std::string name; enum TYPE { TYPE_LOCAL, TYPE_NETWORK };} 使用嵌套的公共C类和枚举的优缺点是什么?例如,假设您有一个名为printer的类,此类还存储有关输出托盘的信息,您可以:class printer { public: std::string name_; enum TYPE { TYPE_LOCAL, TYPE_NETWORK, }; class output_tray { ... }; ... }; printer prn; printer::TYPE type; printer::output_tray tray;
或者:
class printer { public: std::string name_; ... }; enum PRINTER_TYPE { PRINTER_TYPE_LOCAL, PRINTER_TYPE_NETWORK, }; class output_tray { ... }; printer prn; PRINTER_TYPE type; output_tray tray;
我可以看到嵌套私人枚举/课程的好处,但是当谈到公共场所/办公室时,办公室就分开了 – 它似乎更像是一种风格选择.
那么,你更喜欢哪个?为什么?
嵌套类嵌套在类中的类有几个副作用我通常认为是缺陷(如果不是纯粹的反模式).
让我们想象下面的代码:
class A { public : class B { /* etc. */ } ; // etc. } ;
甚至:
class A { public : class B ; // etc. } ; class A::B { public : // etc. } ;
所以:
> Privilegied Access:A :: B具有对A的所有成员(方法,变量,符号等)的特权访问,这削弱了封装
> A的范围是符号查找的候选者:来自B内部的代码将看到来自A的所有符号作为符号查找的可能候选者,这可能会混淆代码
> forward-declaration:如果没有给出完整的A声明,就无法转发A :: B.
>可扩展性:除非您是A的所有者,否则无法添加另一个A :: C类
>代码详细程度:将类放入类只会使标题更大.你仍然可以将它分成多个声明,但是没有办法使用类似命名空间的别名,导入或使用.
作为一个结论,除非例外(例如嵌套类是嵌套类的一个私密部分……即便如此……),我认为普通代码中的嵌套类没有任何意义,因为缺陷超出了大小的优势.
此外,它有点笨拙地尝试模拟命名空间而不使用C命名空间.
在pro方面,你隔离了这个代码,如果是私有的,那么它就无法使用,但是来自“外部”类……
嵌套枚举
优点:一切.
骗局:没什么.
事实是枚举项将污染全球范围:
// collision enum Value { empty = 7, undefined, defined } ; enum Glass { empty = 42, half, full } ; // empty is from Value or Glass?
通过将每个枚举放在不同的命名空间/类中,可以避免这种冲突:
namespace Value { enum type { empty = 7, undefined, defined } ; } namespace Glass { enum type { empty = 42, half, full } ; } // Value::type e = Value::empty ; // Glass::type f = Glass::empty ;
注意C 0x定义了类枚举:
enum class Value { empty, undefined, defined } ; enum class Glass { empty, half, full } ; // Value e = Value::empty ; // Glass f = Glass::empty ;
正是出于这种问题.

