は機能ClojureためGroovy読みやすくするために?
-
19-09-2019 - |
質問
OK、不正な行為が発覚した場合。
いや、本当は、著名な方々を講師としてお迎えしたいものです。
ものは何か"玉"かがですか?
編集:簡易にcgrandた。
(defn redux [[current next] flag] [(if flag current next) (inc next)])
(defn positions [coll]
(map first (reductions redux [1 2] (map = coll (rest coll)))))
現在、このバージョンになっていますか?
def positions(coll) {
def (current, next) = [1, 1]
def previous = coll[0]
coll.collect {
current = (it == previous) ? current : next
next++
previous = it
current
}
}
私は学習Clojure好きだったから、私はいつも楽しみの機能です。かかったとのことなく、Clojure解していただき、有 考え の優雅な解決策です。のGroovy解決には大丈夫していると思う点を見たいのこのようなプロ ボーリン および機械的である。後における12年のJavaを感じじゃやっぱりワンパターンと機能性プログラミングClojureでは、ブがあります。
権を取得します。でも、私は正直に言ったね"と言っていただけるのだろうかと思を理解するClojureコードに行った時に、ワークショップをおこなうすることを意味している。いうコメントゃでもしっかり身につけるためコメントのJavaコードを理解します。
このような中、私の質問はでかっこのプログラミングのパターン?ているプログラミング達のこのコードで簡単か?るオープンアクセスのた す 見してわかりやすい?
編集:このコードでは計算の手によってポイントなトラックの方につけられています。例えば:
Pos Points
1. 36
1. 36
1. 36
4. 34
5. 32
5. 32
5. 32
8. 30
解決
とは思わないものはあるのという固有の可読性あうん、うん。私は読むことのできる両方のバージョンに対的なヘルプオーサリング-ツールOKです。私が実際に読み、どんなGroovy版は、より簡単にでもないわからないGroovyのためにも使わみCおよびJavaのみが期待でClojure.ないと言うことなのでっかいだった。
同様に少しでも読英語やスペイン語がないと言うものの本質的な読みやすくするための工夫その言語です。(スペイン語は、実はおそらく、"読みやすくするために"言語の面でも一貫性がだいたい読めます。私は日本語を学ぶ今や体の苦労が、日本語を母語と言う方には英語とします。
きもともとは人生読書JavaはもちろんこのようになJavaが読みやすいようになります。まんだけ多くの時間を費やしみLispy言語としてみるとCのような言語ストはtrueです。
の理解、言語などをすることができます。:
- 構文(
[vector]
対(list)
,hyphens-in-names
) - 語彙(what does
reductions
を意味するのか。か/どこですか?) - 評価ルールが処理機能のオブジェクトとして働くのか?このエラーたします。)
- イディオムのように、
(map first (some set of reductions with extra accumulated values))
これらすべての時間と実践の繰り返し学び、自分のもの.なお過ごしいただいた翌6カ月の読み書きのClojureせることが可能と考えていることを理解するClojureコード6ヶ月から現在ましょう理解でよい、とってもできる簡素化します。この:
(use 'clojure.contrib.seq-utils) ;;'
(defn positions [coll]
(mapcat #(repeat (count %) (inc (ffirst %)))
(partition-by second (indexed coll))))
みClojureコードを書いた年前、私は凄い方は悪いですが、私が読んでOKです。(ながとうごClojureコードが怖;困らなかった朗読でないと思うのないグルなのです。)
他のヒント
私はティモシーに同意する:あなたはあまりにも多くの抽象化を紹介します。私はあなたのコードを再加工し、終了してます:
(defn positions [coll]
(reductions (fn [[_ prev-score :as prev] [_ score :as curr]]
(if (= prev-score score) prev curr))
(map vector (iterate inc 1) coll)))
あなたのコードについて、
(defn use-prev [[a b]] (= a b))
(defn pairs [coll] (partition 2 1 coll))
(map use-prev (pairs coll))
単にリファクタリングすることができます:
(map = coll (rest coll))
の編集:はもはや適切ではないかもしれません。
のClojureの一つが私には複雑です。それは理解する必要があるより多くの抽象化が含まれています。これは、高階関数を使用しての価格です、あなたは彼らが何を意味するか知っている必要があります。だから、分離された場合には、不可欠あまり知識が必要です。しかし、抽象化の力は、組み合わせの彼らの手段です。シーケンスの抽象化を使用すると、ループの複雑さを取り除き、強力なopperationsを組み合わせることができ、一方、すべての不可欠ループは、読んで理解する必要があります。
私はさらにそれは本当に、高階関数をマッピングされ、収集使用してGroovyのバージョンは、少なくとも部分的に機能していることを主張するだろう。また、それにいくつかの状態を持っています。
ここで私はClojureのバージョンを記述する方法を次のとおりです。
(defn positions2 [coll]
(let [current (atom 1)
if-same #(if (= %1 %2) @current (reset! current (inc %3)))]
(map if-same (cons (first coll) coll) coll (range (count coll)))))
これは、可変「現在」を使用していることでGroovyのバージョンと非常によく似ているが、それは次/前の変数を持っていないという点で異なる - の代わりにそれらのための不変の配列を使用します。ブライアンはelloquentlyそれを置くとして、読みやすさは本質的ではありません。このバージョンでは、この特定のケースのための私の好みです、そして途中でどこかに座っているようです。
のClojureが肥大化が一;いものがあります。OOのバースデー命輝く瞬間を読みます"relatable"が高ます。機能言語により"algorithimc"(プリミティブ/小)雰囲気になりますね。このような感じです。それが変わって経験clojure.
私たちdecendingのゲームの言語のできる最も簡潔にまたは問題を解決するには、少なくともコンポーネントです。
は2倍く:
かく一見の雰囲気が伝わるかをコードしてるのでしょうか?.この重要なコードをスペースからの通信が可能です。
どれほど簡単では推測でのロジックのコードについて教えてください。.すぎにデフォルト値が設定され冗長?.もエッセイは英語で書?
"まるようにプロセスがより簡単になります。"
アルバート-アインシュタイン
私もClojureのを学習し、それを愛しています。しかし、私の開発のこの段階では、Groovyのバージョンは、理解しやすくしました。私はかかわらず、Clojureのを好きなことは、コードを読んで、持っている「なるほど!」を何が起こっているか、あなたが最終的に「取得」経験。本当に私は<全角> の楽しみは、あなたが方法のすべてを実現する場合、数分後にコードは、コードを変更することなく他のタイプのデータにも適用することができるたまたま同じような経験です。私は、しばらく後に、その同じコードは、文字列、記号、ウィジェットで使用することができる方法の考えをClojureの中で、いくつかの数値コードを通じて勤務してきた...
私が使用アナロジーは色を学ぶです。あなたは色の赤に導入されたときに覚えていますか?あなたはかなり迅速にそれを理解 - 世界のすべてのこの赤いものがあります。その後、長期マゼンタを聞いて、しばらくの間、失われました。しかし、再び、もう少し露出した後、あなたは概念を理解し、特定の色を記述するために多くの、より具体的な方法を持っていました。あなたは、あなたの頭の中で少しより多くの情報を保持し、コンセプトを内部化する必要がありますが、あなたは、より強力かつ簡潔なものになってしまいます。
Groovyはあまりにもこの問題を解決するための様々なスタイルをサポートしています:
coll.groupBy{it}.inject([]){ c, n -> c + [c.size() + 1] * n.value.size() }
間違いなく理解することはかなりではなく、あまりにもハードであることをリファクタリングしない。
私はこの質問への答えではないですけど、私は、次のようなテストがある場合は、コードを「理解」はるかに良いことができるようになります。
は、assert positions([1]) == [1]
assert positions([2, 1]) == [1, 2]
assert positions([2, 2, 1]) == [1, 1, 3]
assert positions([3, 2, 1]) == [1, 2, 3]
assert positions([2, 2, 2, 1]) == [1, 1, 1, 4]
これは、コードが行うことに期待されているものを、今から1年、私に教えてくれます。私はここで見てきたコードのいずれかの優れたバージョンよりもはるかに優れています。
オフトピックの本当に私はをでしょうか?
他の事は、私は、「読みやすさ」は、文脈に依存だと思う、です。これは、コードを維持する人によって異なります。例えば、Groovyのコード(但し華麗な)の「機能」のバージョンを維持するためには、Groovyのプログラマーが、機能のGroovyプログラマだけでなくかかります... 他の、より関連性の例は次のとおりです。研究してきたする必要はありません:数行のコードは、それが簡単に「初心者」のClojureプログラマのために理解して作る場合、それはより大きなコミュニティに理解されるため、その後のコードは、全体的な読みやすくなります3年間のClojureのコードを把握し、それに編集を行うことができるようにする。