Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Ruby

รูปแบบการออกแบบ Rails:Presenter &Service Objects

ทำไมเราต้องมีรูปแบบการออกแบบ

ปัญหาคือสถาปัตยกรรม Rails รุ่น Model-View-Controller ให้โครงสร้างพื้นฐานในการใส่โค้ดของคุณ

แต่นี่ยังไม่พอ

ความคิดเห็นของคุณเติบโตขึ้นและเต็มไปด้วยตรรกะเมื่อเป้าหมายคือการนำเสนอข้อมูล

ผู้ควบคุมของคุณมีรายละเอียดมากกว่าสิ่งที่จำเป็นสำหรับตัวควบคุมเพื่อทำงานที่จำเป็น

วิธีแก้ไขคืออะไร

เราได้สร้างวิธีแก้ปัญหาเหล่านี้ขึ้นมา 2 วิธี ในรูปแบบของการออกแบบ

  • รูปแบบพรีเซ็นเตอร์
  • รูปแบบวัตถุบริการ

ไม่ใช่ทุกคนที่เห็นด้วยว่าจะใช้งานอย่างไร แต่ฉันจะให้เวอร์ชันที่เหมาะกับฉัน

มาสำรวจรูปแบบเหล่านี้กัน!

วิธีใช้ผู้นำเสนอใน Rails

มุมมองมีไว้สำหรับการนำเสนอ ซึ่งหมายถึง HTML, CSS และ ERB (Embedded Ruby)

ไม่ควรมี ActiveRecord แบบสอบถามในมุมมอง

และตรรกะส่วนใหญ่ควรถูกละไว้ หากคุณต้องการให้ความคิดเห็นของคุณสะอาดและง่ายต่อการใช้งานมากที่สุด

โดย "ตรรกะ" ฉันหมายถึงการตัดสินใจด้วย if statement &ternary operators

คำถามตอนนี้คือ…

อย่างไร

เครื่องมือแรกของคุณในการจัดการตรรกะในมุมมองคือการใช้ตัวช่วย

ตัวช่วยนั้นยอดเยี่ยมเมื่อใดก็ตามที่คุณมีวิธีการจัดรูปแบบโดยรวมที่คุณใช้ในหลายมุมมอง

ตัวอย่างเช่น :

แสดงผล Markdown แสดงวันที่ในรูปแบบเฉพาะ ลบคำบางคำออกจากข้อความ ฯลฯ

ถูกใจสิ่งนี้ :

module DateHelper
  def date_as_month_and_year(date)
    date.strftime("%B %Y")
  end
end

คุณสามารถบันทึกรหัสนี้ไว้ใน app/helpers โฟลเดอร์ &date_helper.rb ไฟล์.

เคล็ดลับ :

ส่งผ่านอินพุตไปยังเมธอดตัวช่วยเสมอผ่านอาร์กิวเมนต์ อย่าพึ่งพาตัวแปรอินสแตนซ์

วิธีนี้จะช่วยคุณประหยัดได้มาก

วิธีการช่วยเหลือมีข้อจำกัด โดยเฉพาะอย่างยิ่งถ้าคุณใช้พวกมันสำหรับทุกการจัดรูปแบบที่ต้องการในมุมมองของคุณ

พวกเขามักจะสร้างและขาดการจัดระเบียบใด ๆ

วิธีแก้ปัญหากำลังจะมา!

แทนที่เงื่อนไขที่ซับซ้อนและวิธีการจัดรูปแบบด้วย Presenter Object

สมมติว่าคุณมีมุมมองแบบนี้:

<p>
  Post title: <%= post.title.gsub("forbidden word", "") %>

  <%= link_to "Read post", post, class: "w-75 p-3 text-#{post.draft? ? "orange" : "green"} border-#{post.draft? ? "orange" : "green"}" %>
</p>

มุมมองค่อนข้างสั้นใช่มั้ย

แต่มันรู้สึกซับซ้อนมากกับโอเปอเรเตอร์ ternary &รหัสที่ซ้ำกัน

ไม่ดี!

มาสร้างคลาสพรีเซ็นเตอร์เพื่อแก้ปัญหานี้กันเถอะ

ตามนี้ :

class PostPresenter
  def initialize(post)
    @post = post
  end

  def title_without_forbidden_words
    @post.title.gsub("forbidden word", "")
  end

  def css_color
    @post.draft? ? "orange" : "green"
  end
end

บันทึกไว้ใน app/presenters/post_presenter.rb , สร้าง presenters โฟลเดอร์ถ้าคุณยังไม่มี

ตอนนี้คุณสามารถเปลี่ยนมุมมองได้

ถูกใจสิ่งนี้ :

<% presenter = PostPresenter.new(post) %>

<p>
  Post title: <%= presenter.title_without_forbidden_words %>

  <%= link_to "Read post", post, class: "w-75 p-3 text-#{presenter.css_color} border-#{presenter.css_color}" %>
</p>

มาแล้ว!

  • เราลบตรรกะทั้งหมดออกจากมุมมอง
  • เราได้เพิ่มชื่อที่มีความหมายสำหรับการดำเนินการจัดรูปแบบและการตัดสินใจ
  • เราสามารถนำคลาสนี้มาใช้ซ้ำในมุมมองอื่นๆ ได้โดยไม่ต้องใช้โค้ดซ้ำ

นั่นคือวิธีที่คุณใช้ผู้นำเสนอใน Rails 🙂

วิธีใช้ออบเจ็กต์บริการ

ผู้ควบคุมของคุณควรบอกผู้อื่นว่าต้องทำอย่างไร พวกเขาไม่ควรมีความรู้เกี่ยวกับวิธีการส่งทวีต เรียกเก็บเงินจากลูกค้า หรือสร้างไฟล์ PDF

การดำเนินการเหล่านี้ ควรได้รับมอบหมาย ไปยังวัตถุบริการ

วัตถุบริการตามที่ฉันกำหนดคือโมดูล Ruby ซึ่งสรุปตรรกะสำหรับการดำเนินการให้เสร็จสิ้น

ตัวอย่าง :

module TwitterService
  def self.send_welcome_message(twitter_handle)
    client.update("@#{twitter_handle} welcome to 'Oranges & Apples', we hope you enjoy our juicy fruit!")
  end

  def self.client
    @client ||= Twitter::REST::Client.new do |config|
      config.consumer_key        = "..."
      config.consumer_secret     = "..."
      config.access_token        = "..."
      config.access_token_secret = "..."
    end
  end
end

ข้อตกลงคือการบันทึกสิ่งนี้ภายใต้ app/services โฟลเดอร์และไฟล์เช่น twitter_service.rb .

คุณใช้สิ่งนี้อย่างไร

เพราะ Rails โหลดอัตโนมัติทุกอย่างจาก app/ , รหัสนี้จะอยู่ในคอนโทรลเลอร์ของคุณ

ตัวอย่าง :

class UsersController
  def create
    # ...
    TwitterService.send_welcome_message(user.twitter_handle)
  end
end

นั่นคือรูปแบบออบเจ็กต์บริการที่ใช้งานจริง

สรุป

คุณได้เรียนรู้รูปแบบ Rails ที่เป็นประโยชน์ 2 รูปแบบซึ่งจะช่วยให้คุณปรับปรุงคุณภาพโค้ดของโปรเจ็กต์เมื่อใช้อย่างชาญฉลาด!

ถึงตาคุณแล้วที่จะใช้มัน 🙂

ขอบคุณสำหรับการอ่าน