首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将任务拆分为类别

将任务拆分为类别
EN

Stack Overflow用户
提问于 2017-01-04 15:32:29
回答 4查看 93关注 0票数 1

我有一个类(让我们称之为检查器)和不同类型的类来执行任务(让我们称之为任务)。每个任务都属于几个类别。

每个任务都会运行,并在某个时候询问检查人员是否允许他们做一些事情。检查器根据系统状态和它们的类别回答。任务可以分为多个类别。

你将如何实现这一点?(cpp,但我并不认为它的语言是特定的)。

我在考虑在每个任务中添加一个类别列表,并有一个函数,如果任务属于它,就会得到一个类别和答案。

代码语言:javascript
复制
class checker {
    bool is_allowed(Task * task);
}

class Task
{
    bool is_belongging_to_category(Category cat);
    void some_task_to_do()
    {
        ...
        if (checker::is_allowed(this)) { ....}
        else {....}
    }
}

有更好的办法解决这个问题吗?也许是一些已知的设计模式..。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-01-04 15:59:18

这看起来像是可疑的设计。你把任务变成了目标。

假设你的任务是:吃,喝,和Be_Merry

如果您创建了每个任务对象,它们将必须维护对它们所操作的实际个体的引用,然后当满足条件时,它们将需要修改给定个体的状态。

这违反了面向对象设计,后者将对象定义为:

数据结构与作用于数据的方法或函数的紧密耦合或关联

注意,您已经将“作用于数据的方法或函数”与对象分开。相反,您应该对对象Jack和Jill进行建模,这些对象具有方法:Eat、have和BeMerry

checker而言,是否将其打包将取决于您使用的是还是拉码。如果您正在进行推送编码,那么检查器只是Jack和Jill行为属性的一个保持区域,在这种情况下,属性应该被推送到Jack和Jill,而不是保存在checker中。如果它们是所有Jack或Jill对象的属性,请使用static属性。但是,如果使用的是拉编码,则在尝试执行任务之前,这些信息是不可用的。在这种情况下,checker可能是Jack和Jill在执行任务过程中访问的唯一对象。

编辑:

你的评论进一步揭示了设计中的悲剧。似乎您已经启动了一堆正在忙着等待checker的线程。这表明您需要使用拉编码。您是Jack和Jill对象,需要维护它们积极参与的任务,例如m_is_going_to_school,然后当checker获得停止您在设计中等待的条件时,而开始使用goToSchool方法。

票数 0
EN

Stack Overflow用户

发布于 2017-01-04 15:38:10

您可以创建一个向量来存储所有可能允许的选项。您可以使用参数字符串创建一个名为IsAllowed的bool函数(就像您已经做的那样),这将检查它将要执行的选项是否被允许。如果没有,则返回false。不过这只是我的主意。当然,有无数种不同的方法来实现这一点。如果你想要多个选择。然后,您可以创建一个2d向量,并查看相应的行是否有任何选项。祝好运!

票数 0
EN

Stack Overflow用户

发布于 2017-01-04 15:46:19

如果您事先知道类别的最大数量,我建议使用位标志来实现这一点。

代码语言:javascript
复制
enum Category {
    CATEGORY_A = 1,
    CATEGORY_B = 1 << 1,
    CATEGORY_C = 1 << 2,
    CATEGORY_D = 1 << 3,
};

class Task {
  int32_t categories_;
public:
  Task() : categories_(0) {}

  void add_category(Category cat) {
    categories_ |= cat;
  }

  void run() {
    checker::can_run(categories_);
  }
} 

这允许同时测试多个类别:

代码语言:javascript
复制
namespace checker {

bool can_run(int32_t categories) {
  int32_t cannot_run_right_now = CATEGORY_A | CATEGORY_C;   

  if(categories & cannot_run_right_now != 0) {
     return false;
  }
  ...
}
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41467518

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档