2014-01-13 10 views
10

さまざまなClojureスタイルのガイドでは、80文字を超える行を避けることを推奨しています。長いStringリテラルを避けるための慣用的な方法があるのだろうかと思います。長いClojure文字列リテラルを避けるための慣用的な方法はありますか?

最近ではワイドスクリーンを使用するのが一般的ですが、長い行を避ける必要があると私は考えています。ここで

は(私が最初に従うことを誘惑しています)いくつかの例を示します。

;; break the String literal with `str` 
(println (str 
    "The quick brown fox " 
    "jumps over the lazy dog")) 

;; break the String literal with `join` 
(println (join " " [ 
    "The quick brown fox" 
    "jumps over the lazy dog"])) 

私はClojureの複数行Stringリテラルをサポートしていますが、このアプローチを使用すると、改行文字の望ましくない効果を持っていることを承知しています例えば、解釈されているreplを使用して:

user=> (println "The quick brown fox 
    #_=> jumps over the lazy dog") 
The quick brown fox 
    jumps over the lazy dog 
+8

@Chiron: "長い文字列リテラルを避けるための慣用方法はありますか?"本当に質問ではありませんか?本当に?私の初等教育はすべてうそでしたか? – Chuck

答えて

4

あなたはおそらく、外部テキストファイル内の文字列を格納し、あなたのコードからファイルをお読みください。文字列をコードに格納する必要があると思われる場合は、strを使用してください。

EDIT:

要求されたとして、私はあなたがコンパイル時に長い文字列を読み取ることができる方法を説明します。

(defmacro compile-time-slurp [file] 
    (slurp file)) 

このようにそれを使用します。

(def long-string (compile-time-slurp "longString.txt")) 

あなたはXML/JSON構成、SQLクエリ、HTML、または任意の他、あなたが必要とする、Javaのプロパティファイルを処理するために同様のマクロを発明することがあります。

+2

本当に大きなテキストを話さない限り、文字列をテキストファイルに入れないでください。運用コスト、パフォーマンスコスト、複雑なコードが追加されます。正解は(str)を使うことです。 –

+0

これはClojureです。 '(slurp" myBigString.txt ")'はコードの複雑さを増やさず(文字列内の改行よりも複雑ではありません)。ファイルIOのパフォーマンスが問題である場合、コマンドはマクロを介してコンパイル時に実行されます。 – WolfeFan

+0

これは、あなたが今考慮しなければならない不要な可能性のある失敗をもたらします。これは、コードの複雑さが増します。あなたは真剣に個々のテキストファイルに80文字以上の文字列を置くことを提案していますか?副作用のない機能の全体のアイデアはどうでしたか? *本当に大規模なもの、または外部から提供されたもの、あるいは動的に生成されて永続する必要があるもののみ、ファイルにテキストを入れます。 –

3

strを使用して文字列を作成し、「\ n」の代わりに\newlineまたは\tabなどの文字リテラルを使用すると便利です。 私はめったにこのように80列ルールに違反します。

1)使用(STR)は、複数のラインの上に文字列を分割する:私の知っている

3

最も慣用的な方法は次のとおりです。

(str "User " (:user context) 
    " is now logged in.") 

これはおそらく最も慣用的な使用法です。私はこれが複数のライブラリとプロジェクトで行われているのを見ました。 (str)がStringBuilderをフードの下で使用するため、高速です。また、この例で行ったように、コードを透過的に混在させることもできます。

2)意味があるときに文字列が80文字の制限を単独で破ることを許可します。

(format 
    "User %s is now logged in." 
    (:user context)) 

基本的に、文字列の80文字の制限を破っても問題ありません。コードを操作するときに文字列を読んでいる可能性は低いですし、例外的に、必要に応じて水平にスクロールする必要があります。

これまでの例と同様にコードを挿入できるように、文字列を(形式)でラップしました。あなたはする必要はありません。


あまり慣用的な方法は、次のようになります。

3)ファイルで、あなたの文字列を入れて、そこからそれらをロード。​​含む:ファイル付き

(slurp "/path/to/userLoggedIn.txt") 

それが失敗する可能性を秘めているIOの副作用

  • を紹介

    • 、言う:

      User logged in. 
      

      を私はこれに対して助言するので、パスが間違っているか、リソースが紛失しているか、ディスクのエラーなどです。

    • パフォーマンスに影響があり、ディスクの読み込みが遅い。
    • 必要な場合は、コードからコンテンツを挿入するのは難しいです。

    あなたのテキストがの場合、実際にはが大きい場合にのみこれを行うと言います。または、文字列の内容を非デベロッパーが変更する必要がある場合。または、コンテンツが外部から取得された場合。

    4)すべての文字列を定義してそこからロードする名前空間を用意してください。あなたはこのように使用

    (ns msgs) 
    (defn logged-in-msg [user] 
        (format 
    "User %s is now logged in." 
        user)) 
    

    (msgs/logged-in-msg (:user context)) 
    

    私は#3の上にこれを好みます。ここでも#2を使用できるようにする必要があります。文字列に80文字の制限を掛けても問題ありません。実際には、ここでは文字列を1行に入れて書式設定するのが簡単です。 checkstyleのようなコード解析を使用する場合は、このファイルをルールから除外できます。それはまた、#3の問題に苦しんでいません。


    あなたが#3、#4で予定している場合、あなたはおそらく国際化のように、あなたの文字列のための特別なユースケースを持っている、またはビジネス編集にそれらを持つ、など、これらのケースでは、あなたがより良い建物を務めたかもしれません上記の方法に触発されるより堅牢なソリューション、またはそれらのユースケースを専門とするライブラリを使用することができます。

  • 関連する問題