ทำไมเราต้องมีรูปแบบการออกแบบ
ปัญหาคือสถาปัตยกรรม 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 รูปแบบซึ่งจะช่วยให้คุณปรับปรุงคุณภาพโค้ดของโปรเจ็กต์เมื่อใช้อย่างชาญฉลาด!
ถึงตาคุณแล้วที่จะใช้มัน 🙂
ขอบคุณสำหรับการอ่าน