কারাগারে ওও ডিজাইন: স্টাফগুলি কোথায় রাখবেন


244

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

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

উত্তর:


384

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

এক পর্যায়ে, কেউ "ফ্যাট-মডেল, চর্মসার-নিয়ন্ত্রক" দৃষ্টান্তটি দেখায় এবং মধ্যবর্তী বিকাশকারীরা তাড়াতাড়ি করে তাদের নিয়ন্ত্রকদের কাছ থেকে সমস্ত কিছু আবশ্যক করে মডেলটিতে ফেলে দেয়, যা অ্যাপ্লিকেশন যুক্তির জন্য নতুন ট্র্যাশ ক্যান হতে শুরু করে।

চর্মসার নিয়ন্ত্রকরা আসলে একটি ভাল ধারণা, তবে তাত্পর্যপূর্ণ - সবকিছুকে মডেলটিতে ফেলে দেওয়া সত্যই সেরা পরিকল্পনা নয়।

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

মনে রাখবেন, আপনি যখন কোনও ক্লাসে মডিউল অন্তর্ভুক্ত করবেন তখন পদ্ধতিগুলি ক্লাসের উদাহরণ পদ্ধতিতে পরিণত হয়, সুতরাং আপনি এখনও এক টন পদ্ধতিযুক্ত ক্লাসটি শেষ করেন , সেগুলি কেবলমাত্র একাধিক ফাইলে সুন্দরভাবে সংগঠিত।

এই সমাধান কিছু ক্ষেত্রে ভাল কাজ করতে পারেন - অন্যান্য ক্ষেত্রে, আপনি আপনার কোড ক্লাস যে ব্যবহার সম্পর্কে ভাবতে চাই যাচ্ছেন না মডেল, মতামত বা কন্ট্রোলার।

এটি সম্পর্কে চিন্তা করার একটি ভাল উপায় হ'ল "একক দায়িত্বের নীতি", যা বলে যে একটি শ্রেণির কোনও একক (বা অল্প সংখ্যক) জিনিসের জন্য দায়বদ্ধ হওয়া উচিত। আপনার মডেলগুলি আপনার অ্যাপ্লিকেশন থেকে ডাটাবেসে ডেটা বজায় রাখার জন্য দায়বদ্ধ। আপনার কন্ট্রোলাররা একটি অনুরোধ গ্রহণ এবং একটি কার্যক্ষম প্রতিক্রিয়া ফিরিয়ে দেওয়ার জন্য দায়বদ্ধ।

যদি আপনার কাছে এমন ধারণাগুলি থাকে যা সেই বাক্সগুলিতে ঝুঁকির সাথে ফিট করে না (জেদী, অনুরোধ / প্রতিক্রিয়া পরিচালনা), আপনি সম্ভবত এই প্রশ্নটি কীভাবে মডেল করবেন সে সম্পর্কে আপনি ভাবতে চান । আপনি অ্যাপ্লিকেশন / ক্লাসে বা অন্য কোথাও নন-মডেল ক্লাস সঞ্চয় করতে পারেন এবং তা করে আপনার ডিরেক্টরিতে ডিরেক্টরিটি যুক্ত করুন:

config.load_paths << File.join(Rails.root, "app", "classes")

আপনি যদি যাত্রী বা জেআরবি ব্যবহার করেন তবে আপনি সম্ভবত আগ্রহী লোড পাথগুলিতে নিজের পথটি যুক্ত করতে চান:

config.eager_load_paths << File.join(Rails.root, "app", "classes")

মূল কথাটি হ'ল একবার আপনি যখন এই প্রশ্নটি জিজ্ঞাসা করে রইলগুলির একটি বিন্দুতে পৌঁছাবেন, তখন আপনার রুবি চপগুলি গোছানো এবং মডেলিং ক্লাসগুলি শুরু করার সময় হবে যা কেবলমাত্র এমভিসি ক্লাস নয় যা রেলস আপনাকে ডিফল্টরূপে দেয়।

আপডেট: এই উত্তরটি রেল ২.x এবং উচ্চতর ক্ষেত্রে প্রযোজ্য।


ডি ওহ। মডেলবিহীনদের জন্য আলাদা ডিরেক্টরি যুক্ত করা আমার কাছে ঘটেনি। আমি একটি পরিপাটি হয়ে আসতে অনুভব করতে পারি ...
মাইক উডহাউস

ইহুদা, তার জন্য ধন্যবাদ। দুর্দান্ত উত্তর। আমি উত্তরাধিকারসূত্রে প্রাপ্ত অ্যাপ্লিকেশনগুলিতে ঠিক এটিই দেখতে পাচ্ছি (এবং আমি সেগুলি তৈরি করি): নিয়ন্ত্রক, মডেল, ভিউ এবং সহায়তাকারীদের সবকিছু স্বয়ংক্রিয়ভাবে নিয়ামক এবং দর্শনগুলির জন্য সরবরাহ করে। তারপরে লিব থেকে মেশিনগুলি আসুন, তবে আসল ওও মডেলিং করার চেষ্টা কখনও হয়নি। আপনি ঠিক বলেছেন, যদিও: "অ্যাপস / ক্লাসে বা অন্য কোথাও" " আমি যাচ্ছিলাম তার কোনও মানক উত্তর আমি অনুপস্থিত আছে
কিনা তা খতিয়ে দেখতে চেয়েছিলেন

