前辈
我想在开始的时候为这段时间道歉。我已经连续三个多月每周工作55小时以上,所以我想尽我所能解释整个问题。另外,请注意,我正在与maven合作开发我公司的框架,因此我可能无法实现所有可能的解决方案,但如果代码中没有安全风险,我可以请求添加库的权限。即使我不能实施有效的解决方案,我仍然会投赞成票。
可能的解决方案?
生成树算法
动态ui构建库
树遍历?
图形方法?
不确定jsr303验证器是否可以在类级别处理这个问题,而不会造成代码的过度杀戮和过度混乱(以防将来的开发人员加入项目)
问题与背景
我需要构建一个动态@viewscope网页,其中包含大约40个布尔字段和一些正常的输入字段,这些字段会一直呈现,但除非有解决方案用java构建ui,否则它们并不相关。用户需要一次回答一个问题,然后根据他们的答案呈现下一个问题—一次回答一个问题。在完全构建的流程图中,至少有17个完整/有效的路径/分支可以采用(即,用户必须使用特定的布尔值回答该工作流路径上的每个问题-每个路径都有一个端点-许多端点在不同的路径上相同-我的主要问题之一)。
我需要构建用户界面,以便只有路径上的下一个问题呈现,这意味着我不仅需要知道他们当前所在的路径(无论是在他们第一次填写表单时还是随后的访问时),但是我需要避免在用户改变之前的答案的情况下,将错误路径上的问题考虑在内——比如他们回答了10个问题,然后又回去修改问题4;否则,即使用户更改为新路径,问题也可以满足从旧路径渲染的条件。
关于一些方法和算法的想法
如果我在向每个人解释问题时做得不好(我盯着这6个流程图看了太久,以至于我都记住了每一条路径。。。想象一下,一个包含所有布尔节点的生成树或者一个包含相同布尔节点的流程图。
我不能使用最小生成树算法,因为无论字段是否呈现,后端实体(如果我采用这种方法,则为pojo)都会固有地保留值,直到页面被保存(下面解释的特定于应用程序的逻辑)。
有很多问题,所以我不能使用minspantree算法,因为用户可以完成一个较小的路径/问题集,改变他们的想法,并移动到一个较长的路径,从而使较短的路径无效。只要提出问题,他们随时改变先前问题的能力没有任何限制。
最大生成树方法在当前设置中不起作用,因为如果路径发生更改,将保留未使用问题的值。如果多次通过,我还需要知道哪个max树是有效的。
其他树遍历算法?
我知道在下一个例子中,我可以通过蛮力迭代类型的方法来验证路径是否完成,即使用(正确排序的)列表或Map检查每个问题。
我可以将这些值Map为表示问题编号的整数(map<integer,boolean>),或者更恰当地Map为表示问题的枚举(map<myquestionenum,boolean>)。
我甚至可以使用dto来保存信息,这样就可以避免Map的性能,只需使用dto来设置实际实体的值(使用beanutils等)。
然后我可以确认所有的值都匹配一个预定的路径,但是这些方法可能需要一些丑陋的代码,因为我无法想象没有更好的方法。从技术上讲,我可以有一个巨大的30-40if/else或switch语句,它只是Map一个enum来处理这个逻辑,但是为什么除非您用尽了所有其他合理的方法呢?。。。
常规页面逻辑
用户将其选择保存为草稿或最终确定/验证。
当用户保存页面时,所有不在已完成路径上的字段都将重置为null。
我希望避免在用户填写表单时将其他路径上的前一个问题设置为null,因为您不想填写10个问题,不小心单击了进程中的第4个问题,并删除了以前所有的信息。
这些是非常大的表单,因此用户不可能一次填写所有内容,也不可能多次更改答案而导致问题,但我们不限制这一点,因此必须对此进行说明。
当前解决方案
我目前的解决方案是在单击其他节点时重置特定的节点值,如果更改会导致清除的节点后面的问题没有机会呈现,但是如果可能的话,我不希望这样做。我必须避免重复的id错误,并且不能对不同位置的同一字段使用不同的id(所以jstl或其他方法(取决于页面布局)。然后在save上,我遍历每一条可能的路径,看看他们是否完成了一个,我清除了所有其他字段。这会导致许多嵌套的if/else语句。
我已经在ui中构建了在特定条件下呈现的面板,以及一个基于每个答案清除值的save方法,但是有太多的排列,它留下了不确定性,即在保存实体时,是否存在任何错误/字段可能呈现和/或在正确条件下不重置的意外方式。
需要注意的是,由于dao调用的性能,我希望避免使用额外的数据库表,而只是使用额外的表,但是我会听取您的任何想法,因此如果您有涉及db工作的想法,请继续分享。
暂无答案!
目前还没有任何答案,快来回答吧!