Clojure programming:frameworks and other tools

これらのlibはすべてClojureプログラミングタスクを簡素化することを目的としていますが、初心者を混乱させる可能性があります。 時には、それらをすべてまとめて特定のタスクに最適な解を見つける方法を理解するのが難しい場合があります。 だから、今私はあなたにClojureでプログラミングするための私のお気に入りのツールをお見せしたいと思います。

  • webサーバーとエンドポイントの操作
  • webサーバーとデータベースとの対話
  • サーバー上のルーティング
  • ClojureプログラミングでGraphQLを使用
  • モジュラーアーキテクチャのサポート

Clojureプログラミングの世界への旅を始めましょう!

注:Javaやその他の同様の言語から移行する場合、Clojureには伝統的なフレームワークがないことを知っておく必要があります。 すべてはlibsとそのコレクションに基づいています。 これにより、言語はより柔軟で多目的になります。

Clojure ecosystemには、さまざまな複雑さのlibが含まれています。 それらのうちのいくつかは、追加の関数のセット(例えば、時間を扱うためのライブラリ)にすぎません。 一方、システムlibsはフレームワーク全体を作成するためのプラットフォームを提供します。 このようなライブラリを使用すると、プログラマはアプリケーションをコンポーネントのセットとして提示したり、それらの間の接続を記述したりすることができます。 ライブラリ自体は、依存関係グラフの作成を保証します。 たとえば、コンポーネントを関数のようなより理解しやすいものに変換することができます。

: webサーバーとエンドポイントでの便利な作業

コード: https://github.com/ring-clojure/ring

HTTPサーバーの抽象化は、Clojure web stackの重要な要素です。 これにより、webサーバーとエンドポイントでの簡単な作業が可能になり、アプリ開発を成功させるために不可欠です。 WSGI(Python)やRack(Ruby)と同様に作成されたRingは、HTTPの情報を明確で統一されたAPIに抽象化します。 その結果、web開発者はコンポーネントで構成されたモジュラーシステムを構築し、これらのコンポーネントを様々なサーバーやアプ

リングはどのように機能しますか?

HTTP要求を取得し、HTTP応答を返します。 だから、Ringはいわゆるwebアプリケーションフレームワークではありません。

Ring

をClojureプログラミングの支配的なwebライブラリとして使用する理由は、Ringは初心者にとっては素晴らしい選択です。 まず第一に、その主な機能は、webサーバーの広い範囲のための便利なインターフェイスを提供することです。 この観点から、この技術は非常に有用であり、完全に機能します。

別のリング機能は、モジュールのセット(’ミドルウェア’)を提供しています。 だから、それはあなたがお互いに互換性のある異なる事前に書かれたライブラリを使用することができます。

Clojureプログラマのほとんどは、ミドルウェアを使用する能力のためにエンドポイント用のリングを選択します。 たとえば、これらのモジュールでは、必要なパラメータをURLからClojureコードマップに変換できます。 Web開発者は、新しいミドルウェアを簡単に作成し、エコシステムに統合できます。 たとえば、cemerick/friendライブラリを使用すると、認証プロセスを完全に管理したり、さまざまな戦略(ログインとパスワードから始まり、oAuthで終わる)を適用したり Ring middlewareは、プロセスを簡単に記述して開始するのに役立ちます。 許可されていないユーザーが禁止されているすべてのエンドポイントを閉じます。

Ringを使用した経験は、他のClojure技術を使用するために重要です。 それはあなたがアプリを移動させるために使用できる最初のものです。Http-kit

目的:サーバー起動

コード: https://github.com/http-kit/http-kit

イベント駆動型の非常に効果的なHTTPサーバー/クライアントライブラリには、WebSocketと非同期サポートが含まれています。

Http-kitはどのように機能しますか?

これは、適切なwebサーバーの相互作用を整理するためのライブラリです。 Http-kitは非常に同時非同期か同期適用のために適している。 WebSocketとHTTP long polling/streamingに関しては、統一されたAPIを備えている方が良いでしょう。

Http-kitを使用する理由

柔軟なソリューション

Http-kitは、同期システムと非同期システムの両方で作業する機会を提供します。 最初のオプションは簡単ですが、2番目のオプションはより速く動作します。 だから、あなたはあなたの特定の目的に基づいて選択をすることができます。 また、Ringでライブラリを使用することもできます。 それはほとんどJettyアダプタのように動作します。

便利な使い方

このライブラリは、Websocketのサポートと、長期間保持されているHTTPリクエストの完全な処理を保証します。 そのため、リアルタイムアプリの作成が簡単になります。 さらに、それはオープンソースのプロジェクトです。 このライブラリは、Apache Licenseバージョン2.0の下でGitHubで利用可能です。