33
আরও সাম্প্রতিক সংস্করণগুলির সাথে, config.autoload_path অ্যাপের অধীনে সমস্ত ডিরেক্টরিতে ডিফল্ট। সুতরাং উপরে বর্ণিত হিসাবে আপনার কনফিগারেশন.লোড_পথগুলি পরিবর্তন করার দরকার নেই। উত্সাহী_লোড_পাথগুলি (এখনও) সম্পর্কে আমি নিশ্চিত নই, এবং এটি সন্ধান করা দরকার। ইতিমধ্যে কেউ কি জানেন?
শ্যাম হাবারকদা

মধ্যস্থতাকারীদের প্রতি প্যাসিভ আগ্রাসী: পি
সেবাস্তিয়ান প্যাটেন

8
"একক দায়বদ্ধতার নীতি" উত্সাহিত করতে এবং বিকাশকারীদের ডাটাবেস ব্যাকড নয় এমন বস্তু তৈরি করতে সক্ষম করার জন্য এই "ক্লাস" ফোল্ডারটি দিয়ে রেলগুলি পাঠানো ভাল হবে nice রেল 4 এ "উদ্বেগগুলি" বাস্তবায়ন (সিমোন এর উত্তর দেখুন) মনে হয় মডেলগুলিতে যুক্তি ভাগ করে নেওয়ার জন্য মডিউলগুলি প্রয়োগের যত্ন নিয়েছে। তবে, সরল রুবি ক্লাসগুলির জন্য এমন কোনও সরঞ্জাম তৈরি করা হয়নি যা ডাটাবেস ব্যাকড নয়। রেলগুলি খুব মতামতযুক্ত, এই মত কোনও ফোল্ডার না রেখে আমি চিন্তার প্রক্রিয়াটি আগ্রহী?
রায়ান ফ্রান্সিস

62

আপডেট : কনসালেন্সের ব্যবহারটি রেল 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/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

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

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

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


উদ্ভট জিনিস। আমি lib ডিরেক্টরি থেকে বেরিয়ে কিছু নিয়ে কাজ করার জন্য এই প্রয়োজনীয়_নির্ভরতা RAILS_ROOT + "/ lib / my_module" পেতে পারি না। ফাইলটি খুঁজে পাওয়া না গেলে এটি অবশ্যই সম্পাদন করে এবং অভিযোগ করে, তবে এটি পুনরায় লোড করে না।
ড্যান রোজনস্টার্ক

রুবি'র প্রয়োজন কেবল একবারে জিনিসগুলি লোড করা। আপনি যদি নিঃশর্ত কিছু লোড করতে চান তবে লোডটি ব্যবহার করুন।
চক

এছাড়াও, এটি আমার কাছে বেশ অস্বাভাবিক বলে মনে হয় যে আপনি কোনও অ্যাপ্লিকেশন উদাহরণস্বরূপ জীবদ্দশায় দুবার কোনও ফাইল লোড করতে চান। আপনি যাওয়ার সাথে সাথে কি কোড তৈরি করছেন?
চক

আপনি প্রয়োজনের পরিবর্তে প্রয়োজনীয়_নির্ভরতা কেন ব্যবহার করবেন? এছাড়াও নোট করুন যে আপনি যদি নামকরণের কনভেনশনগুলি অনুসরণ করেন তবে আপনার প্রয়োজন হয় না। আপনি যদি লাইব / মাই_মডিউলটিতে মাইমোডুল তৈরি করেন তবে আপনি পূর্বের প্রয়োজন ছাড়াই মাইমোডুলকে ডাকতে পারেন (এমনকি প্রয়োজনীয়তাটি দ্রুত এবং আরও বেশি পাঠযোগ্য হওয়া উচিত)। এছাড়াও লক্ষ করুন যে / lib এ ফাইলটি কেবল একবার বুটস্ট্র্যাপে লোড হবে।
সাইমন কার্লেটি

1
উদ্বেগের ব্যবহার সম্পর্কিত
bbozo

10

... বিশাল অ্যাক্টিভেকর্ড সাবক্লাস এবং বিশাল নিয়ন্ত্রণকারী তৈরি করার প্রবণতাটি বেশ স্বাভাবিক ...

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

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

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

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

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

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

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

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


সমস্ত বিবেচনায় সত্য, মাইক এবং আপনার উদ্বেগের জন্য ধন্যবাদ ... আমি একটি প্রকল্প উত্তরাধিকার সূত্রে পেয়েছি যাতে নিয়ন্ত্রণকারীদের উপর এমন কিছু পদ্ধতি ছিল যা বিশাল ছিল। এগুলি আমি ছোট পদ্ধতিতে বিভক্ত করেছি তবে নিয়ামক নিজেই এখনও "ফ্যাট" " সুতরাং আমি যা খুঁজছি তা হ'ল অফলোড স্টাফের আমার সমস্ত বিকল্প। আপনার উত্তরগুলি হ'ল "সহায়ক ফাংশন," "ফিল্টার," "মডেল," "মিক্সিনস" এবং "সহায়ক শ্রেণি।" তাহলে, আমি এই জিনিসগুলি কোথায় রাখতে পারি? আমি কি কোনও শ্রেণি শ্রেণিবিন্যাসের ব্যবস্থা করতে পারি যা কোনও দেবতা হিসাবে আত্মবিশ্বাসিত হয়?
ড্যান রোজনস্টার্ক

1

"পাতলা নিয়ামক" ফিলোসফি থেকে উদ্ভূত ফ্যাট মডেলগুলি রিফ্যাক্টর সম্পর্কে একটি দুর্দান্ত ব্লগ পোস্ট এখানে রয়েছে:

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

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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.