如何以面向对象的方式建模商店的营业时间?

3

我需要什么

我想要构建一个应用程序,其中包含一个名为“商店”的模型。每个商店都有营业时间。这些营业时间可能非常复杂。最好通过示例来展示复杂性:

  1. 商店周一至周五从10点到18点营业。
  2. 商店周一至周三从10点到18点营业,周四从14点到18点营业,周五从10点到14点营业。
  3. 商店每周七天从10点到18点营业,但仅在给定的时间段内,例如从2014年4月18日到2014年5月30日。
  4. 商店每月第二个星期六从10点到16点营业。
  5. 商店全年每周一至周六营业,时间从早上8点到晚上8点,但在一些特殊日子如12月24日至26日和复活节星期一不营业。

正如您所看到的,有许多复杂的组合。

生成的数据结构应支持以下三件事:

  1. 返回商店在未来半年(或同等数量级)中营业的所有时间段的列表
  2. 返回面向最终用户显示的可读性开放时间表示形式。
  3. 商店的营业时间将由最终用户输入,最终用户应该能够使用表单轻松地指定上述任何可能性(无需培训,它在网站上)。

我的方法

我试图将其建模为一个对象结构。我目前的想法是:

  • 每个营业时间都是实现通用接口的对象。
  • 对于每种情况,都有一个实现它的类,例如:

    • 一个类是“每周营业时间”,它模拟了#1(每周每天的开放和关闭时间)
    • 一个类是特定单个日期(12月24日)
    • 一个类是每个月循环时间的类(每个月第二个星期六)
    • 一个类是更大的时间跨度(2014年4月18日至2014年5月30日)
    • 如果需要,还可以有更多。
  • 每个商店都有一个营业时间列表。

  • 这些营业时间中的每一个都有一个例外列表,其中每个例外都是一个营业时间本身,该营业时间本身可能有例外。

我看到的问题

我最担心的是可用性:我如何打印像这样建模的营业时间,用户如何输入它们?

我接受其他方法。还没有实现任何内容,而且想到上述方法时,我的胃口也疼...


没错,祝你好运,期待有关这个问题的一些想法。但不用担心,总会有人想出一个好主意的,他们总是这样的 ;) - mpm
在您选择的面向对象语言中使用iCalendar RRules和支持它的库。 - Neil McGuigan
@NeilMcGuigan 你知道PHP的一些库吗?我只找到了iCalcreator,但它对我来说似乎不是很高级。 - Jost
1个回答

3

就数据建模标签而言,一个单独的实体:

OpeningPeriod(CalendarDay, OpeningHour, ClosingHour)

或者

OpeningPeriod(OpeningTimeStamp, ClosingTimeStamp)。

任何商店/组织的完整开放/关闭时间表都是这种开放期间的集合。

不要试图捕捉某种“通用的全面的预测方式”,以便完整描述任何可能的开放/关闭时间表,包括所有例外和例外的例外。你会失败的,因为“例外”的性质是没有尽头的。当您开始尝试在重叠规则之间“优先考虑”时,您也会很快遇到严重的问题。

只需尽可能在UI中构建“标准”基于规则的设施,再加上管理OpeningPeriod的最低详细信息的设施,以处理任何可能的“未被提供的规则未处理的异常情况”即可。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接