কম্পিউটার টিউটোরিয়াল

আপনার কোড থেকে রুবি জেম বানানোর ধাপে ধাপে গাইড

আপনার গিটহাব কন্ট্রিবিউশন চার্ট কি স olid গ্রে? আপনাকে একটি ওপেন সোর্স প্রজেক্টে কাজ করার দরকার। কিন্তু সেটা স্ক্র্যাচ থেকে শুরু করতে হবে না। একটি যুগ্য সাইড প্রজেক্ট তৈরি করার সবচেয়ে সহজ উপায় হলো আপনি যা বানাচ্ছেন সেখান থেকে কোড বের করে আনা। রেইলসও এভivarভাবে জন্ম었던!

কিন্তু আপনি কী বের করবেন তা কীভাবে বুঝবেন? এবং আপনার ওয়ার্কফ্লো ধ্বংস না করে সেটাকে জেমে কীভাবে পরিবর্তন করবেন?

আপনি যে কোডটি বের করতে চান সেটা খুঁজে বের করুন

আপনার অ্যাপ্লিকেশনের গভীরে কোথাও এমন কোড আছে যা সেখানে নয়। এমন কোড যাকে আপনার অ্যাপ্লিকেশনের প্রয়োজন নেই তার কাজ করার জন্য। সেটা কোথায়?

কখনো কখনো আপনাকে অনুমান করতে হবে। তবে আমি প্রায়শই একই কিছু জায়গায় বের করা যেতে পারে এমন কোড পাই:

  • ভ্যালিডেশন

    আপনি কি আপনার অ্যাট্রিবিউটের জন্য কাস্টম ভ্যালিডেশন লিখেছেন? সেগুলো দুর্দান্ত জেম হতে পারে।

  • রেইলসে আপনার করা পরিবর্তন

    কখনো কখনো কমিট হুক টেস্টে কাজ করাতে বা ব্ল্যাঙ্ক অ্যাট্রিবিউট ডাটাবেসে NULL এ রূপান্তর করাতে রেইলসের সাথে ছেড়छাড় করতে হয়। যখনই আমি এই ধরনের লজিক জেমে সরিয়েছি, সেটা আরও স্থিতিশীল ও বোঝা সহজ হয়েছে।

  • নন-অ্যাক্টিভরেকর্ড মডেল

    আপনি কি ইমেইল অ্যাড্রেস বা ফোন নম্বর পার্স করার পরিমাণে এত বেশি কাজ করেছেন যে সেটাকে আলাদা ক্লাসে সরিয়ে ফেলেছেন? এই ক্লাসগুলো ofteর অন্য অ্যাপ্লিকেশনেও কাজের হয় এবং জেমে রূপান্তর করা খুব সহজ।

  • মক অবজেক্ট ও কাস্টম অ্যাসারশন

    কাস্টম অ্যাসারশন ব্যবহার করে আপনি আরও পঠনযোগ্য টেস্ট লিখতে পারেন। এবং একবার কোনো লাইব্রেরি বা প্যাটার্নের জন্য ভালো কাস্টম অ্যাসারশন লিখলে, সে লাইব্রেরি বা প্যাটার্ন ব্যবহারকারী অন্য সবার জন্যও সেটা সহায়ক হয়।

আপনাকে বড় চিন্তা করতে হবে না। আমার পছন্দের কিছু জেম শুধু এক ফাইল!

আর যদি এখনও ডिसাইড না করতে পারেন কী বের করবেন, তবে RubyToolbox-র ক্যাটাগরি লিস্ট ব্রাউজ করে কিছু অনুপ্রেরণা নিন।

আপনার কোডকে জেম-মত ডিরেক্টরিতে রাখুন

একবার আপনি জানলেন কোন কোড জেমে বদলাবেন, তারপর সেই কোডটি ঘুরিয়ে ফেরিয়ে আপনার অ্যাপ্লিকেশনের ভিতরে জেম-মত স্ট্রাকচার দিন।

