ruby on rails - OO ডিজাইন Rails: স্টাফ করা যেখানে




ruby-on-rails directory-structure (3)

আমি সত্যিই রেলের উপভোগ করছি (যদিও আমি সাধারণত অস্থির), এবং রুবি খুব বেশি উপভোগ করি। তবুও, বিশাল ActiveRecord উপশ্রেণী এবং বিশাল কন্ট্রোলারগুলি তৈরি করার প্রবণতাটি বেশ স্বাভাবিক (এমনকি যদি আপনি সংস্থান প্রতি নিয়ামক ব্যবহার করেন তবেও)। যদি আপনি গভীর বস্তু জগত সৃষ্টি করতে থাকেন, আপনি কোথায় শ্রেণীগুলি (এবং মডিউল, আমি মনে করি) রাখব? আমি মতামত সম্পর্কে জিজ্ঞাসা করছি (হেল্পার্স নিজেদের মধ্যে?), কন্ট্রোলার এবং মডেল।

লিব ঠিক আছে, এবং আমি এটি একটি dev পরিবেশে পুনরায় লোড করার জন্য কিছু সমাধান খুঁজে পেয়েছি, তবে আমি এই জিনিসটি করার আরও ভাল উপায় আছে কিনা তা জানতে চাই। আমি সত্যিই খুব বড় ক্রমবর্ধমান ক্লাস সম্পর্কে উদ্বিগ্ন। এছাড়াও, ইঞ্জিন এবং কীভাবে তারা ফিট করে?


... বিশাল ActiveRecord উপশ্রেণী এবং বিশাল কন্ট্রোলার করতে প্রবণতা বেশ প্রাকৃতিক ...

"বিশাল" একটি উদ্বেগজনক শব্দ ... ;-)

কিভাবে আপনার কন্ট্রোলার বিশাল হয়ে উঠছে? যে আপনি তাকান উচিত কিছু: আদর্শভাবে, নিয়ামক পাতলা হতে হবে। পাতলা বায়ু থেকে একটি নিয়ম-কানুন নির্বাচন করা, আমি আপনাকে পরামর্শ দিচ্ছি যে প্রতি নিয়ামক পদ্ধতি (ক্রিয়া) কোডের 5 বা 6 টি লাইন নিয়মিত থাকলে তারপরে আপনার কন্ট্রোলার সম্ভবত খুব মোটা। একটি সহায়ক ফাংশন বা একটি ফিল্টার মধ্যে সরানো হতে পারে যে সদৃশ আছে? মডেলের মধ্যে নিচে push করা হতে পারে যে ব্যবসায়িক যুক্তি আছে?

আপনার মডেল বিশাল হতে কিভাবে? আপনি প্রতিটি ক্লাসে দায়িত্ব সংখ্যা কমাতে উপায় খুঁজছেন? আপনি mixins মধ্যে নিষ্কাশন করতে পারেন যে কোন সাধারণ আচরণ আছে? অথবা কার্যকারিতা এলাকায় আপনি সাহায্যকারী ক্লাস delegate করতে পারেন?

সম্পাদনা করুন: একটি বিট প্রসারিত করার চেষ্টা করছে, আশা করি খুব খারাপ কিছু বিকৃত করা হচ্ছে না ...

হেল্পার্স: app/helpers হেল্পারগুলিতে বাস করে এবং বেশিরভাগ মতামত সহজতর করতে ব্যবহার করা হয়। তারা হয় নিয়ামক নির্দিষ্ট (যে নিয়ামক জন্য সমস্ত মতামত উপলব্ধ) অথবা সাধারণত উপলব্ধ (application_helper.rb module ApplicationHelper )।

ফিল্টারগুলি: বলুন আপনার একই ক্রিয়া কোডটি বেশ কয়েকটি ক্রিয়া রয়েছে (বেশিরভাগ ক্ষেত্রে, params[:id] ব্যবহার করে একটি বস্তুর পুনরুদ্ধার params[:id] বা অনুরূপ)। যে অনুলিপি প্রথম আলাদা পদ্ধতিতে বিন্যস্ত করা যেতে পারে এবং তারপরে ক্রিয়া সংজ্ঞাতে ফিল্টারটি ঘোষণা করে সম্পূর্ণরূপে কর্মগুলির বাইরে, যেমন before_filter :get_objectঅ্যাকশন কন্ট্রোলার রেলস গাইডে ধারা 6 দেখুন ঘোষণাকারী প্রোগ্রামিং আপনার বন্ধু হতে দিন।

