马克正在建立一个需要生成数十万个广告的 ads 平台,然后将其发送到 AdWords、Facebook 和 Bing ,所有这些都通过图形用户界面(GUI)进行管理。
马克从一个称为 Ad 的实体开始,很快就变得膨胀。AdWords 的广告有 headline_part1 和 headline_part2 ,但 Facebook 里面不是这样,而 Bing 只有一个 headline(标题)。 他需要想办法分开他的实体。他考虑到不同的语境,以及他如何利用语言的命名空间来表达这一点。 他想出了以下结构:
Adwords::Ad:这表示 Adwords 中一个 ad 对象。它用于专属于 Adwords 的属性以及可包含在该类的逻辑处理。
Facebook::Ad:和上一个类似,但是它拥有 Facebook 专有的要求和逻辑处理。
Bing::Ad:和上面的类似。
RemoteAdService::Ad:这个作为 Adwords::Ad、Facebook::Ad、Bing::Ad 与系统的其他部分交互的接口。这意味着这三个类将会拥有同样的公共 API,允许系统使用多态。
Database::Ad:这是 ads 表的 ORM。它使用 ActiveRecord、DataMapper 或者其他自定义方案。
GUI::Ad:这表示在 UI 上用于显示广告的属性。它可能包含展示和国际化的功能。
API::Ad:针对那些用于自定义属性的广告的 HTTP 终端,因此序列化的逻辑保存在这里是有道理的。
单词在不同的上下文中可以表示不同的东西,当我们考虑上下文时,我们可以为组件选择更简单的单词。 在这个示例中,我们没有必要做任何复杂动作来找到这些组件名称,因为它们是一回事,ad(广告)。