একটি বর্গ এবং একটি মডিউল মধ্যে পার্থক্য


437

আমি জাভা থেকে এসেছি, এবং এখন আমি রুবির সাথে আরও কাজ করছি।

একটি ভাষার বৈশিষ্ট্য যার সাথে আমি পরিচিত না তা হ'ল module। আমি ভাবছি ঠিক কী moduleএবং আপনি কখন এটি ব্যবহার করেন এবং কেন একটি moduleওভার ব্যবহার করবেন class?


উত্তর:


398

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

উদাহরণস্বরূপ, প্রমাণীকরণ এবং অনুমোদন সিস্টেমগুলি মডিউলগুলির উদাহরণ। প্রমাণীকরণ সিস্টেমগুলি একাধিক অ্যাপ-স্তরের শ্রেণি জুড়ে কাজ করে (ব্যবহারকারীরা অনুমোদনপ্রাপ্ত হয়, সেশনগুলি প্রমাণীকরণ পরিচালনা করে, অন্যান্য শ্রেণি প্রচুর পরিমাণে লেখকের রাজ্যের উপর ভিত্তি করে ভিন্নভাবে কাজ করবে), সুতরাং প্রমাণীকরণ সিস্টেমগুলি ভাগ করা API গুলি হিসাবে কাজ করে।

আপনি একাধিক অ্যাপ্লিকেশন জুড়ে পদ্ধতিগুলি ভাগ করার সময় আপনি একটি মডিউলও ব্যবহার করতে পারেন (আবার, লাইব্রেরির মডেলটি এখানে ভাল) is


7
মডিউলটি কি জাভাতে ইন্টারফেসের মতো?
সাদ রেহমান শাহ

14
@ ক্যাফিন আসলেই নয় কারণ রুবি মডিউলগুলিতে বাস্তবে বাস্তবায়ন অন্তর্ভুক্ত রয়েছে, যেখানে জাভার ইন্টারফেসগুলি বিমূর্ত
জর্জি ইস্রায়েল পেরিয়া

8
না, মডিউল এবং জাভা প্যাকেজগুলি / জেআরগুলি সম্পূর্ণ ভিন্ন জন্তু।
করলি হরভথ

9
আমি পদ্ধতি প্রয়োগের সাথে বিমূর্ত ক্লাসের মতো।
অটোমেটিকো

2
প্রকৃতপক্ষে, @ চোল মডিউলগুলি সম্পর্কে একটি সুন্দর জিনিসের উপর আঘাত করে: নাম স্পেসিং। সুতরাং জাভায় মডিউলগুলি সরাসরি প্যাকেজগুলির সমতুল্য নয়, এটি অনুরূপ কিছু অর্জন করতে ব্যবহার করা যেতে পারে: blog.rubybestpractices.com/posts/gregory/…
michaelok

513
╔═══════════════╦═══════════════════════════╦═════════════════════════════════╗
║               ║ 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)          ║
╚═══════════════╩═══════════════════════════╩═════════════════════════════════╝

'ক্লাস' ক্লাসের সুপারক্লাস কী?
আশিষ পি

10
আমি শ্রেণিবদ্ধতা, শ্রেণি -> মডিউল -> অবজেক্ট -> বেসিকঅবজেক্ট পেয়েছি। Cool !!
আশিষ পি

ক্লাস এবং মডিউল উভয়ই শ্রেণি ভেরিয়েবল সমর্থন করে কেন "মডিউলটি" বাদ দেওয়া ভেরিয়েবল নিয়ে গঠিত? স্ট্যাকওভারফ্লো
২- এর ক্যালিডিক

এই সমস্ত উত্তরে ডায়াগ্রাম অনেক। একটু চলমান উদাহরণ: rubyfiddle.com/riddles/06081
Donato

16
একটি মডিউল কীভাবে "তাত্ক্ষণিকভাবে নয়" এবং এখনও উদাহরণ পদ্ধতি থাকতে পারে?
ডিভাইস

91

আমি অবাক হয়েছি এখনও কেউ এ কথা বলেনি।

