是否根据日期打开和关闭UI(或其他)功能(一种代码气味)?


11

我们有一个用ASP.NET 2.0编写的糟糕的系统,我们需要向其中添加一些功能。问题在于,某个产品具有UI功能,对于在特定日期(其他时间已关闭)之后启动的业务,必须打开该UI功能,而页面必须与现有业务的外观相同。

我本能地发现基于日期的JavaScript UI开关的想法,而将新老业务的Web控件混合在一起是“不统一的”(因为想要一个更好的词),所以我努力为新业务重写页面)。

使用基于时间的UI的做法是否已被广泛接受,如果没有,采取该措施的已知风险是什么?


13
如果您的业务领域要求指定了某些功能仅在特定时间范围内对用户不可用,那么这是“设计使然”。如果您不喜欢ux控件出现和消失的想法,请禁用它们而不是隐藏它们。无论如何,该技术是完全有效的。
罗伯特·哈维

1
我发现“在特定日期之后开始的业务”这一短语不清楚。你的意思是业务与贵公司(为客户在特定日期后注册)或业务启动客户端(如果是的话你的客户端只能对数据进行处理某些事情,在其应用客户端的特定日期之后签署了)?在前一种情况下,您是在谈论客户可用的功能。在后一种情况下,您是在谈论限制对某些数据的无效操作(基于数据本身的条件)。答案可能是非常在这种情况下不同。
jpmc26 2015年

Answers:


22

根据为客户启用了哪些功能或他们选择的部署类型来调整UI并没有错,但是更改应该

  1. 取决于有意义的标志(例如,“ HAVE_EXPORT”)来启用/禁用导出选项,而不是基于奇怪的日期比较。UI没有业务知道什么时候发布了什么业务规则,它应该仅执行其UI任务并遵守UI特定的指令。
  2. 在服务器端进行控制,以便客户不能秘密启用未付费的功能。

(需要注意的是相反的- DIS一定时间后abling功能-是一个重大的没有没有,除非你已经清楚地传达,你卖的限时试用版本创建这样。定时炸弹在其他情况下会让人讨厌你比其他任何东西都快。)


2
The UI has no business knowing the business rule about what was published when-好的,但是即使Stack Exchange也有这样的UI规则。例如,对于已关闭问题的其他用户,直到两天后才会显示“删除”链接,并且60天后禁用“迁移”选项。
罗伯特·哈维

我根据此答案阐明了问题:根据日期,某些控件将被删除,而其他控件将被添加。
NMrt 2015年

13
@RobertHarvey,但是在视图中如何编程?是类似if (showDelete) { <button>delete</button> }还是if ((post.date - today).days > 2) { <button>delete</button> }
Arturo TorresSánchez15年

@ArturoTorresSánchez:前者-整个想法是将业务逻辑(例如日期计算)放入服务器。无论如何,这将是一个很好的问题:-)。
sleske 2015年

11

需求本身没有问题,但是实现它有好有坏的方法。如果您将代码复制并粘贴到整个地方,如下所示:

if (businessInitiationDate > cutoffDate)
  enableNewControlsForThisOneLittlePiece();
else
  enableOldControlsForThisOneLittlePiece();

即使现在看起来更快,也很难维护。例如,也许某些时候一些老客户会想要新外观。也许在某个时候会有第三个配置有其截止日期。

理想情况下,您希望此if语句在您的代码中恰好出现一次,最好在服务器端。但是,您还希望避免仅复制整个应用程序并进行更改。找到通用代码并将其分解,然后为不同的部分创建小的单独的函数。然后从一个中央位置启用或禁用这些功能。


6

这是一个要求,尽管看起来很臭-基本上是基于datetime值的配置-没有理由不能使用时间来更改UI。经典案例是卫星导航显示,从白天的明亮颜色变为晚上的深色主题(如果您真的很专注,则介于两者之间)。

但是,我可以提出的一项改进建议是删除启用控件的日期的概念,而不是版本号。该版本设置UI配置(即您有一个标记要为NewCustomer配置,并且将来可以扩展以适应NewNewCustomer所需的其他控件,依此类推)。这在代码中更容易处理,并且闻起来更好。

那么,您只有1个问题,它会根据某些条件设置版本号,这可以通过今天的日期检查(可能是稍后的服务器端配置选项,甚至是用户登录一段时间后设置的Cookie)来完成。未来。


5

这似乎是一个更笼统的问题的特例:根据预定义的规则出于特定原因禁用UI功能是否不好?答案是“当然不是”。特别是日期处理可能很棘手,因为日期和时间很困难,但是根据一般原则,如果这是您的业务需求所要求的,则没有充分的理由不这样做。


3

如果更改与某些对日期敏感的特定业务目的有关,那么这是必不可少的。

如果这是要对程序进行修订以永久更改程序,而旧的设计将不再使用,那么最好在正确的时间简单地部署更新。


1
Nitpick:“最好在正确的时间简单地部署更新。” 例如,部署可能需要停机,这在必须进行切换时是不切实际的。也许会有一段时间并行使用……这确实取决于。
sleske 2015年

或者,也许您想在圣诞节那天使用“播放叮当声”按钮。您可能不需要每个圣诞节都部署它。
sixtyfootersdude 2015年

2

听起来不错。使UI适应不同用户是很普遍的,例如,在stackoverflow上,根据单个用户的业力启用或禁用不同的功能。

您不喜欢它的原因是,相对于每个人都看到相同UI的解决方案,它显然增加了复杂性。但是,复杂性似乎是必不可少的复杂性,即。这是一项业务需求,而不是错误的架构决策的产物。当然,这会有一定的成本(您应该与企业沟通),但是如果企业认为值得,那么您就可以实施它。

已知风险:最大的风险可能是在各种配置下对UI进行测试。如果您开始着手为各种用户组启用/禁用UI功能,则可以快速获得各种可能的配置。

您还应该确保在业务逻辑层中实施限制,以便验证客户不能执行他们不允许执行的操作,即使UI最初不应该允许这样做:


是的,如果UI可以根据各种因素进行更改,则测试确实很棘手。如果必须完成,则必须完成,但这有助于将变化降至最低-并提供一种方法来切换UI进行测试,而与当前日期无关。
sleske 2015年

2

您要描述的是有效约会的概念,这绝非新颖的想法,它的核心是一种时间问题,您可以应用时间模式

本质上,您将在数据库中执行的操作是将有效日期应用于表单模块或表单版本(在此称为组件),存储有关这些组件及其有效开始/结束日期的一些元数据。当然,您还将需要有关应用程序中用户的一些数据。

听起来您可能还有其他令人信服的理由考虑改写此应用程序。如果有效的约会问题是您唯一的问题,我建议也许实施有效的约会是一个更好的选择。如果不是,则必须根据您的方案进行评估。


1

这是一个基于日期进行激活的功能切换-完全有效。想象一下该功能是仅在促销期内使用,还是在某个新日期开始实施新的政府法规时必须终止。

您正在使用APS.NET和JavaScript,但是Java功能切换框架Togglz特别具有基于日期(和时间!)的激活规则

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.