উত্তর:
প্রথম উত্তরটি ভাল এবং কিছু কাঠামোগত জবাব দেয় তবে আপনি কী করছেন সে সম্পর্কে চিন্তা করা অন্য পদ্ধতির approach মডিউলগুলি এমন একাধিক পদ্ধতি সরবরাহ করার বিষয়ে যা আপনি একাধিক ক্লাস জুড়ে ব্যবহার করতে পারেন - তাদের সম্পর্কে "গ্রন্থাগার" হিসাবে ভাবেন (যেমন আপনি কোনও রেল অ্যাপে দেখতে পাবেন)। ক্লাসগুলি অবজেক্ট সম্পর্কে; মডিউলগুলি ফাংশন সম্পর্কে।
উদাহরণস্বরূপ, প্রমাণীকরণ এবং অনুমোদন সিস্টেমগুলি মডিউলগুলির উদাহরণ। প্রমাণীকরণ সিস্টেমগুলি একাধিক অ্যাপ-স্তরের শ্রেণি জুড়ে কাজ করে (ব্যবহারকারীরা অনুমোদনপ্রাপ্ত হয়, সেশনগুলি প্রমাণীকরণ পরিচালনা করে, অন্যান্য শ্রেণি প্রচুর পরিমাণে লেখকের রাজ্যের উপর ভিত্তি করে ভিন্নভাবে কাজ করবে), সুতরাং প্রমাণীকরণ সিস্টেমগুলি ভাগ করা API গুলি হিসাবে কাজ করে।
আপনি একাধিক অ্যাপ্লিকেশন জুড়ে পদ্ধতিগুলি ভাগ করার সময় আপনি একটি মডিউলও ব্যবহার করতে পারেন (আবার, লাইব্রেরির মডেলটি এখানে ভাল) is
╔═══════════════╦═══════════════════════════╦═════════════════════════════════╗
║ ║ class ║ module ║
╠═══════════════╬═══════════════════════════╬═════════════════════════════════╣
║ instantiation ║ can be instantiated ║ can *not* be instantiated ║
╟───────────────╫───────────────────────────╫─────────────────────────────────╢
║ usage ║ object creation ║ mixin facility. provide ║
║ ║ ║ a namespace. ║
╟───────────────╫───────────────────────────╫─────────────────────────────────╢
║ superclass ║ module ║ object ║
╟───────────────╫───────────────────────────╫─────────────────────────────────╢
║ methods ║ class methods and ║ module methods and ║
║ ║ instance methods ║ instance methods ║
╟───────────────╫───────────────────────────╫─────────────────────────────────╢
║ inheritance ║ inherits behaviour and can║ No inheritance ║
║ ║ be base for inheritance ║ ║
╟───────────────╫───────────────────────────╫─────────────────────────────────╢
║ inclusion ║ cannot be included ║ can be included in classes and ║
║ ║ ║ modules by using the include ║
║ ║ ║ command (includes all ║
║ ║ ║ instance methods as instance ║
║ ║ ║ methods in a class/module) ║
╟───────────────╫───────────────────────────╫─────────────────────────────────╢
║ extension ║ can not extend with ║ module can extend instance by ║
║ ║ extend command ║ using extend command (extends ║
║ ║ (only with inheritance) ║ given instance with singleton ║
║ ║ ║ methods from module) ║
╚═══════════════╩═══════════════════════════╩═════════════════════════════════╝
আমি অবাক হয়েছি এখনও কেউ এ কথা বলেনি।
যেহেতু প্রশ্নকর্তা একটি জাভা পটভূমি থেকে এসেছিলেন (এবং আমিও তাই), সুতরাং এখানে একটি উপমা যা সহায়তা করে।
ক্লাসগুলি কেবল জাভা ক্লাসগুলির মতো।
মডিউলগুলি জাভা স্ট্যাটিক ক্লাসগুলির মতো। Math
জাভা ক্লাস সম্পর্কে চিন্তা করুন । আপনি এটি ইনস্ট্যান্ট করবেন না এবং আপনি স্ট্যাটিক ক্লাসের পদ্ধতিগুলি পুনরায় ব্যবহার করুন (উদাঃ Math.random()
)।
extend self
), তাদের পদ্ধতিগুলি তাদের self
মেটাক্লাসে উপলব্ধ করে তোলে। এটি ভালো একটি পদ্ধতি প্রাণবধ সম্ভব করে তোলে random()
একটি উপর Math
মডিউল। তবে তাদের প্রকৃতি অনুসারে মডিউলটির নিজস্ব পদ্ধতিতে মডিউলটির পদ্ধতিগুলি কল করা যায় না self
। এটি রুবির ধারণার সাথে সম্পর্কিত self
, এর মেটাচ্লাসগুলি এবং কীভাবে পদ্ধতি দেখায় কাজ করে। "মেটাগ্রোগ্রামিং রুবি" দেখুন - বিশদ বিবরণের জন্য পাওলো পার্লোটা।
মূলত, মডিউলটি ইনস্ট্যান্ট করা যায় না। যখন কোনও শ্রেণিতে একটি মডিউল অন্তর্ভুক্ত থাকে, তখন একটি প্রক্সি সুপারক্লাস উত্পন্ন হয় যা সমস্ত মডিউল পদ্ধতির পাশাপাশি শ্রেণি পদ্ধতিতে অ্যাক্সেস সরবরাহ করে।
একটি মডিউল একাধিক ক্লাস দ্বারা অন্তর্ভুক্ত করা যেতে পারে। মডিউলগুলি উত্তরাধিকার সূত্রে প্রাপ্ত হতে পারে না, তবে এই "মিক্সিন" মডেলটি একটি দরকারী ধরণের "একাধিক উত্তরাধিকার" সরবরাহ করে। ওও পিউরিস্টরা এই বক্তব্যের সাথে একমত নন, তবে কাজটি করার পথে খাঁটিতা পেতে দেবেন না।
(এই উত্তরটি মূলত লিঙ্কযুক্ত http://www.rubycentral.com/pickaxe/classes.html
, তবে সেই লিঙ্ক এবং এর ডোমেনটি আর সক্রিয় নয়))
extend
একটি ক্লাসকে আইং দ্বারা "স্ট্যাটিক" -র মতো পদ্ধতি গ্রহণ করতে পারে । রুবি আসলে "উদাহরণস্বরূপ" এবং "শ্রেণি / স্থিতিশীল" পদ্ধতির মধ্যে মোটেই পার্থক্য করে না, কেবল তাদের গ্রহণকারীদের।
Module
রুবিতে, একটি ডিগ্রীতে, জাভা বিমূর্ত শ্রেণীর সাথে সঙ্গতিপূর্ণ - উদাহরণ পদ্ধতি রয়েছে, ক্লাসগুলি এর কাছ থেকে উত্তরাধিকারী হতে পারে (এর মাধ্যমে include
রুবি ছেলেরা একে "মিক্সিন" বলে ডাকে) তবে এর কোনও উদাহরণ নেই। অন্যান্য ছোটখাটো পার্থক্য রয়েছে, তবে আপনাকে শুরু করার জন্য এটি অনেক তথ্যই যথেষ্ট।
নেমস্পেস: মডিউলগুলি নামস্থান ... যা জাভাতে নেই;)
আমি জাভা এবং অজগর থেকে রুবিতেও ফিরে এসেছি, আমার মনে আছে ঠিক একই প্রশ্নটি ছিল ...
সুতরাং সহজ উত্তর হ'ল মডিউলটি একটি নামস্থান, যা জাভাতে বিদ্যমান নেই। জাভাতে নেমস্পেসের নিকটতম মানসিকতা হ'ল একটি প্যাকেজ ।
রুবিতে একটি মডিউল যেমন জাভা:
ক্লাসের মতো?
ইন্টারফেস নেই ? কোন
বিমূর্ত বর্গ? প্যাকেজ নেই
?হ্যা সম্ভবত)
জাভাতে ক্লাসের ভিতরে স্থির পদ্ধতি: রুবিতে মডিউলগুলির অভ্যন্তরের পদ্ধতির মতো as
জাভাতে সর্বনিম্ন ইউনিট একটি শ্রেণি, আপনার কোনও শ্রেণির বাইরে কোনও ফাংশন থাকতে পারে না। তবে রুবিতে এটি সম্ভব (পাইথনের মতো)।
সুতরাং একটি মডিউল মধ্যে যায়?
ক্লাস, পদ্ধতি, ধ্রুবক। মডিউল তাদের সেই নামের জায়গার অধীনে রক্ষা করে।
উদাহরণ নেই: দৃষ্টান্ত তৈরি করতে মডিউলগুলি ব্যবহার করা যায় না
মিশ্র ইনস: কখনও কখনও উত্তরাধিকারের মডেলগুলি ক্লাসগুলির জন্য ভাল হয় না, তবে কার্যকারিতার দিক থেকে ক্লাস / পদ্ধতি / ধ্রুবকের একটি সেটকে একসাথে গ্রুপ করতে চান
রুবিতে মডিউলগুলি সম্পর্কে বিধি:
- মডিউলটির নাম হ'ল আপারকামেলকেস
- মডিউলগুলির মধ্যে ধ্রুবকগুলি সমস্ত সিএপিএস হয় (এই নিয়মটি সমস্ত রুবি ধ্রুবকগুলির জন্য মডিউলগুলির সাথে নির্দিষ্ট নয়)
- অ্যাক্সেসের পদ্ধতি: ব্যবহার। অপারেটর
- অ্যাক্সেস ধ্রুবক: ব্যবহার :: প্রতীক
একটি মডিউল সহজ উদাহরণ:
module MySampleModule
CONST1 = "some constant"
def self.method_one(arg1)
arg1 + 2
end
end
কিভাবে একটি মডিউল ভিতরে পদ্ধতি ব্যবহার করতে হবে:
puts MySampleModule.method_one(1) # prints: 3
কিভাবে একটি মডিউল ধ্রুবক ব্যবহার করবেন:
puts MySampleModule::CONST1 # prints: some constant
মডিউল সম্পর্কে আরও কিছু কনভেনশন:
একটি ফাইলে একটি মডিউল ব্যবহার করুন (যেমন রুবি ক্লাস, রুবি ফাইলের জন্য এক শ্রেণি)
নীচের লাইন: একটি মডিউল একটি স্ট্যাটিক / ইউটিলিটি শ্রেণি এবং একটি মিশ্রণের মধ্যে একটি ক্রস।
নতুন ক্লাস লিখতে সহায়তা করার জন্য মিক্সিনগুলি "আংশিক" প্রয়োগের পুনরায় ব্যবহারযোগ্য টুকরো যা মিশ্রণ ও মিলের ফ্যাশনে একত্রিত (বা রচনা) করা যায়। এই ক্লাসগুলির অতিরিক্ত নিজস্ব রাষ্ট্র এবং / অথবা কোড থাকতে পারে।
শ্রেণী
আপনি যখন কোনও শ্রেণি সংজ্ঞায়িত করেন, আপনি কোনও ডেটা টাইপের জন্য একটি নীলনকশাটি সংজ্ঞায়িত করেন। ক্লাস হোল্ড ডেটা, এমন ডেটা রয়েছে যা সেই ডেটার সাথে ইন্টারঅ্যাক্ট করে এবং অবজেক্টগুলি ইনস্ট্যান্ট করতে ব্যবহৃত হয়।
মডিউল
মডিউলগুলি পদ্ধতি, ক্লাস এবং ধ্রুবককে একসাথে গ্রুপ করার একটি উপায়।
মডিউলগুলি আপনাকে দুটি প্রধান সুবিধা দেয়:
=> মডিউলগুলি একটি নেমস্পেস সরবরাহ করে এবং নাম সংঘর্ষ প্রতিরোধ করে। নেমস্পেস অন্য কারও দ্বারা লিখিত একই নামের ফাংশন এবং ক্লাসগুলির সাথে দ্বন্দ্ব এড়াতে সহায়তা করে।
=> মডিউলগুলি মিক্সিন সুবিধাটি কার্যকর করে।
(ক্লাজের মডিউল সহ ক্লাজের মডিউল পদ্ধতিতে অ্যাক্সেসের উদাহরণ দেয়))
(ক্লাডকে ক্লাসকে মোডগুলি পদ্ধতিতে অ্যাক্সেস দিয়ে মোডের সাথে ক্লাজকে প্রসারিত করুন))
প্রথমত, কিছু সাদৃশ্য যা এখনও উল্লেখ করা হয়নি। রুবি ওপেন ক্লাস সমর্থন করে তবে মডিউলগুলিও ওপেন। সর্বোপরি, শ্রেণি উত্তরাধিকার শৃঙ্খলায় মডিউল থেকে উত্তরাধিকার সূত্রে ক্লাস এবং মডিউলটির কিছু একই আচরণ হয় have
তবে আপনাকে নিজেকে জিজ্ঞাসা করতে হবে যে প্রোগ্রামিং ভাষাতে ক্লাস এবং মডিউল উভয়ই থাকার উদ্দেশ্য কী? একটি শ্রেণীর উদাহরণ তৈরির জন্য একটি নীলনকাগুলি হ'ল এবং প্রতিটি উদাহরণ নীলনকশাটির উপলব্ধিযোগ্য প্রকরণ। উদাহরণ হ'ল একটি ব্লুপ্রিন্টের (ক্লাস) কেবল উপলব্ধিযোগ্য ভিন্নতা। স্বাভাবিকভাবেই, ক্লাসগুলি অবজেক্ট তৈরি হিসাবে কাজ করে। তদুপরি, আমরা যেহেতু মাঝে মাঝে একটি নীলনকশাটি অন্য একটি নীলনকশা থেকে উত্সাহিত করতে চাই, ক্লাসগুলি উত্তরাধিকার সমর্থন করার জন্য ডিজাইন করা হয়েছে।
মডিউলগুলি তাত্ক্ষণিকভাবে স্থাপন করা যায় না, অবজেক্ট তৈরি করতে পারে না এবং উত্তরাধিকার সমর্থন করে না। সুতরাং মনে রাখবেন একটি মডিউল অন্যটির উত্তরাধিকার সূত্রে আসে না!
তাহলে কোন ভাষায় মডিউল থাকার বিষয়টি কী? মডিউলগুলির একটি সুস্পষ্ট ব্যবহার হ'ল নেমস্পেস তৈরি করা এবং আপনি এটি অন্যান্য ভাষার সাথেও লক্ষ্য করবেন। আবার, রুবির সম্পর্কে দুর্দান্ত যা মডিউলগুলি আবার খোলা যেতে পারে (ঠিক যেমন ক্লাস)। আপনি যখন বিভিন্ন রুবি ফাইলগুলিতে একটি নেমস্পেস পুনরায় ব্যবহার করতে চান তখন এটি একটি বড় ব্যবহার:
module Apple
def a
puts 'a'
end
end
module Apple
def b
puts 'b'
end
end
class Fruit
include Apple
end
> f = Fruit.new
=> #<Fruit:0x007fe90c527c98>
> f.a
=> a
> f.b
=> b
তবে মডিউলগুলির মধ্যে কোনও উত্তরাধিকার নেই:
module Apple
module Green
def green
puts 'green'
end
end
end
class Fruit
include Apple
end
> f = Fruit.new
=> #<Fruit:0x007fe90c462420>
> f.green
NoMethodError: undefined method `green' for #<Fruit:0x007fe90c462420>
অ্যাপল মডিউলটি সবুজ মডিউল থেকে কোনও পদ্ধতির উত্তরাধিকারসূত্রে আসে নি এবং যখন আমরা ফলটিকে ক্লাসে অ্যাপল অন্তর্ভুক্ত করি তখন অ্যাপল মডিউলগুলির পদ্ধতিগুলি অ্যাপল উদাহরণগুলির পূর্বপুরুষ চেইনে যুক্ত হয় তবে গ্রিন মডিউলটির পদ্ধতিগুলি নয়, যদিও সবুজ মডিউলটি অ্যাপল মডিউলটিতে সংজ্ঞায়িত করা হয়েছিল।
তাহলে কীভাবে আমরা সবুজ পদ্ধতিতে অ্যাক্সেস অর্জন করব? আপনাকে এটিকে আপনার শ্রেণিতে স্পষ্টভাবে অন্তর্ভুক্ত করতে হবে:
class Fruit
include Apple::Green
end
=> Fruit
> f.green
=> green
তবে মডিউলগুলির জন্য রুবির আরও একটি গুরুত্বপূর্ণ ব্যবহার রয়েছে। এটি মিক্সিন সুবিধা, যা আমি এসও-তে অন্য উত্তরে বর্ণনা করি। তবে সংক্ষিপ্তসার হিসাবে, মিশিনগুলি আপনাকে অবজেক্টগুলির উত্তরাধিকার শৃঙ্খলে পদ্ধতিগুলি সংজ্ঞায়িত করতে দেয়। মিক্সিনগুলির মাধ্যমে, আপনি অবজেক্ট উদাহরণগুলির উত্তরাধিকার শৃঙ্খলে (অন্তর্ভুক্ত) বা স্বতন্ত্রের সিঙ্গলটন_ক্লাসে (পদ্ধতি প্রসারিত) পদ্ধতি যুক্ত করতে পারেন।