যেহেতু প্রশ্নকর্তা একটি জাভা পটভূমি থেকে এসেছিলেন (এবং আমিও তাই), সুতরাং এখানে একটি উপমা যা সহায়তা করে।

ক্লাসগুলি কেবল জাভা ক্লাসগুলির মতো।

মডিউলগুলি জাভা স্ট্যাটিক ক্লাসগুলির মতো। Mathজাভা ক্লাস সম্পর্কে চিন্তা করুন । আপনি এটি ইনস্ট্যান্ট করবেন না এবং আপনি স্ট্যাটিক ক্লাসের পদ্ধতিগুলি পুনরায় ব্যবহার করুন (উদাঃ Math.random())।


11
তবে মডিউলগুলি ক্লাস সহ উদাহরণের পদ্ধতিগুলিও যুক্ত করতে পারে, যখন জাভাতে স্থির শ্রেণিগুলি পারে না।
মনিকা পুনরায় ইনস্টল করুন - notmaynard

4
এই বিবৃতিটি ভারী সি # ব্যাকগ্রাউন্ড থেকে আসা সত্য।
দামন ড্রেক

5
এটি সম্পূর্ণ সত্য নয়; মডিউলগুলির স্থির পদ্ধতি নেই, তাদের কেবল পদ্ধতি রয়েছে। মডিউলগুলি "তাদের প্রসারিত করতে পারে" (সিনট্যাক্সটি আসলে extend self), তাদের পদ্ধতিগুলি তাদের selfমেটাক্লাসে উপলব্ধ করে তোলে। এটি ভালো একটি পদ্ধতি প্রাণবধ সম্ভব করে তোলে random()একটি উপর Mathমডিউল। তবে তাদের প্রকৃতি অনুসারে মডিউলটির নিজস্ব পদ্ধতিতে মডিউলটির পদ্ধতিগুলি কল করা যায় না self। এটি রুবির ধারণার সাথে সম্পর্কিত self, এর মেটাচ্লাসগুলি এবং কীভাবে পদ্ধতি দেখায় কাজ করে। "মেটাগ্রোগ্রামিং রুবি" দেখুন - বিশদ বিবরণের জন্য পাওলো পার্লোটা।
স্কটবার্টন 11

আমি বলব যে মডিউলগুলি তাদের পদ্ধতিগুলির সাথে ইন্টারফেসের সাথে আরও অনুরূপ (জাভা 8 ইন্টারফেসগুলি ডিফল্ট ইমপ্লের সাথে) তবে জাভা ইন্টারফেসের বিপরীতে একে অপরের উত্তরাধিকারী হতে পারে না
splitByZero

এই উত্তরে এত ভোট কীভাবে? বিটিডব্লিউ যে আরও ভাল কথায় আগে বলা হয়েছিল 1 মম এর
আন্দ্রে

39

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

একটি মডিউল একাধিক ক্লাস দ্বারা অন্তর্ভুক্ত করা যেতে পারে। মডিউলগুলি উত্তরাধিকার সূত্রে প্রাপ্ত হতে পারে না, তবে এই "মিক্সিন" মডেলটি একটি দরকারী ধরণের "একাধিক উত্তরাধিকার" সরবরাহ করে। ওও পিউরিস্টরা এই বক্তব্যের সাথে একমত নন, তবে কাজটি করার পথে খাঁটিতা পেতে দেবেন না।


(এই উত্তরটি মূলত লিঙ্কযুক্ত http://www.rubycentral.com/pickaxe/classes.html , তবে সেই লিঙ্ক এবং এর ডোমেনটি আর সক্রিয় নয়))


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

7

Moduleরুবিতে, একটি ডিগ্রীতে, জাভা বিমূর্ত শ্রেণীর সাথে সঙ্গতিপূর্ণ - উদাহরণ পদ্ধতি রয়েছে, ক্লাসগুলি এর কাছ থেকে উত্তরাধিকারী হতে পারে (এর মাধ্যমে includeরুবি ছেলেরা একে "মিক্সিন" বলে ডাকে) তবে এর কোনও উদাহরণ নেই। অন্যান্য ছোটখাটো পার্থক্য রয়েছে, তবে আপনাকে শুরু করার জন্য এটি অনেক তথ্যই যথেষ্ট।


6

নেমস্পেস: মডিউলগুলি নামস্থান ... যা জাভাতে নেই;)

