1

我正在使用一个包含数据库查询结果的数组,该结果后来被格式化为 html(用于 web 应用程序)或 csv(用于导入电子表格)。我想将信息附加到数组元素,其中包含有关如何使用该元素的数据的一些附加信息。

例如,数组元素数据...

  • ...可以显示为链接:那么我想要附加链接信息。从数组创建 html 的代码可以使用它来创建链接。
  • ...是形式的日期2009-09-14:然后我想以某种方式将其标记为日期。如果使用的是 html 页面,那么它可以显示得更漂亮一些,例如Mo Sep 14Today;如果收件人是 csv,最好留下它。

是否有解决此问题的最佳实践方法?

我确实想到了几种可能的解决方案,但想问是否有人已经知道“最佳实践”。从最好到最差:

  1. 将每个数组元素存储为自定义创建的对象(日期、可链接、文本...),而不是将数组元素存储为文本。可能提供默认.to_string()方法。
  2. 使每个数组元素成为哈希,这样我就可以说a[5][7]['text']or a[5][7]['link']
  3. 制作不同版本的数组,例如textArray[5][7]linkArray[5][7]

创建 html 作为开始并仅使用文本版本似乎是个坏主意,因为外观因使用情况而异(例如2009-09-14 vs Mo Sep 14)。

还是我只是问错了问题?

4

3 回答 3

0

除非您指定语言,否则 (1) 和 (2) 基本相同。一个对象或一个哈希,除了语法之外,动态编程语言有什么区别?在 Lua 中,一切都是字典。

(1)/(2) 通常比 (3) 更受欢迎,因为它们通常使复制元素及其元数据更加容易。例如,在排序时。

因此,在没有特定于语言/环境的情况下,在没有任何特殊条件的情况下,最佳实践是以某种方式组合元数据和元素,并处理生成的数据类型。您可以通过定义一个包含两者的新类、定义原始元素类型的多个子类、使用泛型对、使用通用字典或仅将元数据存储在原始对象中来做到这一点(这将例如,Javascript 中的显而易见的方法)。

于 2009-09-14T12:41:02.350 回答
0

作为一般建议,最好数据完全不包含有关如何表示自身的信息。

相反,创建表示的应用程序部分应该在单独的数据结构中具有这些设置。将其视为一个 XML 文件和创建不同表示的各种 XSLT 文件。

但如果这是不可能的,或者当您必须将这两个信息合并到一个数据结构中以进行实际转换时,我遵循了这个经验法则:

不要太聪明,做你的语言中最自然的事情!

  • 在 Java 和 Delphi 中,我总是使用“自定义对象”变体,因为它具有某些优点,例如编译时检查。
  • 在 PHP 中,我总是使用哈希,因为它更像是 PHP 风格。

我有时做过“解决方案3”,但我总是后悔。这些结构往往会成为维护的噩梦,从数据的角度和编码的角度来看,您很可能会遇到同步问题。

于 2009-09-14T12:44:32.457 回答
0

Web 框架中的一种常见方法是将记录映射到对象:将数据库中的一条记录读入一个对象,因此您的结果是一个对象数组。对于不同的表,您需要不同的类。这是许多 Web 框架中使用的模型视图控制器 (MVC) 模式的构建块之一。

例如,在 Ruby on Rails 中,Tableusers由 Class 处理User。您使用脚手架创建两者。

ruby script\generate scaffold user lastname:string link:string joined:date

Date、Boolean、String、Text、Decimal、Integer 在这里是不同的数据类型。不幸的是 URL 不是,所以我必须使用 String 作为链接。

您可以像这样从数据库中读取用户:

@u = User.find(77)       # gives you one object
@list = User.find(:all)  # gives you an array of User-objects

用户对象的属性具有正确的类型来处理日期、数字等:

如果 100.days.ago < @u.joined 那么 ....

数据固有的逻辑在 User 类中实现。

用户列表可以使用如下视图显示在 HTML 中:

  <h1>Listing Users</h1>
  <table>
    <tr>
      <th>Lastname</th>
      <th>Link</th>
      <th>Joined on</th>
    </tr>
  <% @list.each do |user| %>
    <tr>
      <td><%=h user.lastname %></td>
      <td><%= link_to "Homepage", user.link %></td>
      <td><%=h user.joined %></td>
    </tr>
  <% end %>
  </table>

显示数据所固有的逻辑在视图中实现。对象的哪个属性将被视为链接或普通文本的知识存在于视图中,而不是对象本身。

通过创建 cvs-view 来显示/输出与 cvs 相同的数据。

于 2009-09-14T13:03:10.870 回答