メタ情報を配列要素に追加して、それらの処理方法を示す一般的に受け入れられている方法はありますか?

StackOverflow https://stackoverflow.com/questions/1421226

  •  07-07-2019
  •  | 
  •  

質問

データベースクエリの結果を含む配列を使用しています。これは、後でhtml(Webアプリケーションの場合)またはcsv(スプレッドシートのインポート用)としてフォーマットされます。 この要素のデータの使用方法に関する追加情報を含む配列要素に情報を添付したい。

たとえば、array-element-data ...

  • ...はリンクとして表示できます。リンク情報を添付する必要があります。配列からhtmlを作成するコードは、それを使用してリンクを作成できます。
  • ...は2009-09-14の形式の日付です。その後、何らかの形で日付としてフラグを立てたいと思います。使用法がhtmlページの場合、それはやや美しく表示できます。 月9月14日または今日;受信者がcsvの場合、それを残すのが最善です。

この問題を解決する最良の方法はありますか?

いくつかの可能な解決策を考えましたが、誰かが既に<!> quot;ベストプラクティス<!> quot;を知っているかどうか尋ねたいと思いました。おそらく最高から最悪まで:

  1. 各配列要素をテキストとして保存する代わりに、各配列要素をカスタム作成オブジェクト(Date、Linkable、Text ...)として保存します。おそらくデフォルトの.to_string()メソッドを提供します。
  2. 各配列要素をハッシュにして、a[5][7]['text']またはa[5][7]['link']と言うことができます。
  3. 配列の異なるバージョンを作成します。 textArray[5][7]linkArray[5][7]

htmlを開始として作成し、テキストバージョンを使用するだけでは、使用法によって外観が異なるため(たとえば、 2009-09-14 vs Mo Sep 14 )。

または間違った質問をしているだけですか?

役に立ちましたか?

解決

言語を指定しない限り、(1)と(2)は基本的に同じです。オブジェクトまたはハッシュ、おそらく構文以外の動的プログラミング言語の違いは何ですか? Luaではすべてが辞書です。

(1)/(2)は通常、(3)よりも優先されます。これは、通常、要素とそのメタデータのコピーがはるかに簡単になるためです。たとえば、ソートするとき。

したがって、言語/環境に固有ではなく、特別な条件がない場合のベストプラクティスは、メタデータと要素を何らかの方法で組み合わせ、結果のデータ型を処理することです。これを行うには、両方を含む新しいクラスを定義するか、元の要素タイプのもう1つのサブクラスを定義するか、汎用ペアを使用するか、汎用辞書を使用するか、元のオブジェクトにメタデータを保存するだけです(これにより、 Javascriptなどの明白なアプローチ)。

他のヒント

一般的なアドバイスとして、データに自身の表現方法に関する情報がまったく含まれていないことが最善です。

代わりに、リプレゼンテーションを作成するアプリケーションの部分には、これらの設定が個別のデータ構造に含まれている必要があります。 XMLファイルと、さまざまな表現を作成するさまざまなXSLTファイルと考えてください。

ただし、これが不可能な場合、または実際の変換のために2つの情報を1つのデータ構造にマージする必要がある場合は、この経験則に従います:

賢くなり、あなたの言語で最も自然なことをしないでください!

  • JavaおよびDelphiでは、常に<!> quot; custom object <!> quot;を使用しました。コンパイル時のチェックなどの特定の利点が得られるためです。
  • PHPでは、PHP風のスタイルであるため、常にハッシュを使用しました。

<!> quot; Solution 3 <!> quot;時々ですが、いつも後悔していました。これらの構造はメンテナンスの悪夢になりがちで、データの観点からもコーディングの観点からも、同期問題に遭遇する可能性が高いでしょう。

Webフレームワークでの一般的なアプローチは、レコードをオブジェクトにマッピングすることです。データベースの1つのレコードが1つのオブジェクトに読み込まれるため、結果はオブジェクトの配列になります。テーブルごとに異なるクラスが必要です。これは、多くのWebフレームワークで使用されているModel View Controller(MVC)パターンの構成要素の1つです。

たとえば、Ruby on Railsでは、テーブルusersはクラスUserによって処理されます。足場を使用して両方を作成します。

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

Date、Boolean、String、Text、Decimal、Integerは、ここでは異なるデータ型です。残念ながらURLはそうではないので、リンクに文字列を使用する必要があります。

次のようにデータベースからユーザーを読み取ることができます:

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

ユーザーオブジェクトの属性には、日付、数値などを処理するための正しいタイプがあります:

if 100.days.ago <!> lt; @ u.joined then ....

データに固有のロジックは、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ビューと同じデータを表示/出力するには、cvs-viewを作成します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top