কেন আমাদের ডিজাইন প্যাটার্ন দরকার?
সমস্যা হল রেল আর্কিটেকচার, মডেল-ভিউ-কন্ট্রোলার, আপনাকে আপনার কোড রাখার জন্য একটি মৌলিক কাঠামো দেয়৷
কিন্তু এটি যথেষ্ট নয়।
যখন তাদের লক্ষ্য তথ্য উপস্থাপন করা হয় তখন আপনার দৃষ্টিভঙ্গি বড় এবং যুক্তিতে পরিপূর্ণ হয়।
কন্ট্রোলারের প্রয়োজনীয় কাজ করার জন্য যা প্রয়োজন তার বাইরে আপনার কন্ট্রোলারের বিবরণ থাকে।
সমাধান কি?
আমরা এই সমস্যাগুলি সমাধানের জন্য দুটি সমাধান তৈরি করেছি, ডিজাইন প্যাটার্ন আকারে৷
৷- উপস্থাপক প্যাটার্ন
- পরিষেবা অবজেক্ট প্যাটার্ন
এগুলি কীভাবে বাস্তবায়িত করা যায় সে বিষয়ে সবাই একমত নয়, তবে আমি আপনাকে আমার জন্য কাজ করে এমন সংস্করণ দেব।
আসুন এই নিদর্শনগুলি অন্বেষণ করি!
রেলে উপস্থাপক কীভাবে ব্যবহার করবেন
ভিউ হল উপস্থাপনার জন্য, মানে HTML, CSS এবং ERB (এম্বেডেড রুবি)।
কোন ActiveRecord থাকা উচিত নয় ভিউতে প্রশ্ন।
এবং অধিকাংশ যুক্তি বাদ দেওয়া উচিত আপনি যদি চান যে আপনার দৃষ্টিভঙ্গি যতটা সম্ভব পরিষ্কার এবং সহজে কাজ করার জন্য।
"যুক্তি" দ্বারা আমি ইফ স্টেটমেন্ট এবং টারনারি অপারেটর
এর সাথে সিদ্ধান্ত নেওয়ার মানে
এখন প্রশ্ন হল…
কিভাবে?
ভিউয়ে লজিক পরিচালনা করার জন্য আপনার প্রথম টুল হল সাহায্যকারী ব্যবহার করা।
সাহায্যকারীরা দুর্দান্ত যখনই আপনার কাছে একটি বিশ্বব্যাপী বিন্যাস পদ্ধতি থাকে যা আপনি বহু দর্শনে ব্যবহার করেন৷
উদাহরণস্বরূপ :
মার্কডাউন রেন্ডার করা, নির্দিষ্ট ফরম্যাটে তারিখ দেখানো, পাঠ্য থেকে নির্দিষ্ট শব্দ মুছে ফেলা ইত্যাদি।
এরকম :
module DateHelper
def date_as_month_and_year(date)
date.strftime("%B %Y")
end
end
আপনি এই কোডটি app/helpers-এর অধীনে সংরক্ষণ করতে পারেন ফোল্ডার এবং date_helper.rb ফাইল।
এখানে একটি টিপ আছে :
সর্বদা আর্গুমেন্টের মাধ্যমে সাহায্যকারী পদ্ধতিতে ইনপুট দিন, কখনই ইনস্ট্যান্স ভেরিয়েবলের উপর নির্ভর করবেন না।
এটি আপনাকে অনেক ঝামেলা থেকে বাঁচাবে।
সহায়ক পদ্ধতির সীমাবদ্ধতা আছে , বিশেষ করে যদি আপনি আপনার দৃষ্টিভঙ্গির প্রতিটি ফর্ম্যাটিং প্রয়োজনের জন্য এগুলি ব্যবহার করেন৷
৷তারা গড়ে তোলার প্রবণতা রাখে এবং কোনো ধরনের সংগঠনের অভাব থাকে।
সমাধান আসছে!
প্রেজেন্টার অবজেক্টের সাথে জটিল শর্তাবলী এবং ফর্ম্যাটিং পদ্ধতি প্রতিস্থাপন করুন
ধরা যাক আপনার কাছে এরকম একটি দৃশ্য আছে:
<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>
খুব সংক্ষিপ্ত ভিউ, তাই না?
কিন্তু এই টারনারি অপারেটর এবং ডুপ্লিকেট কোডের সাথে এটি খুব জটিল মনে হয়।
ভালো না!
আসুন এটি সমাধান করার জন্য একটি উপস্থাপক ক্লাস তৈরি করি।
এখানে কিভাবে :
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 ফাইল তৈরি করতে হয় সে সম্পর্কে তাদের কোন জ্ঞান থাকা উচিত নয়৷
এই অপারেশনগুলি অর্পণ করা উচিত৷ একটি পরিষেবা বস্তুতে৷
৷একটি সার্ভিস অবজেক্ট, যেমন আমি এটিকে সংজ্ঞায়িত করেছি, একটি রুবি মডিউল যা একটি ক্রিয়া সম্পন্ন করার জন্য যুক্তিকে এনক্যাপসুলেট করে৷
উদাহরণ :
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 এর মত একটি ফাইল .
আপনি এটি কীভাবে ব্যবহার করবেন?
কারণ রেল app/ থেকে সবকিছু অটোলোড করে , এই কোডটি আপনার কন্ট্রোলারে পাওয়া যাবে।
উদাহরণ :
class UsersController
def create
# ...
TwitterService.send_welcome_message(user.twitter_handle)
end
end
এটি কার্যে পরিষেবা বস্তুর প্যাটার্ন।
সারাংশ
আপনি দুটি সহায়ক রেল প্যাটার্ন শিখেছেন যা বুদ্ধিমানের সাথে ব্যবহার করলে আপনার প্রকল্পের কোডের মান উন্নত করতে সাহায্য করবে!
এগুলি প্রয়োগ করার এখন আপনার পালা 🙂
পড়ার জন্য ধন্যবাদ।