2

この質問は ( Why is there no string interpolation in Scala? ) に関連していますが、より具体的には複数行の文字列を扱っています。

msg = "Hello {name}!" という単純な文字列のプレースホルダーに関する Martin の提案に、私はほぼ同意しました。

今日の Scala では、次のようにほとんど違いなく表すことができます: msg = "Hello"+name+"!"

ただし、そのアプローチが複数行の文字列には当てはまらないと思います。また、場合によっては、読みやすさを優先して他の不適切な慣行を助長している可能性があります。Scala Play ANORM データベース マッピングでは、フレームワークが (プレースホルダーを使用して) プレーンな SQL で可読性を維持しようとする方法に注意してください。 .on("国コード" -> "FRA")

SQL(
    """
        select * from Country c 
        join CountryLanguage l on l.CountryCode = c.Code 
        where c.code = {countryCode};
    """
 ).on("countryCode" -> "FRA")

さらに、これに対処するための Scala の変更がないと仮定すると、インライン XML を使用することの意味は何でしょうか? パフォーマンス、メモリなどは次のようになります。

val countryCode = "FRA"
SQL(<c>        
  select * from Country c 
  join CountryLanguage l on l.CountryCode = c.Code 
  where c.code = {countryCode};
</c>.text)
4

3 に答える 3

0

{ } 置換ごとに切り刻まれた ArrayBuffer として表される文字列コンテンツを持つ scala.xml.Elem が構築されます。私は確かに権威ではありませんが、オブジェクトを構築し、実行時に子を取得してそれらを連結する際に少し余分なオーバーヘッドがあると思いますが、少なくともこの例では、SQLに渡されるとすぐに次に、必要な文字列を抽出する関数 (または、これは暗黙的に行われる可能性があります) を使用すると、Elem オブジェクトが破棄されるため、メモリの使用量が少し余分に消費されますが、短時間だけです。

しかし、全体像として、このソリューションの採用を妨げるのはパフォーマンスではないと思いますが、多くの人は、でっち上げのタグを使用してこのように XML を悪用することに不快感を覚えると思います。問題は、後でコードを読んでいる他のユーザーがタグのセマンティックな意味を理解しようとすることです...タグのセマンティックな意味を見つけようとしているだけです。

于 2011-05-01T21:34:05.303 に答える
0

あなたが与える例は、ほぼ確実に文字列連結を行っておらず、パラメーター化されたSQLステートメントを作成しています(おそらくJDBCのPreparedStatementを介して)。

皮肉なことに、簡単な文字列連結の欠如は、おそらくこの場合のベスト プラクティスを少し奨励しています (ただし、このトピックのどちらの方法でもそれを議論として使用することはありません)。

于 2011-05-02T04:30:29.257 に答える