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