Refactoring মডেল একটি ধর্মীয় জিনিস একটি বিট আরো। আঙ্কেল বব এর শিষ্যরা যেমন, উদাহরণস্বরূপ, আপনি SOLID- এর পাঁচটি আদেশ অনুসরণ করবেন তা সুপারিশ করবে। জোয়েল ও জেফ আরও কিছু বলতে পারেন , "প্রগমেটিক" পদ্ধতিতে, যদিও পরবর্তীতে তারা আরও সামঞ্জস্যপূর্ণ বলে মনে হয়। একটি শ্রেণির মধ্যে এক বা একাধিক পদ্ধতি সন্ধান করা যা তার গুণাবলীগুলির একটি স্পষ্টভাবে-সংজ্ঞায়িত উপসেটে কাজ করে এমন একটি শ্রেণী যা আপনার ActiveRecord-derived মডেল থেকে পুনরায় প্রতিক্রিয়াশীল হতে পারে তা চিহ্নিত করার এক উপায়।

Rails মডেলগুলি ActiveRecord :: Base এর উপশ্রেণীগুলি হতে হবে না। অথবা এটি অন্য কোন উপায়ে করা, একটি মডেল একটি টেবিলের একটি analogue হতে হবে না, বা এমনকি সঞ্চিত কিছু সম্পর্কিত। এমনকি ভাল, যতক্ষণ আপনি আপনার ফাইলটিকে app/models রেলগুলির কনভেনশন অনুসারে উল্লেখ করেন (ক্লাসের নাম # রাডার্স নাম্বার কল করুন যা রেলগুলি দেখতে পাবে তা খুঁজে বের করতে), রেলগুলি require ছাড়াই এটি খুঁজে পাবে।


এখানে "পাতলা নিয়ামক" দর্শনের উত্থান বলে মনে হচ্ছে এমন চর্বিযুক্ত মডেলগুলির পুনঃবিবেচনা সম্পর্কে একটি চমৎকার ব্লগ পোস্ট রয়েছে:

http://blog.codeclimate.com/blog/2012/10/17/7-ways-to-decompose-fat-activerecord-models/

মৌলিক বার্তাটি "ফ্যাট মডেল থেকে মিক্সিনস এক্সট্র্যাক্ট করবেন না", এর পরিবর্তে পরিষেবা ক্লাস ব্যবহার করে, লেখক এটি করতে 7 টি নিদর্শন সরবরাহ করেন


আপডেট : রেস 4 এর নতুন ডিফল্ট হিসাবে কনসার্ন ব্যবহার নিশ্চিত করা হয়েছে।

এটা সত্যিই মডিউল নিজেই প্রকৃতি উপর নির্ভর করে। আমি সাধারণত অ্যাপ্লিকেশন মধ্যে একটি / উদ্বেগ ফোল্ডার মধ্যে নিয়ামক / মডেল এক্সটেনশন রাখুন।

# concerns/authentication.rb
module Authentication
  ...
end    

# controllers/application_controller.rb
class ApplicationController
  include Authentication
end



# concerns/configurable.rb
module Configurable
  ...
end    

class Model 
  include Indexable
end 

# controllers/foo_controller.rb
class FooController < ApplicationController
  include Indexable
end

# controllers/bar_controller.rb
class BarController < ApplicationController
  include Indexable
end

/ lib সাধারণ উদ্দেশ্য লাইব্রেরি জন্য আমার পছন্দের পছন্দ। আমি সবসময় lib মধ্যে একটি প্রকল্প নামস্থান আছে যেখানে আমি সব অ্যাপ্লিকেশন-নির্দিষ্ট লাইব্রেরি স্থাপন।

/lib/myapp.rb
module MyApp
  VERSION = ...
end

/lib/myapp/CacheKey.rb
/lib/myapp/somecustomlib.rb

রুবি / রেল মূল এক্সটেনশানগুলি সাধারণত কনফিগার ইনিশিয়েটিজারগুলিতে সঞ্চালিত হয় যাতে লাইব্রেরিগুলি শুধুমাত্র রেলস বুস্টারপ্রেসে লোড হয়।

/config/initializer/config.rb
/config/initializer/core_ext/string.rb
/config/initializer/core_ext/array.rb

পুনঃব্যবহারযোগ্য কোড টুকরাগুলির জন্য, আমি প্রায়ই (মাইক্রো) প্লাগইন তৈরি করি যাতে আমি অন্য প্রকল্পগুলিতে তাদের পুনঃব্যবহার করতে পারি।

হেল্পার ফাইলগুলি হেলপার পদ্ধতিগুলি এবং কখনও কখনও ক্লাসগুলিকে ধরে রাখে যখন বস্তু হেল্পার্স দ্বারা ব্যবহৃত হয় (উদাহরণস্বরূপ ফরম বিল্ডার্স)।

এটি একটি সত্যিই সাধারণ ওভারভিউ। আপনি আরও কাস্টমাইজড পরামর্শ পেতে চান তাহলে নির্দিষ্ট উদাহরণ সম্পর্কে আরও বিস্তারিত প্রদান করুন। :)





directory-structure