Clojure の原則はありますか?
a. Java などの OO 言語のSOLID オブジェクト指向設計原則のように?
b. または、「聞かないでください」、「構成と継承を優先する」、「インターフェースと話す」など、よりヒューリスティックなものはありますか?
(柔軟なコード用の) 設計パターンはありますか?
オブジェクト指向のカプセル化のような関数型プログラミングの基本の反対部分は何ですか?
これらのリソースを知っていますか?
Clojure の原則はありますか?
a. Java などの OO 言語のSOLID オブジェクト指向設計原則のように?
b. または、「聞かないでください」、「構成と継承を優先する」、「インターフェースと話す」など、よりヒューリスティックなものはありますか?
(柔軟なコード用の) 設計パターンはありますか?
オブジェクト指向のカプセル化のような関数型プログラミングの基本の反対部分は何ですか?
これらのリソースを知っていますか?
最初の質問: いいえ。†</sup>
Clojure は、物事を正しく、迅速に、楽しく行うために役立ちます。その後はすべて肉汁です。
そして肉汁もたっぷり。Clojure の方法があったとしても、Clojure の方法を知っているとは思いませんが、Clojureで書いているときに言われて発見したガイドラインを次に示します。
まず、何かを機能させます。その後、必要に応じて調査、テスト、および最適化を行うことができます。time
マクロがコア言語にあるのには理由があります。迅速さよりも正確さ、かわいいこと。
概要。繰り返している場合は、おそらく正しく行っていません。関数の作成、カリー化、および結合。
ロジックから副作用を分離します。たとえば、文字列をフォーマットして保存する場合は、ある関数でフォーマットしてから、別の関数を使用して保存しますが、必要があります。
3a. これに夢中になりすぎないでください。コードを散らかす1 行の s の束よりも、いくつかの無名関数を使用する方がよい場合がありdefn
ます。
テスト。Rich はあなたに REPL を与えました。そのREPLから地獄を使用してください。
名前空間を乱雑にしないでください。私たちは Clojure ランドでクリーンです。を修飾するか、必要なものをuse
使用してください。:only
コードを読みやすくします。
コア ライブラリを理解する。だけでなく、、、clojure.core
およびclojure.java.io
その間clojure.string
のclojure.set
すべて。Clojure には X を実行する機能が必要だと思う場合は、おそらくそうです。apropos
(はい、別のコアライブラリから:)を使用できますclojure.repl
。
コードを文書化します。Docstring は美しいものです。冗長になりがちな場合は、doctsring を解放する場所です。ただし、優れたコードはしばしば「それ自体を文書化」することも知っておいてください。コードが自明である場合、衒学的である必要はありません。
これは関数型言語です。可能な場合は、関数を使用してください。プロトコル、マクロ、およびレコードはすべて優れています。関数を作成、結合、マップ、削減、反復 (リストは続きます…) できます。それは本当にうれしいです。
とりわけ、それが理にかなっている場合は、上記の規則を破ってください。ただし、再考してリファクタリングする準備をしてください。コードを十分にモジュール化している場合、コードのリファクタリングは再編成と再結合の問題になるはずです。
その他のヒント: 他の人のコードを読んでください。コードを読み始め、コードを読むのが上手になれば、自分でコードを書くのも上手になり、新しいことも学べるでしょう。ほぼすべてのことを行う方法は複数あります。
最後に、Clojure Library Coding Standardsを読んで、実稼働の Clojure コードで何が期待されているかを把握してください。
† 少なくとも、まだです。
難しい質問です。
Clojure は非常に柔軟です。したがって、これらはベスト プラクティスですが、Java ほど重要ではありません。
ここでは、最も一般的なファミリーから最も特殊なファミリーまでのアドバイスの例をいくつか書きます。
プログラミング全般に関するアドバイスがあります: たくさんのテストを書く、正しくて良いものを書く、プロファイルを作成し、必要に応じて最適化する
関数型プログラミングに関するアドバイスがあります: 小さな関数を書く、純粋な関数を書く、小さな関数を構成する、関数を使ってコードを因数分解する、可能な場合はコンビネータを使用する...
LISP には次のようなアドバイスがあります。マクロを使用して反復パターンを除外し、プログラムをボトムアップで構築します。(私の説明よりも詳しい説明については、Paul Graham の 'on LISP' を参照してください)
また、Clojure に特化したアドバイスもいくつかあります。状態と ID の注意深い分析 ( http://clojure.org/state、非常に適切な説明) に従い、可能な場合は seq とその関数を使用してみてください。関数のドキュメント文字列を記述してください。
Clojure Library Coding Standard http://www.assembla.com/wiki/show/clojure/Clojure_Library_Coding_Standardsは、より多くのアドバイスの良い情報源です。
しかし、これらのアドバイスはすべて単なるアドバイスであり、Clojure は Lisp として非常に柔軟であるため、これらのアドバイスに従いたくない人でも使用できます。
設計パターンに関する限り、関数型プログラマーがこれらの用語で考えることはめったにありません。それらのほとんどは OO 言語用に設計されており、関数型言語には適用されないためです。
Peter Norvig は、デザイン パターンと LISP/Dylan に関する興味深いスライドを持っています: http://norvig.com/design-patterns/
それが役立つことを願っています。
1a) 私はそのようなことを知りませんが、FP に関するすべての本はそのようなことをします。
1b)
「Favor Composition vs Inheritance」 --> FP で開始したため、既に処理されています
「抽象化と話す」 --> より一般的
「できるときは怠惰になりなさい」
「回避状態」
「PURE FUNCTIONを使おう!!!」
リスト項目
....
2.)実装がはるかに簡単ないくつかの同じ設計パターンを使用できます。それらのいくつかはあまり意味がありませんが、通常は. FPの人々はそれを大したことはしません。(これは私しか知らないGoFパターンについてです)
たとえば、observer-pattern を見てください。Clojure では add-watcher 関数を使用して、observer-pattern を廃止することができます。
3.)名前空間でカプセル化を使用して defn- を参照するか、関数を他の関数で非表示にすることができます。Joy of Clojure にいくつかの例があります。好きなだけ押すことができます。
Don't Repeat Yourself (DRY) プリンシパルは、clojure に非常によく適用されます。この言語は非常に柔軟であり、ボイラーの場所のコードの量をゼロに近づけることができる方法で抽象化を構成することを実際に促進します。
重複したコードを削除する方法の例を次に示します。
(lazy-seq (cons (do-something data) (call-myself (rest data)))
を確認してください。map
iterate
(def send-formated-xml (comp send xml format))
この方法を使用して、後で format 関数をデータにマップすることができます。ここに「thinkinginclojure」について言及しているブログの投稿があり、それは本The Joy Of Clojureや他のいくつかの本(そしていくつかのビデオへのリンクさえ)へのいくつかのポインターを与えます
今、私は本The Joy Of Clojureを手に入れ、それを少し読んで、それは私に「TheWayOfClojure」を教えることを約束します。私が探しているもの、いくつかの原則を教えてくれることを願っています...
この本は進行中の作業ですが、ここの人から「早期アクセス版」を購入して、コード「s140」で40%を入手できます。ここで情報を参照してください