優れた結果

HTTP-kitは高いパフォーマンスを示し、大きな負荷にもかかわらず高速に動作します。 同時に、各接続に必要なメモリは数kBのみです。 ゼロから書かれたクライアント/サーバーは、0つの依存関係と〜3k行の明確なコードを持つ単一の〜90KBのJARファイルとして利用できます。

多くのソフトウェア開発者は、Http-kitをClojureプログラミングのための基本的なツールと考えています。

CompojureとBidi

目的:サーバー上のルーティング

コード: https://github.com/juxt/bidi, https://github.com/weavejester/compojure

CompojureとBidiはどちらも、webアプリでルーティングするための技術です。 最初のライブラリはコミュニティの間で非常に人気があり、2番目のライブラリはClojureScriptで書くための便利なソリューションとして知られています。

CompojureとBidiはどのように機能しますか?

これらの小さなライブラリは、webサーバー上のルーティングを保証します。 その結果、ソフトウェア開発者は、いくつかの別々の部分で構成されるアプリケーションを書くことができます。

それらの違いは何ですか?

2つのライブラリは同じ機能を実行します。 しかし、Compojureとは異なり、Bidi:

  • cljとcljsの両方をサポートしています
  • は同型で拡張可能です

主な違いは、Bidiルートではデータ構造であることです。 ここにはマクロはありません。 したがって、ライブラリは便利な双方向アプローチと他の利点を提供します。 Web開発者の中には、特定のハンドラーの各ルートを表示するため、Bidiを好む人もいます。 さらに、設定ファイルからルートを読み取り、関数とイントロスペクトによってそれらを生成して変換する機会があります。 これらは、処理された要求とは独立して動作します。 したがって、開発者は必ずしもハンドラーではないもの(キーワードなど)を一致させることができます。Lacinia

目的:ClojureプログラミングにおけるGraphQLの実装

コード: https://github.com/walmartlabs/lacinia

この人気のあるClojureライブラリは、web Apiを操作しながらGraphQLを実装したい人に便利です。

ラシニアはどのように機能しますか?

もともと、GraphqlはJavaScriptで書かれています。 Laciniaは、この実装への公式の参照です。 これは、初期仕様と同様に書かれています。 これは、バックエンドに依存しないGraphQLクエリ実行エンジンと呼ぶことができます。 そのため、ライブラリはデータとGraphQLクライアントとの間の連絡先を提供します。

Laciniaを使用する理由

GraphQLを使用すると、より豊かで複雑なWeb APIを簡単に取得できます。 Laciniaは、インライン/名前付きクエリフラグメント、GraphQLスキーマのイントロスペクション、サブスクリプション、インターフェイス、共用体、列挙型、入力、カスタムスカラをサポートするため、API開発を簡素化します。

EDNベースのスキーマ言語で書かれたこのライブラリは、GraphQLクエリで完全に動作します。 それはAntlr4上に構築されています。 Laciniaは、効率的な非同期クエリ実行を豊かにするのに役立ちます。 任意のClojure HTTPパイプラインにプラグインし、HTTPサポートのためのコンパニオンライブラリlacinia-pedestalを使用できます。

HoneySQLとHugSQL

目的:データベースの相互作用が成功しました

コード: https://github.com/jkk/honeysql, https://github.com/layerware/hugsql

多くのwebプログラマは、Oracle、MS SQL、MySQL、PostgreSQL、SQLiteなどのSQL技術での作業をより快適に感じています。 HoneySQLとHugSQLは、ClojureアプリケーションのSQLデータベースへの安定したアクセスを提供するクエリビルダです。

HoneySQLとHugSQLはどのように機能しますか?

どちらのライブラリもClojureプログラミングにSQLを採用しています。 そのため、Clojure web appsでもSQLデータベースコマンドを記述できます。

それらの違いは何ですか?

HugSQLを使用して、別々のSQLファイルを記述し、アプリケーションにそれらを置くことから始めます。 クエリコンストラクタは、別の一般的なライブラリ、YeSQLに触発されています。 SQLファイルをClojure関数に解析するだけでなく、YeSQLよりも多くのユースケースにも適しています。 HugSQLは積極的に維持されています。 これは、複数のデータベースlibsをサポートするプロトコルベースのアダプタを持っています。

HugSQLには2つの基本的な特徴があるため、いくつかの利点があります:

  • クエリは直接書き込まれ、必要な関数ごとに一つのクエリが書き込まれます。
  • クエリはSQLで書かれています。

HugSQL pros

Hugsqlは、Clojure構文とSQLセマンティクス(何とどのように)の分離を提供します。

  1. Clojureで何をすべきかを説明します