রেইলস অ্যাপ্লিকেশনে আমি lib/ ডিরেক্টরিটি একটি জেম স্টেজিং এরিয়া হিসেবে ব্যবহার করি। lib/ হলো সেটা জেমে পরিবর্তন হতে পারে এমন কোড রাখার জায়গা। তাই, যদি আপনি "json_api_client" নামে একটি জেম বানান, তবে আপনার রেইলস অ্যাপ্লিকেশনের lib/ ডিরেক্টরিটি এমন দেখাবে:

... my_rails_app/lib/json_api_client.rb my_rails_app/lib/json_api_client/associations.rb my_rails_app/lib/json_api_client/connection.rb ...

অধিকাংশ জেমে lib/ এর নিচে জেমের নাম অনুযায়ী একটি ফাইল থাকে (lib/json_api_client.rb), এবং সেই নামের একটি ডিরেক্টরির ভিতর আরও অনেক ফাইল থাকে (সब lib/json_api_client/ এর নিচে)। তাই, আপনার রেইলস অ্যাপ্লিকেশনের ভিতরে সেই স্ট্রাকচারটি মিমিক করুন। পরবর্তীতে কোড জেমে সরানো অনেক সহজ হবে।

যদি জেম লে আউট কেমন দেখায় সেটা বুঝতে সমস্যা হয়, তো আপনার পছন্দের কিছু জেমের সোর্স কোড গিটহাবে দেখুন। আপনি খুব দ্রুত প্যাটার্নটি ধরতে পারবেন।

টেস্টগুলো কী হবে?

আমি আগে lib/-এর স্ট্রাকচারটি test/unit/-এর ভিতরে ফলো করতাম:

... my_rails_app/test/unit/json_api_client_test.rb my_rails_app/test/unit/json_api_client/associations_test.rb my_rails_app/test/unit/json_api_client/connection_test.rb ...

এটা ঠিকঠাক কাজ করত, মডেল ও লাইব্রেরি একই ফোল্ডারে রাখা একটু গুলগুলি হতেও।

এখন রেইলস test/unit/ এর বদলে test/models/ ব্যবহার করে। এবং lib/ এর টেস্টগুলো test/models/-এ রাখা তर्कসঙ্গত নয়। আমি এখনো এর জন্য কোনো কনভেনশন ডিসাইড করিনি। আপনার কী সাজেশন আছে?

ডিপেন্ডেন্সি ভাঙুন

একবার আপনার কোড জেমের ভিতরে গেলে, সেটা আর আপনার অ্যাপ্লিকেশনের ওপর নির্ভর করতে পারবে না। এর মানে আপনাকে lib/-এ রাখা কোড ঘুরে দেখতে হবে, আপনার অ্যাপ্লিকেশনের স্পেসিফিক ক্লাস, অবজেক্ট, বা বিহেভিয়ারের ওপর কোথায় নির্ভরশীলতা আছে।

যদি এমন কোনো ডিপেন্ডেন্সি পান, তবে সেগুলো ভাঙতে হবে। ডিপেন্ডেন্সি কীভাবে ভাঙবেন বা ইনজেক্ট করবেন সে সম্পর্কে অনেক ভালো লেখা আছে, তাই এখানে সেটা ডিটেইলসে আলোচনা করছি না।

জেম তৈরি করুন

আমি জেম তৈরি করার জন্য bundle gem ব্যবহার করি।具體地说, bulk_cache_fetcher নামে জেম বানাতে:

bundle gem bulk_cache_fetcher -t minitest

-t অপশনটি টেস্ট হেল্পার ফাইল এবং জেমের Rakefile-এ টেস্ট টাস্ক যোগ করে।

তারপর কিছু হাউসকিপিং করতে হবে, যেমন .gemspec পূরণ করা, README লেখা, LICENSE বেছে নেওয়া, ইত্যাদি।

এবং যেহেতু আপনার জেমের কোড ইতিমধ্যে আপনার রেইলস অ্যাপ্লিকেশনের lib/ ফোল্ডারে আছে, সেটা এবং এর টেস্টগুলো আপনার নতুন জেমের lib/ এবং test/ ফোল্ডারে সরিয়ে ফেলুন।