আমি জাভা এবং অজগর থেকে রুবিতেও ফিরে এসেছি, আমার মনে আছে ঠিক একই প্রশ্নটি ছিল ...

সুতরাং সহজ উত্তর হ'ল মডিউলটি একটি নামস্থান, যা জাভাতে বিদ্যমান নেই। জাভাতে নেমস্পেসের নিকটতম মানসিকতা হ'ল একটি প্যাকেজ

রুবিতে একটি মডিউল যেমন জাভা:
ক্লাসের মতো?
ইন্টারফেস নেই ? কোন
বিমূর্ত বর্গ? প্যাকেজ নেই
?হ্যা সম্ভবত)

জাভাতে ক্লাসের ভিতরে স্থির পদ্ধতি: রুবিতে মডিউলগুলির অভ্যন্তরের পদ্ধতির মতো 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

মডিউল সম্পর্কে আরও কিছু কনভেনশন:
একটি ফাইলে একটি মডিউল ব্যবহার করুন (যেমন রুবি ক্লাস, রুবি ফাইলের জন্য এক শ্রেণি)


“- অ্যাক্সেসের পদ্ধতি: ব্যবহার করুন। অপারেটর - অ্যাক্সেস কনস্ট্যান্টস: ব্যবহার করুন :: প্রতীক "কেবল এই উত্তরটিতে এটি উল্লেখ করা হয়েছে!
কিউলাং

4

নীচের লাইন: একটি মডিউল একটি স্ট্যাটিক / ইউটিলিটি শ্রেণি এবং একটি মিশ্রণের মধ্যে একটি ক্রস।

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


1

শ্রেণী

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

মডিউল

  • মডিউলগুলি পদ্ধতি, ক্লাস এবং ধ্রুবককে একসাথে গ্রুপ করার একটি উপায়।

  • মডিউলগুলি আপনাকে দুটি প্রধান সুবিধা দেয়:

    => মডিউলগুলি একটি নেমস্পেস সরবরাহ করে এবং নাম সংঘর্ষ প্রতিরোধ করে। নেমস্পেস অন্য কারও দ্বারা লিখিত একই নামের ফাংশন এবং ক্লাসগুলির সাথে দ্বন্দ্ব এড়াতে সহায়তা করে।

    => মডিউলগুলি মিক্সিন সুবিধাটি কার্যকর করে।

(ক্লাজের মডিউল সহ ক্লাজের মডিউল পদ্ধতিতে অ্যাক্সেসের উদাহরণ দেয়))

(ক্লাডকে ক্লাসকে মোডগুলি পদ্ধতিতে অ্যাক্সেস দিয়ে মোডের সাথে ক্লাজকে প্রসারিত করুন))


0

প্রথমত, কিছু সাদৃশ্য যা এখনও উল্লেখ করা হয়নি। রুবি ওপেন ক্লাস সমর্থন করে তবে মডিউলগুলিও ওপেন। সর্বোপরি, শ্রেণি উত্তরাধিকার শৃঙ্খলায় মডিউল থেকে উত্তরাধিকার সূত্রে ক্লাস এবং মডিউলটির কিছু একই আচরণ হয় 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

তবে মডিউলগুলির জন্য রুবির আরও একটি গুরুত্বপূর্ণ ব্যবহার রয়েছে। এটি মিক্সিন সুবিধা, যা আমি এসও-তে অন্য উত্তরে বর্ণনা করি। তবে সংক্ষিপ্তসার হিসাবে, মিশিনগুলি আপনাকে অবজেক্টগুলির উত্তরাধিকার শৃঙ্খলে পদ্ধতিগুলি সংজ্ঞায়িত করতে দেয়। মিক্সিনগুলির মাধ্যমে, আপনি অবজেক্ট উদাহরণগুলির উত্তরাধিকার শৃঙ্খলে (অন্তর্ভুক্ত) বা স্বতন্ত্রের সিঙ্গলটন_ক্লাসে (পদ্ধতি প্রসারিত) পদ্ধতি যুক্ত করতে পারেন।

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