(get-user-emails-by-username”Alexandr Petrov”) ;->

  1. SQLでこれを行う方法について説明します

— :名前get-user-emails-by-username:? :*

user_emailsを選択します。user_emailsどこuser_emailsからの電子メール。user_id=:id

その結果、Clojureコードを書き直すことなく、SQLで直接データを取得するロジックを変更できます。 これは、データベーススキーマが変更され、古いクエリが必要な構造を返さない場合に便利です。

さらに、SQL自体は、特定のDBMSを操作するためのはるかに強力なツールです。 これは、Clojureでは非常に困難な”結合”、集計、およびウィンドウ関数を使用して大規模な複雑なクエリを書くことができます。

さらに、SQLでは特定のDBMS(Postgresなど)の利点を使用することができます。 データベースが変更されないことが確実な場合は重要です。HugSQL cons

  • プロジェクトの途中でDBMSを変更するのは難しいです。 多くの要求をチェックし、構文サポートと特定の出力を慎重にテストする必要があります。
  • SQLクエリにパラメータを渡すことができます。 ただし、場合によっては、クエリの一部を特定の条件に依存する必要があります。 HugSQLスニペットではこのタスクを完了できますが、より多くの場合、Clojureを使用してこれを行う必要があります。

HoneySQLは、SQLとClojureコードの分離を提供していません。 クエリはマップとして表示されます。

HoneySQL pros

  • これは、通常、直接SQLクエリを回避するため、DBMSの特定の実装とは独立しています。 それらの代わりに、特定のDSLを使用します。
  • Clojure関数/マクロに基づいて独自のDSLを維持することができます。 また、Clojure側で中間要求を保存してクエリビルダを作成することもできます。 たとえば、IDまたはその他の複雑なロジックでユーザーを定義する必要がある場合は、HoneySQL構造の一部を保存できます。 商品やその他のデータではなく、ユーザーが正確に必要であることが示されます。 この”断片”は、必要なクエリに置き換えることができます。 その結果、より短いコードが得られます。

HoneySQL cons

  • 特定のDBMSの利点を使用したり、複雑なクエリ(ウィンドウ関数など)を記述したりすることは困難な場合があります
  • Clojureプログラマは、データを取得するためのコードとこのデータを処理するためのコードを分離する必要があります。 この分離により、リファクタリングの追加作業が行われます。

danielsz/system

目的:モジュラーアーキテクチャのサポート

コード: https://github.com/danielsz/system

Clojureで高度にモジュール化されたアプリケーションを開発するための有用な技術。 このフレームワークは、モジュール間の効果的な相互作用をサポートし、様々なClojureエコシステムの他の部分との良好な互換性を持

danielsz/systemはどのように機能しますか?

このライブラリは、webプログラマがコンポーネントベースのアプローチを使用することを可能にします。 そのため、モジュール/コンポーネントとそれらの間の接続を使用してアプリケーションを構築できます。 各コンポーネントは特別なオブジェクトです。 それはそれ自身のライフサイクルを持っています。 プログラマは、どのように起動するのか、何を起動する必要があるのか、どのように停止するのかを説明します。

たとえば、アプリケーションはwebサーバーとデータベースで構成されています。 データベースがアクティブ化される前にwebサーバーを起動するのは意味がありません。 データベースコンポーネント、サーバーコンポーネント、およびサーバーのデータベースへの依存関係について説明します。 プロジェクトを起動するときに、webサーバーを起動する必要があることを示します。 ライブラリは自動的にデータベースをアクティブ化しようとします。 その後、可能であれば、サーバーを起動し、終了したアクティブ化されたデータベースコンポーネントをwebサーバーコンポーネ その後、必要に応じてシステムが停止されます。

danielsz/systemを使用する理由

通常のClojure関数のセットを持つアプリケーション全体の説明とは異なり、コンポーネントとしてのプロジェクトの説明は、あるコンポーネ たとえば、アプリケーションをテストしたり、あるデータベースを別のデータベースに置き換えたり、完全にオフにしたり、現在のデータに置き換えたりします。

関数の場合、古い関数を新しい関数で変更します。 彼らはしばしばバグを引き起こす同じ名前を持つことになります。 danielsz/systemは、コンポーネントのセットとして編成された既製のソリューション(webサーバー、データベースなど)のセットです。

Clojureの使い方と、プロジェクトに実装すべき技術ソリューションをよりよく理解していただければ幸いです。 私のさらなる記事には、この強力で美しい言語の利点と、webアプリケーション、サービス、およびApiの開発に関するいくつかのヒントが含まれています。 Clojure programming worldについてもっと知りたい場合は、FreshCodeブログを購読してください。

コメントを残す

メールアドレスが公開されることはありません。