最佳实践是使用枚举使用按位参数组合



我正在实现一个生活在屏幕上的视图。根据以下配置参数,当屏幕大小发生变化时,视图将被定位并调整大小。

enum DLViewLayout
{
    DLViewLayoutSolo = 1,
    DLViewLayoutDual = 2
};
enum DLViewFixedHorizontalProperty
{
    DLViewFixedHorizontalPropertyWidth = 4, // View margins scale with the screen width.
    DLViewFixedHorizontalPropertyMargin = 8 // View width scales with the screen width.
};
enum DLViewFixedVerticalProperty
{
    DLViewFixedVerticalPropertyHeight = 16,
    DLViewFixedVerticalPropertyMargin = 32
};
enum DLViewHorizonalAlignment
{
    DLViewHorizonalAlignmentLeft = 64,
    DLViewHorizonalAlignmentCenter = 128,
    DLViewHorizonalAlignmentRight = 256
};
enum DLViewVerticalAlignment
{
    DLViewVerticalAlignmentTop = 512,
    DLViewVerticalAlignmentMiddle = 1024,
    DLViewVerticalAlignmentBottom = 2048
};

我想知道在什么情况下,按位OR组合枚举值来传递视图状态是有意义的。

int viewState = DLViewLayoutSolo | DLViewFixedHorizontalPropertyWidth | DLViewFixedVerticalPropertyMargin | DLViewHorizonalAlignmentCenter | DLViewVerticalAlignmentMiddle;  
// viewState = 1189

我希望类的用户配置所有参数。我该如何执行?

在类中,我可以通过按位AND组合状态来检索单个设置。

if (viewState & DLViewLayoutSolo)
{
  // Set up solo view layout.
}
else if (viewState & DLViewLayoutDual)
{
  // Set up dual view layout.
}

您想要使用来自不同枚举的值组合标志吗?

这是永远不会成为最佳实践,事实上,我从来没有在任何实践中看到过它,无论是好是坏。这样,除其他问题外,任何使用这些标志属性的实例的元素都必须知道,或者期望知道,它是来自这些不同enum类型的值的合并。

既然值相应递增,为什么不简单地使用由所有成员组成的适当命名的枚举呢?

同样,如果我们在这里谈论。net(虽然合法,分号告诉我可能不是),这样的enum类型应该用[Flags]属性装饰,但是,仍然只能组合相同的enum类型的值。

听起来好像您希望字段的值代表每个子条件的状态:

enum DLViewLayout
{
    DLViewLayoutSolo,
    DLViewLayoutDual
};
enum DLViewFixedHorizontalProperty
{
    DLViewFixedHorizontalPropertyWidth, // View margins scale with the screen width.
    DLViewFixedHorizontalPropertyMargin // View width scales with the screen width.
};
enum DLViewFixedVerticalProperty
{
    DLViewFixedVerticalPropertyHeight,
    DLViewFixedVerticalPropertyMargin
};
enum DLViewHorizonalAlignment
{
    DLViewHorizonalAlignmentLeft,
    DLViewHorizonalAlignmentCenter,
    DLViewHorizonalAlignmentRight
};
enum DLViewVerticalAlignment
{
    DLViewVerticalAlignmentTop,
    DLViewVerticalAlignmentMiddle,
    DLViewVerticalAlignmentBottom
};
struct DLView {
    DLViewLayout layout;
    DLViewFixedHorizontalProperty fixed_horizontal;
    DLViewFixedVerticalProperty fixed_vertical;
    DLViewHorizonalAlignment horizontal;
    DLViewVerticalAlignment vertical;
};
// ...
DLView viewState;
// ...
if ( viewState.layout == DLViewLayoutSolo ) { ... }
else if ( viewState.layout == DLViewLayoutDual ) { ... }
}
/// repeat per field

如果您关心内存消耗,并且有正当理由这样做,那么您可以使用不可移植的位域结构:

struct DLView {
    DLViewLayout layout : 1;
    DLViewFixedHorizontalProperty fixed_horizontal : 1;
    DLViewFixedVerticalProperty fixed_vertical : 1;
    DLViewHorizonalAlignment horizontal : 2;
    DLViewVerticalAlignment vertical : 2;
};

相关内容

  • 没有找到相关文章

最新更新