1

クラスをデータ レコードとして扱うときの Dart のベスト プラクティスは何ですか?

詳細に説明する: アプリを作成する場合、テーブル行のクラスが作成される可能性があります。のように

    class Item {  int itemid, String itemName, double score   }
    Item item = new Item();

これにより、コンパイル時に Dart のタイプミスなどをキャッチできます。(NoSuchMethod に依存するクラスを使用する場合とは異なります。)

また、次のような HTML にバインドするための対応する文字列構造も必要になります。

    <input id="itemname" type="text" bind-value="itemEdit.itemName">

したがって、ダーツは次のようになります。

    class ItemEdit { String itemId, String itemName, String score }
    ItemEdit itemEdit = new ItemEdit();

次に、一方から他方に移動する方法が必要なので、Item にメソッドを追加します。

    fromStrings(ItemEdit ie) {
      itemid = ie.itemId == null ? null : int.parse(ie.itemId);
      itemName = ie.ItemName;
      score = ie.score == null ? null : double.parse(ie.score);
    }

そしてその逆:

    toStrings(ItemEdit ie) {
      ie.itemid = itemId == null ? '' : ie.itemId.toString();
      ie. itemName = itemName == null ? '' : itemname; // Web_ui objects to nulls
      ie.score = score == null ? null : score.toStringAsFixed(2);
    }

また、データベースから jason データを取得するため、Item に別のメソッドを追加する必要があります。

    fromJson(final String j) {
      Map v = JSON.parse(j);
      itemid = v['itemid']; 
      itemname = v['itemname'];
      score = v['score'];
    }  

そして、デフォルト値に戻せるようにする必要があります:

    setDefaults() { itemId = 0; itemName = "New item"; score = 0; }

この冗長さは、私が再び COBOL を書いているような気分にさせてくれます!

私の理解、または Dart/WebUI ライブラリのいずれかで、ここには根本的なものが欠けています。

私が書きたいのは次のようなものです

    class Item extends DataRecord {
      int itemid = 0,
      String itemName = 'New item',
      double score = 0.0;
    }

次に、さらにコーディングすることなく、次のようなコードを記述できるようにします

    item.toStrings();
    ...
    item.fromStrings();
    ...
    item.fromJson(json);
    ...
    item.setDefaults(); // results in {0,'New item',0.0}

そしてHTMLに書くことができるように:

    value="{{item.strings.score}}"

これが可能であれば、現在書いているコードよりも速く、単純で、明確で、エラーが発生しにくいものになるでしょう。

4

2 に答える 2

0

(完全な開示、この回答は、少なくとも1つのバグが修正されることを前提として書かれています。以下を参照してください)

役立つかもしれない3つの提案。

  1. 名前付きコンストラクターを使用して、オブジェクトを解析および作成します。
  2. JSON にエンコードするときに toJson() を利用します。
  3. Web UI から bind-value-as-number を使用する

1) 名前付きコンストラクタ

import 'dart:json' as json;

class Item {
  int itemid;
  String itemName;
  double score;

  Item.fromJson(String json) {
    Map data = json.parse(json);
    itemid = data['itemid'];
    itemName = data['itemName'];
    score = data['score'];
  }
}

2) JSON へのエンコード

dart:jsonライブラリには、オブジェクトを JSON 文字列に変換する関数stringifyがあります。アルゴリズムが文字列、null、数値、ブール値、またはそれらのコレクションではないオブジェクトに遭遇した場合、アルゴリズムはそのオブジェクトで toJson() を呼び出し、JSON エンコード可能なものを期待します。

class Item {
  int itemid;
  String itemName;
  double score;

  Map toJson() {
    return {'itemid':itemid, 'itemName':itemName, 'score':score};
  }
}

3) そうは言っても、簡単に HTML フィールドにバインドして、文字列だけでなくプリミティブな値を取得したいようです。これを試して:

<input type="number" min="1" bind-value-as-number="myInt" />

(注、この機能にはバグがあるようです。https://github.com/dart-lang/web-ui/issues/317 を参照してください) ( https://groups.google.com/a/dartlang. org/forum/#!topic/web-ui/8JEAA5OxJOc )

于 2013-01-21T18:32:19.927 に答える