-1

我正在构建一个“调查”类型的应用程序。用户使用预先审查的答案回答一组问题。

Question: Where do you live?
Answers: England, Finland, Spain, France, Monrovia

在这种情况下,答案将在 DropDownList 中。

一旦用户完成了基本回答(位置、年龄、性别等),我希望能够阻止他们根据他们的回答访问调查的其余部分。

例如,如果他们住在英格兰以外的任何地方,我想将他们引导到一个页面,上面写着“谢谢,但 Monrovian 无法完成这项调查”。我需要我的过滤是用户可配置的(基于表格),并且我需要能够拥有 AND 和 OR。
因此,作为用户的一个过滤器必须每年赚取 100k+。另一个他们必须要么住在西班牙,要么是女性并且喜欢火车模型 - “100k+ && (Spain || (Female && Trains))”

我通常会为此使用枚举和位掩码,但由于我的国家/地区列表有 200 多个项目,我想不出一种明智的方式来存储过滤。

希望我有一些意义,并且有人有一个不错的解决方案:)

4

1 回答 1

2

我不知道我是否可以完全回答你的问题,但我会尝试......

因此,我们有一堆只有在用户之前选择了一些答案时才对用户可见的视图,例如,如果她超过 30 岁,她将看到视图#3,如果她小于 30 岁并且来自中国,她将看到视图#4 , 如果她 40 岁以上并且来自西班牙或意大利,则查看#5,依此类推...我还想介绍 **step** 的概念,对于每一步,我们可以有 1、2 或更多相应的观点。每个视图都应该有一组规则(如上面的规则)来定义它是否显示。

如何创建这些规则?这些规则可以是过滤器类/接口的简单实例,当被询问时,应该返回真/假。像这样:
interface Filter {
     boolean apply();
}

然后您可以创建过滤器,例如“30 岁以上”、“来自西班牙”等。请记住,每个视图都配置了一组规则(过滤器),因此如果被问及是否可以显示自己,它可以回答是/否。

接下来,如何应用这些过滤器?我们可以有一个只知道 **steps** 的控制器对象(每个步骤可以有一个或多个对应的视图,正如我所说的),并且,在用户在当前步骤按下 **next** 之后,它应该收集答案并根据附加到每个视图的规则应用它们。就像,从第一步中获取答案,并将它们应用于第二步中的所有视图,然后查看哪个匹配(返回 true)。例如,在第二步,您可以有两个单独的视图,一个用于年轻人,另一个用于老年人,您可以应用每个视图的规则来决定是显示老视图还是年轻视图。我可以给你一个代码示例,你也可以自己研究,因为我对你的技术环境一无所知。我在类似的问题上使用了 Google Guava 的谓词,这里是:假设我们正在处理 Witch 对象,每个对象都有 name(string)、age(int) 和 spells(collection) 属性。如果我有一个女巫列表,并且需要根据特定标准对它们进行排序,我可以这样做:

// first I want to sort witches by age(natural ordering) then by spells, 
// and then by name lexicographically
Ordering.natural()
    .compound(new BySpellsWitchOrdering())
    .compound(new ByNameWitchOrdering())
    .sortedCopy(witchList);

上面的代码行将获取女巫列表并根据标准返回一个排序好的女巫列表。你的情况很相似。

接下来,如何创建答案?对于每个视图(页面),您都有可能的答案,例如对于视图#1,您可以有:年龄、性别、种族、国家。您可以以字符串、整数、枚举的形式构造一些答案,然后将它们传递给控制器​​,然后控制器会将它们应用到与下一步对应的每个视图中。

至于如何将规则存储在数据库中,例如,您可以有一列定义规则名称(例如,OLDER THAN)和一列用于值,例如 30。同样,我对您的环境了解不多,这是一个非常普遍的问题,所以我将在这里停止......

于 2013-09-11T19:46:07.450 回答