1年間書いてみて発見したRubyとRuby on Railsの魅力について


ウリドキネットでエンジニアをしている安田です!
今回はフロントエンドから入ったエンジニアがウリドキネットで1年間RubyとRuby on Railsを書いていく中で発見したこの言語とフレームワークの魅力について書いていこうと思います!
railsは、私がエンジニアになるための勉強をしていたときにドットインストールをやって、その当時
「なんか便利そう」

「でも、後ろにどんな処理が走ってこういうふうにできるのかわからない」

「すぐ動くけど、出来た気になってしまう気がする」

「出来た気ではなく、きちんと学ぶべきことが他にある」

思っていました。
【改めて1年間書いて気づいたこと】
RubyとRuby on Railsには以下の魅力がある。
①「動的型付け」であるということ
自分が触ったことのある言語で静的型付けを味わった後に最初は「動的型付け」って
結局どうなの?という点を思っていた。
・その関数が何の引数をとるのか
・何を戻り値として返すのか
を意識することなく書くことっていいの?
「いい」という結論を今は持っている。
・型を気にしながら書くことが求められる静的型付け言語(例:java)
・型推論がついた言語(例:scala, haskell)
・部分的に型を明示的に指定する必要のある言語(例:Rust)
意識するポイントの違いなのではないかと思う。
②「動的ディスパッチ・動的メソッド」が使える柔軟さ
「メタプログラミングRuby」という本でボブが教えてくれたのは、Rubyという言語のもつ柔軟さの素晴らしさだった。この本を読んで、Rubyを使った開発が凄く楽しくなったのを覚えている。
最近インフルエンザが流行っているので病院への予約を例に動的ディスパッチについて書いてみる。
Hospital モデル、Human モデル、Appointment モデル を以下のように。
( 【天の声】Department モデルがないじゃないか! 今回は割愛しています。:bow:)
ruby

# 病院(
Hospital
  - id
  - name
  - department

Human
  - id
  - name
  - status

Appointment
  - department
  - patient_id
  - hospotal_id
上記の内容でやりたいのは、Google_teacherモジュールに Human の status を伝え、
教えて貰った department の Hospital に 予約を入れる事にする。(注:現実世界はこう簡単にはなってません。
ruby
# グーグル先生(まずは皆ここで症状を調べることでしょうから
module GoogleTeacher
  def list_for_my_(status)
       Hospital.where(department: status)
  end 
end

class Human
    include GoogleTeacher
    def help_me_google
        GoogleTeacher.list_for_my_(status)
    end

   def tel(to)
        to.appointment(self)
    end
end

class Hospital
   def appointment(patient)
     # 以下は動的ディスパッチの一例です!
     if send("appointable__at_#{patient.status}?")
       Appointment.new(department: patient_id: patient.id, hospotal_id: id)
     else
       return "ごめん、予約いっぱい。"
     end

     # 以下は地獄の入り口です。
     case patient.status
     when "cold" then
        appointable__at_cold?
     when "icu" then
        appointable__at_icu?
     when "injured" then
        appointable_at_injured?
     end
   end

   private
   # 以下は動的メソッドの一例です!
   define_method("appointable_at_#{status}") do
     # do something
    end
   # うわ〜〜〜〜.....!!!!
   def appointable_at_cold?
      # do something
   end

   def appointable_at_icu?
      # do something
   end
    
   def appointable_at_injured?
      # do something
   end
end

では問い合わせをしてみます。
ruby

human = Human.new(name: "nobody", status: "cold") # 風邪を引きました
hospitals = human.help_me_google # グーグル先生へ質問してみます。今回は運良く1件しかかえってきませんでした。
appointed = human.tel(hospotals.first) # 電話しました
if appointed
  p "すごい!予約がとれた!"
else
  p "残念。予約とれませんでした"
end
③Webにおけるurl設計を考えるきっかけをくれた。
Ruby on railsのレールに沿ったルーティング設計を続けていると、パラメータの考え方や、
CRUDモデルについて立ち止まって考える機会を貰えた。
Ruby on railsでの開発を知る前は有名所のAPIのドキュメントを読んだりするだけで、
「なんとなく」の状態で、今ほど向き合えてなかった。
まだまだ学ぶべきことは多いが、Railsに会えてよかったと思う点。
④熟練者の人が学習者を育ててる
どの言語コミュニティにもいえることだと思うが、熟練者が初学者をどう支援するか
という点はその言語の将来を決める。
Rubyは「よちよち.rb」や各エンジニア間でも、よく初学者に向けてのコメントやサポートが充実していると感じた。
その根底にあるのが、きっと「Rubyへの愛情」で、その楽しさを伝えるために皆が頑張っている結果がこの充実さに出ている。
これからもRubyとRailsで楽しく開発をして、世の中を今よりちょっと良くするようなサービスを作っていこう。
では、また('ω')
Happy hacking!