অনেক সময় কিছু মিস হয়ে যায় বা ভুলে যায়, অথবা কোড আপনার অ্যাপ্লিকেশনের কয়েকটা ধারণা রেখে লেখা থাকে যা জেমের ভিতরে সত্য নয়। তাই, আগে বড় হওয়ার আগে, আপনার জেমে সরানো টেস্টগুলো রান করুন এবং নিশ্চিত হন সব পাস করছে।

আপনার নতুন জেম আপনার অ্যাপ্লিকেশনে ব্যবহার করুন

এখন আপনার একটি জেম আছে, আপনি সেটা ব্যবহার করতে চান, ঠিক না? কিন্তু আপনার রেইলস অ্যাপ্লিকেশনের ভিতরে জেমের পরিবর্তন টেস্ট করা খুব ইরিটেটিং। আপনাকে:

  1. জেমে পরিবর্তন করতে হবে
  2. জেম বিল্ড করতে হবে
  3. সিস্টেম থেকে জেমের সকল ট্রেস মুছে ফেলতে হবে বা ভার্সন আপডেট করতে হবে
  4. জেম ইনস্টল করতে হবে
  5. সার্ভার রিস্টার্ট করতে হবে

এটা খুব কষ্টদায়ক। خوشখবর হলো বান্ডলার (bundler) একটি সহজ পথ দিয়েছে। মনে করুন আপনি আপনার জেম ~/Source/bulk_cache_fetcher-এ বানিয়েছেন। জেমের পরিবর্তন টেস্ট করার সময়, আপনার রেইলস অ্যাপ্লিকেশনের Gemfile-এ এভাবে লিখুন:

Gemfile
gem "bulk_cache_fetcher", path: "~/Source/bulk_cache_fetcher"

তারপর bundle install রান করুন, এবং আপনি আপনার জেমে পরিবর্তন করতে পারবেন যেন সেটা এখনও আপনার অ্যাপ্লিকেশনের lib/ ফোল্ডারে থাকে।

একটা জরুরি কথা: কোড চেক-ইন করার আগে path: হটাতে ভুলবেন না! সেই পাথ অন্য সিস্টেমে সঠিক লোকেশনে পয়েন্ট করে না, তাই আপনার মেশিন ছাড়া কहीও কাজ করবে না।

বিল্ড করুন, শিপ করুন, এবং উপভোগ করুন!

জেমটি প্রস্তুত হলে, সেটাকে বিশ্বে ছড়িয়ে দিন।

রুবি জেমসে একাউন্ট খুলুন (যদি না থাকে), আপনার পরিবর্তনগুলো কমিট করুন, এবং rake release রান করুন। অভিনন্দন, আপনি এখন একটি জেম লেখক! এবং একবার সেই জেমটি গিটহাবে পুশ করলে, আপনি আজকের জন্য আপনার সুন্দর সবুজ স্কোয়ার পেয়ে যাবেন।

আপনার নিজের অ্যাপ্লিকেশনের কোনো পার্ট আছে যা বের করা যেতে পারে? যেটা আপনি মনে করেন ভালো জেম হতে পারে? কমেন্টে জানান, আমি শুনতে চাই।

এবং যদি আপনি রুবি জেম তৈরি, ম্যানেজ, এবং মেইনটেইন করার বিষয়ে অনেক বেশি শিখতে চান, ব্র্যান্ডন হিলকার্টের "Build a Ruby Gem" বইটি আমি অত্যধিক রিকমেন্ড করছি। তার বইতে যে প্রসেসটি ফলো করা হয়েছে সেটা এই প্রসেসের খুব কাছাকাছি, এবং আরও অনেক কিছু কভার করে।

  1. রুবিতে VCR মাস্টার করুন: টেস্ট পারফরম্যান্স ও নির্ভরযোগ্যতা বাড়ান

  2. রুবি কোড উন্নত করুন: ক্লিনার OOP ডিজাইনের জন্য Cohesion & Coupling আয়ত্ত করুন

  3. রুবিতে ফাংশনাল প্রোগ্রামিং আয়ত্ত করুন: একটি সম্পূর্ণ গাইড

  4. রুবিতে স্ট্যাটিক অ্যানালাইসিস মাস্টার করুন: Parser Gem দিয়ে মেথড ও প্যারামিটার এক্সট্রাক্ট করুন