是否有一种普遍接受的方法将元信息添加到数组元素,指示如何处理它们?

时间:2009-09-14 12:20:43

标签: arrays metadata element

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

例如,array-element-data ......

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

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

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

  1. 将每个array-element存储为自定义创建的对象(Date,Linkable,Text ...),而不是将array-element作为文本。可能提供默认的.to_string()方法。
  2. 将每个数组元素设为哈希,以便我可以说a[5][7]['text']a[5][7]['link']
  3. 制作不同版本的数组,例如textArray[5][7]linkArray[5][7]
  4. 创建html作为开始并且只使用文本版本似乎是一个坏主意,因为外观因使用情况而异(例如 2009-09-14 vs Mo Sep 14 )。

    或者我只是问错了问题?

3 个答案:

答案 0 :(得分:0)

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

(1)/(2)通常优于(3),因为它们通常使元素与其元数据一起复制更容易。例如,排序时。

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

答案 1 :(得分:0)

作为一般建议,如果数据根本不包含有关如何表示自身的信息,那么最好。

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

但是如果无法做到这一点,或者你必须将两个信息合并为一个数据结构以进行实际转换,我遵循了这条经验法则:

不要聪明,用您的语言做最自然的事情!

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

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

答案 2 :(得分:0)

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

例如,在Ruby on Rails中,表users由类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相同的数据。