window.pipedriveLeadboosterConfig={です。 ベース:'leadbooster-chat.pipedrive.com'、 companyId:11580370, playbookUuid: '22236db1-6d50-40c4-b48f-8b11262155be', version: 2、 } ;(function () { var w = window もし (w.LeadBooster) {なら console.warn('LeadBooster already exists') } else { w.LeadBooster = { {. q: [], on: function (n, h) { this.q.push({ t: 'o', n: n, h: h }) }, trigger: 関数 (n) { { this.q.push({ t: 'o', n: n, h: h }) this.q.push({ t: 't', n: n }) }, } } })() Ruby ドメイン固有言語 - The Codest
The Codest
  • 会社概要
  • サービス
    • ソフトウェア開発
      • フロントエンド開発
      • バックエンド開発
    • Staff Augmentation
      • フロントエンド開発者
      • バックエンド開発者
      • データエンジニア
      • クラウドエンジニア
      • QAエンジニア
      • その他
    • アドバイザリー
      • 監査&コンサルティング
  • 産業
    • フィンテック&バンキング
    • E-commerce
    • アドテック
    • ヘルステック
    • 製造業
    • 物流
    • 自動車
    • アイオーティー
  • 価値
    • CEO
    • CTO
    • デリバリー・マネージャー
  • チーム
  • Case Studies
  • ノウハウ
    • ブログ
    • ミートアップ
    • ウェビナー
    • リソース
採用情報 連絡先
  • 会社概要
  • サービス
    • ソフトウェア開発
      • フロントエンド開発
      • バックエンド開発
    • Staff Augmentation
      • フロントエンド開発者
      • バックエンド開発者
      • データエンジニア
      • クラウドエンジニア
      • QAエンジニア
      • その他
    • アドバイザリー
      • 監査&コンサルティング
  • 価値
    • CEO
    • CTO
    • デリバリー・マネージャー
  • チーム
  • Case Studies
  • ノウハウ
    • ブログ
    • ミートアップ
    • ウェビナー
    • リソース
採用情報 連絡先
戻る矢印 戻る
2018-12-14
ソフトウェア開発

ルビー特定領域言語

バルトロマイェイ・マジアーズ

定義を参照すると、DSL(Domain Specific Language)は特定のアプリケーション・ドメインに特化したコンピュータ言語である。つまり、特定のニーズを満たすために開発される。

この記事を読むことで、DSLとは何か、Rubyとの共通点を知ることができるだろう。

DSL、ようこそ!

定義を参照すると、DSL(Domain Specific Language)は特定のアプリケーション・ドメインに特化したコンピュータ言語である。つまり、特定のニーズを満たすために開発される。DSLには2つのタイプがある:

  • アン 外部 独自の構文解析器を必要とするDSL。よく知られている例としては、SQL言語がある。

  • アン 内部 DSLはそれ自体独自の構文を持たず、与えられたプログラミング言語の構文を使う。

お察しの通り、ここでは2番目のDSLタイプに焦点を絞る。

何をするのですか?

基本的に、Rubyのメタプログラミングを利用することで、独自のミニ言語を作成することができます。メタプログラミングは、Rubyのプログラミング技法のひとつで コード を実行時に動的に(オンザフライで)使用することができます。皆さんはこのことに気づいていないかもしれませんが、おそらく毎日いろいろな DSL を使っていることでしょう。DSLで何ができるかを理解するために、以下のいくつかの例を見てみましょう。これらはすべて、ある共通の要素を持っていますが、あなたはそれを指し示すことができますか?

Railsルーティング

Rails.application.routes.draw do
ルートを'home#index'

リソース :users do
get :search, on:コレクション
終了
終了
```

Railsを使ったことがある人なら誰でも知っている。 config/routes.rb ファイルでアプリケーションのルート(HTTP動詞やURLとコントローラのアクションの対応付け)を定義します。しかし、どのように動作するのか不思議に思ったことはないだろうか?実は、これは単なるRubyのコードなのです。

工場用ボット

 FactoryBot.define do
   factory :user do
     会社
     シーケンス(:email) { |i| "user_#{i}@test.com"}
     sequence(:first_name) { |i| "ユーザー#{i}"}
     last_name 'テスト'
     役割 'manager'
   終了
 終了

テストを書くには、しばしばオブジェクトを作る必要がある。したがって、時間の浪費を避けるためには、できるだけプロセスを単純化するのが得策だ。それが ファクトリーボット 覚えやすいキーワードとオブジェクトの説明方法。

シナトラ

require 'sinatra/base'

クラス WebApplication < Sinatra::Base
get '/' do
'ハローワールド'
エンド
終了
```

シナトラ は、ゼロからウェブ・アプリケーションを作成できるフレームワークだ。リクエスト・メソッド、パス、レスポンスを定義するのはもっと簡単だろうか?

DSLの他の例としては、次のようなものがある。 レーキ, アールエスペック または アクティブレコード.各DSLの重要な要素は ブロックの使い方.

建築時間

ボンネットの下に何が隠れているのか、実装はどのように見えるのかを理解する時が来た。

異なる商品に関するデータを保存するアプリケーションがあるとします。私たちは、ユーザー定義のファイルからデータをインポートする可能性を与えることによって、それを拡張したいと考えています。また、必要に応じて、そのファイルから動的に値を計算できるようにしたい。これを実現するために、DSLを作成することにします。

シンプル 製品 表現は以下の属性を持つことができる (product.rb):

 クラス Product
   attr_accessor :名前, :説明, :価格
 終了

実際のデータベースを使用する代わりに、その作業をシミュレートするだけです (fake_products_database.rb):

 クラス FakeProductsDatabase
   def self.store(商品)
     puts [商品.名, 商品.説明, 商品.価格].join(' - ')
   終了
 エンド

では、商品データ (dsl/data_importer.rb):

モジュール Dsl
クラス DataImporter
モジュール構文
def add_product(&block)
FakeProductsDatabase.store product(&block)
終了

  プライベート

  def product(&block)
    ProductBuilder.new.tap { |b| b.instance_eval(&block) }.product
  終了
終了

include 構文

def self.import_data(file_path)
  new.instance_eval File.read(file_path)
終了

終了
終了
```

このクラスには インポートデータ これは引数としてファイル・パスを指定する。ファイルが読み込まれ、その結果が instance_eval メソッドが呼び出される。このメソッドは何をするのか?インスタンス・コンテキスト内で文字列をRubyコードとして評価します。つまり 自己 のインスタンスとなる。 データインポーター クラスを定義することができます。そのおかげで、希望する構文やキーワードを定義することができます(読みやすくするために、構文はモジュールとして定義されています)。そのため 商品追加 メソッドが呼び出されると、メソッドに与えられたブロックは次のように評価される。 プロダクトビルダー インスタンスを構築する。 製品 インスタンスだ。 プロダクトビルダー クラスについては後述する(dsl/product_builder.rb):

モジュール Dsl
クラス ProductBuilder
ATTRIBUTES = %i[名前 説明 価格].フリーズ

attr_reader :製品

def 初期化
  商品 = Product.new
終了

ATTRIBUTES.eachは|attribute|を行う。
  define_method(attribute) do |arg = nil, &block|.
    値 = block.is_a?(Proc) ? block.call : arg
    product.public_send("#{attribute}=", value)
  終了
終了

終了
終了
```

このクラスは 商品追加 ブロックを作成した。ちょっとしたメタプログラミングで、商品属性に値を割り当てるメソッドが追加されます。これらのメソッドは、値を直接渡す代わりにブロックを渡すこともサポートしているので、実行時に値を計算することができる。アトリビュート・リーダーを使うことで、最後にビルドされた製品を得ることができる。

では、インポートスクリプト(import_job.rb):

relative 'dsl/dataimporter' を必要とします。
relative 'dsl/productbuilder' を必要とします。
relative 'fakeproductsdatabase' を必要とします。
relative 'product' を必要とします。

Dsl::DataImporter.import_data(ARGV[0])
```

最後に - DSLを使用して - 商品データのファイル(dataset.rb)を作成します:

``ruby
add_product do
name '充電器'
説明 'ライフセービング'
価格 19.99
終了

add_product do
name '車の事故'
description { "#{Time.now.strftime('%F %T')}で大破"}
価格 0.01
終了

add_product do
name 'ロックピック'
説明 'ドアは閉まってはならない'
価格 7.50
終了
```

データをインポートするには、1つのコマンドを実行するだけでいい:

 ruby import_job.rb dataset.rb

そして結果は...。

 充電器 - 人命救助 - 19.99
 車の大破 - 2018-12-09 09:47:42に大破 - 0.01
 ロックピック - ドアが閉まらない - 7.5

成功だ!

結論

上記のすべての例を見て、DSLが提供する可能性に気づくのは難しくない。DSLは、必要なロジックをすべて隠蔽し、最も重要なキーワードだけを ユーザに公開することで、ルーチンワークを単純化することができます。DSLは、より高い抽象化レベルを得ることを可能にし、柔軟な使用の可能性を提供します(再利用性の面で特に価値があります)。一方、DSLをあなたの プロジェクト メタプログラミングを使った実装は、理解するのも保守するのもかなり難しい。さらに、そのダイナミズムのために、しっかりとしたテストスイートが必要です。DSLを文書化することは、DSLをより簡単に理解することにつながるので、 間違いなくやる価値があります。独自のDSLを実装することはやりがいのあることですが、必ず報われなければならないことを忘れないでください。

この話題に興味を持ちましたか?もしご興味がおありでしたら、私たちにお知らせください。私たちが最近、あるプロジェクトの要件を満たすために作成したDSLについてお話します。

関連記事

ソフトウェア開発

将来を見据えたウェブ・アプリケーションの構築:The Codestのエキスパート・チームによる洞察

The Codestが、最先端技術を駆使してスケーラブルでインタラクティブなウェブアプリケーションを作成し、あらゆるプラットフォームでシームレスなユーザー体験を提供することにどのように秀でているかをご覧ください。The Codestの専門知識がどのようにデジタルトランスフォーメーションとビジネス...

ザ・コデスト
ソフトウェア開発

ラトビアを拠点とするソフトウェア開発企業トップ10社

ラトビアのトップソフトウェア開発企業とその革新的なソリューションについて、最新記事でご紹介します。ラトビアの技術リーダーたちがあなたのビジネスをどのように向上させるかをご覧ください。

thecodest
エンタープライズ&スケールアップ・ソリューション

Javaソフトウェア開発の要点:アウトソーシングを成功させるためのガイド

outsourcingのJavaソフトウェア開発を成功させるために不可欠なこのガイドを読んで、The Codestで効率性を高め、専門知識にアクセスし、プロジェクトを成功に導きましょう。

thecodest
ソフトウェア開発

ポーランドにおけるアウトソーシングの究極ガイド

ポーランドのoutsourcingの急増は、経済、教育、技術の進歩がITの成長とビジネス・フレンドリーな環境を促進していることによる。

ザ・コデスト
エンタープライズ&スケールアップ・ソリューション

IT監査ツール&テクニック完全ガイド

IT監査は、安全かつ効率的で、コンプライアンスに準拠したシステムを保証します。その重要性については、記事全文をお読みください。

The Codest
ヤクブ・ヤクボヴィッチ CTO & 共同創設者

ナレッジベースを購読して、IT部門の専門知識を常に最新の状態に保ちましょう。

    会社概要

    The Codest - ポーランドに技術拠点を持つ国際的なソフトウェア開発会社。

    イギリス - 本社

    • オフィス 303B, 182-184 High Street North E6 2JA
      イギリス、ロンドン

    ポーランド - ローカル・テック・ハブ

    • ファブリチュナ・オフィスパーク、アレハ
      ポコジュ18、31-564クラクフ
    • ブレイン・エンバシー, コンストルクトースカ
      11, 02-673 Warsaw, Poland

      The Codest

    • ホーム
    • 会社概要
    • サービス
    • Case Studies
    • ノウハウ
    • 採用情報
    • 辞書

      サービス

    • アドバイザリー
    • ソフトウェア開発
    • バックエンド開発
    • フロントエンド開発
    • Staff Augmentation
    • バックエンド開発者
    • クラウドエンジニア
    • データエンジニア
    • その他
    • QAエンジニア

      リソース

    • 外部ソフトウェア開発パートナーとの協力に関する事実と神話
    • 米国から欧州へ:アメリカの新興企業がヨーロッパへの移転を決断する理由
    • テックオフショア開発ハブの比較:テックオフショア ヨーロッパ(ポーランド)、ASEAN(フィリピン)、ユーラシア(トルコ)
    • CTOとCIOの課題は?
    • The Codest
    • The Codest
    • The Codest
    • Privacy policy
    • ウェブサイト利用規約

    著作権 © 2025 by The Codest。無断複写・転載を禁じます。

    jaJapanese
    en_USEnglish de_DEGerman sv_SESwedish da_DKDanish nb_NONorwegian fiFinnish fr_FRFrench pl_PLPolish arArabic it_ITItalian ko_KRKorean es_ESSpanish nl_NLDutch etEstonian elGreek jaJapanese