Clojureについてのセッションを実行したいと思います。 Clojureで関数型プログラミングを使って優雅に解決できる問題をお勧めしますか?このトピックを扱うリソースを指摘できますか?Clojureの優れたショーケースは何ですか?
答えて
のClojureを使用するための引数の多くのカップルは、同時実行の取り扱いに関連すると思われるが、私はここでその問題には触れません。
私は、週にJavaを使用して週を処理しなければならないいくつかの問題と、Clojureでどのように解決するか、解決する方法をリストアップします。 Javaでは
不変
不変性を達成することは非常に非常に困難です。厳密なコーディングの慣行に加えて、フレームワークとライブラリを非常に慎重に選択する必要があります。副作用として、きれいで使いやすいAPIを作るためにたくさんのコードを書いたり、クライアントに対処させたりするだけです。 Clojureので
final Person person = personDao.getById(id);
// I would like to "change" the person's email, but no setters... :(
あなたはので、あなたのすべてのオブジェクトは、デフォルトでは不変であり、これによるClojureのにこれらの構造を操作する強力な機能を提供しています不変のデータ構造に基づいてデータをモデル化します。 Javaでは
(let [person (get-by-id person-dao id)
person-with-email (assoc person :email email)]
; Use person-with-email...
変換
あなたはフィールドid
、name
、email
、socialSecurityNumber
などとドメインクラスPerson
を持っています。データベース内のすべての人物の名前と電子メールを取得するためのWebサービスを作成しています。ドメインを公開したくないので、name
とemail
を含むクラスPersonDto
を作成してください。これは簡単だったので、Person
からPersonDto
にデータをマッピングする関数が必要になりました。おそらくこれは次のようなものです:
public class PersonPopulator {
public PersonDto toPersonDto(Person person) {
return new PersonDto(person.getName(), person.getEmail());
}
public List<PersonDto> toPersonDtos(List<Person> persons) {
List<PersonDto> personDtos = new ArrayList<PersonDto>();
for (Person person : persons) {
personDtos.add(toPersonDto(person));
}
return personDtos;
}
}
これはあまり良くありませんでしたが、もっとデータをDTOに入れたいのですが?まあ、toPersonDto
のコンストラクタコードは少し心配する必要はありません。上記のようなユースケースが2つあり、電子メールだけを送信したい場合はどうなりますか?さて、私たちはname
をnullにしたり(悪い考え方)、新しいDTOを作成するかもしれません。恐らくPersonWithEmailDto
です。そこで新しいクラスを作成し、データを取り込むためのいくつかの新しいメソッドを作成します...これはどこにあるのでしょうか?にアドホックデータを追加することも
(map #(person-with-fields % :name :email) persons)
:人物のリストを操作するため
(defn person-with-fields [person & fields]
(reduce #(assoc %1 %2 (get person %2)) {} fields))
(person-with-fields {:id 1
:name "John Doe"
:email "[email protected]"
:ssn "1234567890"} :name :email)
; -> {:email "[email protected]", :name "John Doe"}
そして:
Clojureの、不変のデータ構造と動的型付け言語では、私はこれを行うことができます人は簡単でしょう:
(assoc person :tweets tweets)
これは何も破れません。 Javaでは、オブジェクトが不変の場合はおそらくセッターがないので、1つのフィールド(new Person(oldPerson.getName(), oldPerson.getEmail(), tweets
)を変更するために多くの定型文を書くか、まったく新しいクラスを作成する必要があります。変更可能なオブジェクトは素晴らしいAPI(oldPerson.setTweets(tweets)
)を提供しますが、テストして理解することは難しいです。
をテスト
Javaコードの多くは、それが必要でない場合でも、いくつかの状態に基づいています。これは、テスト可能性を念頭に置いてコードを作成していない場合、通常は追加の定型文を意味し、この状態を模擬することができることを意味します。一方、モックのないテストは、通常遅く、データベースへのアクセスや時間、またはあなたが必ず失敗することになります。
Clojureをコーディングしている間、私は実際にそれほど多くのことを述べる必要はないことに気付きました。私が「外部」から何かを取得しているのは、データベースやWebサービスなのです。
概要
私のコードは、私はいくつかのデータを取得する一端から配管で、このデータは、それがの終わりに達するまで、いくつかの他のデータとを形質転換または接合、フィルタリングを介してパイプに変更されますパイプ。パイプの内部では、実際にデータを変更する必要はありませんが、強力な関数と不変のデータ構造が有用な場合が多く、Clojureがこのようなコードで不思議に思うのはこのためです。
うわー、素晴らしい例。 – defhlt
私は要約が好きだった。それはClojureと3ヶ月間働いている間に私がどのように感じたかです。 –
古典的な並行性の問題「The Sleeping Barber」が良いかもしれません。ここで
例
http://www.bestinclass.dk/index.clj/2009/09/scala-vs-clojure-round-2-concurrency.html
https://github.com/bitsai/clojure-actors/blob/master/sleeping_barber.clj
私は同じ問題を抱えており、Clojureの 'Mona Lisa'問題を解決することに決めました。結果はthis presentationでした。基本的に、Clojureは「コードとしてのデータ」が優雅なソリューションを提供する問題を解決するために非常に涼しいことを示しました。たとえば遺伝的アルゴリズムの場合。
- 1. 優れたソフトウェアアーキテクチャとは何ですか?
- 2. Windowsのデフォルトよりも優れたファイルコピーは何ですか?
- 3. C#.NETの優れたブログサイトとは何ですか
- 4. .NET Webアプリケーション用の優れたファイルマネージャとは何ですか?
- 5. .NETコンソールアプリケーション用の優れたテンプレートエンジンは何ですか?
- 6. Linux用の優れたデータベースERDツールとは何ですか?
- 7. GUIウェブアプリケーション用の優れたライブラリ/ツールキットは何ですか?
- 8. 開発用の優れたメールサーバーとは何ですか?
- 9. Delphi用の優れたマルチスレッドブックとは何ですか?
- 10. Androidで最も優れたロギングメカニズムは何ですか?
- 11. Clojure: `と〜@の意味は何ですか?
- 12. Clojureメタデータの用途は何ですか?
- 13. Clojure Web Apps用の優れたWebサーバー/サーブレットコンテナ
- 14. iPhoneアプリのユーザーをオンボードするための優れたフレームワークは何ですか?
- 15. CまたはC++用の優れたMySQLライブラリは何ですか?
- 16. GAEデータストアアーキテクチャを理解するための優れたリソースは何ですか?
- 17. 要件文書をコンパイルするための優れたラテックスコンパイラは何ですか?
- 18. RESTful Webサービススキーマを開発するための優れたリソースは何ですか?
- 19. サーバーアプリケーションを構築するための優れたJavaフレームワークは何ですか?
- 20. RSpecのための優れた自動テストプラットフォームとは何ですか?
- 21. html5ウェブサイトのショーケース?
- 22. PythonでMechanizeより優れているのは何ですか?
- 23. Authlogicで使用される優れた役割認証ソリューションは何ですか?
- 24. PythonでLua string.gsubの最も優れた代替機能は何ですか?
- 25. XSL-FOより優れているものは何ですか?
- 26. Objective-Cで動作するSQliteよりも優れたORMは何ですか?
- 27. apache cordovaで動作する最も優れたビジュアルスタジオバージョンは何ですか?
- 28. Clojure 1.4ではrequireを参照するのは何ですか?
- 29. Javascriptのショーケースのウェブサイト
- 30. Clojureのフラッシュは何ですか、なぜそれが必要ですか?
どのようなセッションですか? 1時間、1日、1週間で説明できる問題と解決策をお探しですか?多くの可能性があります。 –
私たちは、新技術を展示するための全社的な定期ショーケースイベントを開催しています。それは、セッションで2時間ハンドとして意図されています。 – spa