如何避免向类中添加越来越多的状态?

How to avoid adding more and more states to a class?

本文关键字:越来越多 状态 添加 何避免      更新时间:2023-10-16

假设我决定编写一个处理字母的应用程序。 所以我设计了一个代表这个概念的类:

class Letter
{
//implementation1
};

然后我意识到我需要为字母添加一些"标志",例如"正在处理"、"已处理"、"wont_be_processed"。

class Letter
{
//implementation1
state letter_state_;
};

并假设所有字母都存储在某个容器中。
(我想明确指出,上述状态对于实施是必要的, 并且不是业务逻辑的一部分。
最后,我明白我需要另一个特殊的标志,它只用于存储在容器中的所有 Letter 对象中的一个。

因此,我现在看到的两种天真的方法可以进一步进行:
1)添加另一个标志;
2) 添加另一个字段。
请注意,第一个选项是不自然的,因为"处理"、"已处理"、"wont_be_processed"以某种方式相互关联,而新状态不会与它们正确关联。 第二种选择会导致类膨胀,我的一位同事也不喜欢添加新字段(但是,没有证明理由)。

这种设计陷阱是否有固定的名称或克服问题的标准方法?

更新。添加了示例。

void process_letter(Letter& foo)
{
if(foo.latter_state_ == states::wont_be_processed)
return;
if(foo.letter_state_ == states::processed)
process_impl_1(foo);
}

会吗?

void process_letter(Letter& foo)
{
if(foo.latter_state_ == states::wont_be_processed
&& foo.new_spacial_state_ != special_state::bar)
return;
if(foo.letter_state_ == states::processed)
process_impl_1(foo);
}

Upd2
也许,整个设计是完全错误的。如果是这样,我应该关闭问题吗?

我推荐两个项目:

  1. 枚举状态
  2. 使用状态表

这里的想法是制作代码,使其具有最少的更改量。 通过将状态数据放入表中,您可以使用最少的可执行代码更改来增加表。

对于状态表,有许多实现。 例如,在互联网上搜索"状态设计模式 c++"。

一本好的书或参考资料将帮助您进行枚举。

编辑 1:状态表示例
您可以有 [状态 ID,函数指针] 的表:

struct State_Entry
{
unsigned int  state_id;
void (*Ptr_State_Processing_Function)(unsigned int state_id);
};

将州 ID 放入表的一个很好的功能是,州不必是连续的或同质的。此外,通过保持函数指针的类型简单,可以消除函数具有不同签名的问题(函数指针必须具有相同的类型/签名)。