2

我的意思是通过 ID、代码或在数据库中指定类名来引用特定的数据库行。例子:

您有一个名为SocialNetwork. 这是一个查找表。该应用程序不会写入或删除它。它主要用于数据库完整性;假设整个shebang看起来像这样:

SocialNetwork table:

Id | Description
-----------------------------
1  | Facebook
2  | Twitter

SocialNetworkUserName table:

Id | SocialNetworkId | Name
---------------------------------------------------
1  | 2               | @seanssean
2  | 1               | SeanM

在您的代码中,需要为 Facebook 用户执行一些特殊的逻辑。我通常做的是在代码中创建一个枚举或一些类常量以轻松引用它,例如:

if (socailNetwork.Id == SocialNetwork.FACEBOOK ) // SocialNetwork.FACEBOOK = 1
  // special facebook-specific functionality here

这是一个硬编码的数据库 ID。这不是一个巨大的犯罪,因为它只是引用一个查找表,但数据和逻辑之间不再有清晰的划分,这让我很困扰。

我能想到的另一种选择是在数据库中指定类或委托的名称,但这更糟糕的是 IMO,因为现在您不仅打破了数据和逻辑之间的划分,而且还把自己绑在了一个现在的语言。

我是在无事生非吗?

4

2 回答 2

1

是的,但需要注意的是“这取决于”。不太可能改变,但是。

存储类或委托的名称可能很糟糕,但存储类或委托工厂使用的标记则不然,因为它是语言中立的——但您总是会遇到必须在某处维护连接的问题。除非你有一个与该表相关的特定语言的东西表,否则相信你会被枪杀。

与其在主线代码中保持不断的比较,IMO 这种情况对于工厂/等来说很好。模式、枚举查找等来实现特定于网络的类查找/行为。主线代码不必关心它是如何实现的,它现在就是这样做的——部分是一个真正的问题。

需要注意的是,最终它可能永远不会重要。如果是我,我至少会解耦主线代码,因为这样的事情让我很紧张。

于 2011-10-06T16:33:03.910 回答
1

我没有看到问题。

在某些时候,您的代码需要做一些事情。Facebook 是一个真正的社交网络,拥有自己的真正 API,您希望它在您的代码中执行特定于 Facebook 的事情。除非你的任务是微不足道的,否则将所有 Facebook 特定的东西都放在数据库中意味着你的代码会让人头疼。(例如,Twitter 中的“Like”相当于什么?)

如果 Facebook 条目不在您的数据库中,则不会执行特定于 Facebook 的代码。你可以做那么多。

于 2011-10-06T16:35:03.507 回答