VB.NET এ ক্লাস বনাম মডিউল


157

ভিবি.এনইটি-তে ভাগ করা সদস্য ফাংশন সহ ক্লাসের পরিবর্তে মডিউলগুলি ব্যবহার করা কি গ্রহণযোগ্য অনুশীলন হিসাবে বিবেচিত হয়?

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

আপনার এক মত বা অন্য কোন মতামত বা পছন্দ আছে কিনা তা জানতে আগ্রহী।


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

উত্তর:


207

Moduleগুলি হ'ল সি # staticক্লাসে ভিবি প্রতিপক্ষ । যখন আপনার শ্রেণিটি কেবলমাত্র সহায়ক ফাংশন এবং এক্সটেনশন পদ্ধতির জন্য ডিজাইন করা হয়েছে এবং আপনি উত্তরাধিকার এবং তাত্ক্ষণিকতার অনুমতি দিতে চান না , আপনি একটি ব্যবহার করেন ।Module

যাইহোক, ব্যবহার Moduleকরা সত্যই বিষয়বহুল নয় এবং এটি অবহেলা করা হয়নি । Moduleএটি উপযুক্ত যখন আপনি অবশ্যই ব্যবহার করা উচিত । । নেট ফ্রেমওয়ার্ক নিজেই এটি বহুবার করে ( System.Linq.Enumerableউদাহরণস্বরূপ)। একটি এক্সটেনশন পদ্ধতি ঘোষণা করার জন্য এটি ব্যবহার করা দরকার Module।


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

8
ফণা অধীনে, তারা কেবল [স্ট্যান্ডার্ডমডিউল] বৈশিষ্ট্য সহ ক্লাসে সংকলিত। এছাড়াও, মডিউল ব্যবহার করে আপনাকে সেখানে অ ভাগিভাগী জিনিস না রাখতে বাধ্য করে যা একটি ভাল জিনিস।
— মেহরদাদ আফশারি

18
মডিউলগুলি সি # তে স্থির শ্রেণির মতো নয়। কোনও মডিউলের পদ্ধতিগুলি কার্যকরভাবে বিশ্বব্যাপী যদি তারা কোনও আমদানিকৃত নামস্থান হয়।
— জারেডপাড়

2
@ জারেডপার: আমার কথা সম্ভবত খারাপ। আমার সি সি স্ট্যাটিক ক্লাসে ভিবি প্রতিপক্ষ বলা উচিত ছিল। এই বিবৃতি থেকে, আমি বলতে চাইছিলাম একটি মডিউল ব্যবহার করে বোঝা যায় যেখানে আপনি সি # তে একটি স্ট্যাটিক ক্লাস লিখবেন class
— মেহরদাদ আফশারী

3
@Chiwda দেখুন msdn.microsoft.com/en-us/library/bb384936.aspx : "এক্সটেনশন পদ্ধতি শুধুমাত্র মডিউল মধ্যে ঘোষিত যেতে পারে।"
— মেহরদাদ আফশারি

34

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

সুতরাং আপনার পরিবর্তে যে কোনও জায়গায় পপআপগুলি ModuleName.MyMethod()শেষ হয় MyMethod()এবং এই জাতীয় এনক্যাপসুলেশনকে অবৈধ করে তোলে। (কমপক্ষে প্রোগ্রামিং স্তরে)।

এজন্য আমি সর্বদা ভাগ করা পদ্ধতিগুলির সাথে ক্লাস তৈরি করার চেষ্টা করি, এটি আরও ভাল বলে মনে হয়।


6
সম্মত, আমি এই মুহুর্তে ক্লাস এবং মডিউল সহ একটি পুরানো প্রোগ্রামে (সম্ভবত একটি ভিবি 6 থেকে ভিবি। নেট 1 বন্দর) নিয়ে কাজ করছি। প্রায় দশটি পৃথক মডিউলে শত শত বৈশ্বিক চলক, উপকার ও কার্যকারিতা রয়েছে এবং এটি কোথায় এবং কীভাবে পরিবর্তিত হয়েছিল তা আবিষ্কার করে জাহান্নাম।
— yu_ominae

ঠিক আছে এটি খুব পুরানো, তবে আমার প্রশ্নের সাথে প্রাসঙ্গিক। আমি না একটি ভিবি লোক, কিন্তু আমি এটা দিয়ে কাজ করতে হবে। আমি একটি বড় শ্রেণি (> 46,000 লাইন) ভেঙে ফেলার চেষ্টা করছি কারণ ইন্টেলিজেন্স / রিশার্পার মারা যায়। আমি মডিউলগুলি ব্যবহার করে খুঁজে পেয়েছি এবং কেবলমাত্র তাদের নিজস্ব মডিউলটিতে ফাংশনগুলির বিশাল অংশগুলি ছিঁড়ে ফেলে কাজ করা মনে হচ্ছে, তবে আমি ভাবছি যে আমি প্রতিটি মডিউলকে তার নিজস্ব নামস্থানও দেওয়া উচিত কিনা। এটা কি প্রয়োজন হবে? অর্থাৎ এটি কেবলমাত্র মডিউলগুলির সাহায্যে ইন্টেলিজেন্সকে গতিবেগ করবে, বা নেমস্পেসগুলি আরও সাহায্য করবে?
— চোদাঃ

27

মডিউলগুলি কোনওভাবেই হ্রাস করা হয় না এবং ভিবি ভাষায় ভারী ব্যবহৃত হয়। ভিবি.নেটে কোনও এক্সটেনশন পদ্ধতি বাস্তবায়নের একমাত্র উপায়।

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

কাঁচা সিওএম ইন্টারফেসের সাথে বিরতি দেয় এমন ভিবি কোড লেখার সময় আমি এখানে প্রচুর ব্যবহার করি তার একটি দ্রুত উদাহরণ।

Module Interop
  Public Function Succeeded(ByVal hr as Integer) As Boolean
    ...
  End Function

  Public Function Failed(ByVal hr As Integer) As Boolean
    ...
  End Function
End Module

Class SomeClass
  Sub Foo()
    Dim hr = CallSomeHrMethod()
    if Succeeded(hr) then
      ..
    End If
  End Sub
End Class

4
এক্সটেনশান পদ্ধতি ... আরেকটি সূক্ষ্ম বৈশিষ্ট্য যার অর্থ আমি সর্বদা ব্যবহার করি, তবে কখনই সত্যই ঘুরে দেখা যায় না - ভাল, এটি আমাকে আরও একটি ভাল সুযোগ দেয়। আমি বৈশ্বিক সুযোগ সম্পর্কে কিছুটা পেয়েছি এবং বিশ্বব্যাপী উপলভ্য পদ্ধতিগুলি অবশ্যই সুবিধাজনক হতে পারে তবে এগুলি অতিরিক্ত ব্যবহার সম্পর্কে আমি কিছুটা তত্পরতা বোধ করি। যাইহোক, এখন পর্যন্ত সমস্ত উত্তর আমাকে বলে যে আমার হাত থেকে মডিউলগুলি খারিজ করা উচিত নয়; এগুলি সঠিক পরিস্থিতিতে ব্যবহার করার উপযুক্ত কারণ রয়েছে।
— টম জুয়ারজেন্স

12

এটি ব্যবহারযোগ্য Module। Moduleজন্য প্রতিস্থাপন হিসাবে ব্যবহার করা হয় না Class। Moduleনিজস্ব উদ্দেশ্য পরিবেশন করে। এর উদ্দেশ্য Moduleহ'ল এর জন্য একটি ধারক হিসাবে ব্যবহার করা

  • এক্সটেনশন পদ্ধতি,
  • ভেরিয়েবলগুলি যে কোনওর জন্য নির্দিষ্ট নয় Class, বা
  • ভেরিয়েবলগুলি যে কোনও একটিতে সঠিকভাবে মাপসই হয় না Class।

ModuleClassআপনি পারেন না যেহেতু একটি মত

  • থেকে উত্তরাধিকারী Module,
  • একটি Interfaceসঙ্গে একটি বাস্তবায়ন Module,
  • বা একটি উদাহরণ তৈরি না Module।

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


11

ক্লাস

  • ক্লাসগুলি অবজেক্ট হিসাবে ইনস্ট্যান্ট করা যায়
  • প্রতিটি তাত্ক্ষণিক বস্তুর জন্য অবজেক্ট ডেটা পৃথকভাবে বিদ্যমান।
  • ক্লাস ইন্টারফেস প্রয়োগ করতে পারে ।
  • শ্রেণীর মধ্যে সংজ্ঞায়িত সদস্যরা শ্রেণীর নির্দিষ্ট উদাহরণের মধ্যে স্কোপ করে থাকে এবং কেবলমাত্র বস্তুর আজীবন থাকে ।
  • শ্রেণীর বাইরে থেকে ক্লাসের সদস্যদের অ্যাক্সেস করতে আপনার অবশ্যই অবজেক্ট.মেম্বারের ফর্ম্যাটে পুরোপুরি যোগ্যতাসম্পন্ন নাম ব্যবহার করতে হবে ।

মডিউল

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

6

যখন আমার কোনও ভি.বি.এন.টি. ক্লাসে সমস্ত ভাগ করা সদস্য থাকে আমি সেটিকে ম্যাচিংয়ে (বা অন্যথায় উপযুক্ত) নামের জায়গা দিয়ে মডিউলে রূপান্তর করি বা ক্লাসটি উত্তরাধিকারসূত্রে নয় এবং গঠনযোগ্য নয়:

Public NotInheritable Class MyClass1

   Private Sub New()
      'Contains only shared members.
      'Private constructor means the class cannot be instantiated.
   End Sub

End Class

3
এবং এখানে একটি namespaced মডিউলের জন্য সিনট্যাক্স আছে: Imports <whatever>যদি আপনার কোন আমদানি থাকে, Namespace MyCoolModule, Public Module MyCoolModule, <সদস্যদের ছাড়া Shared >, End Module, End Namespace।
— ররি ও'কেনে

0

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


0

আপনি যদি এক্সটেনশন পদ্ধতি তৈরি করেন তবে আপনাকে অবশ্যই একটি মডিউল ব্যবহার করতে হবে (ক্লাসের পরিবর্তে)। ভিবি.এনইটি-তে আমি অন্য একটি বিকল্প সম্পর্কে সচেতন নই।

মডিউলগুলি নিজেই প্রতিরোধী হয়ে, আমি এমবেড থাকা সমাবেশগুলি সমাধান করতে কিছু বয়লারপ্লেট কোড যুক্ত করতে কীভাবে চেষ্টা করার চেষ্টা করেছি, কেবলমাত্র Sub New()(মডিউল) এবং Shared Sub New()(শ্রেণি) সমান। (আমি এমনকি জানি না সেখানে ছিল একটি callable Sub New()একটি মডিউল মধ্যে!)

তাই আমি ঠিক করে দিল EmbeddedAssembly.Loadএবং AddHandler AppDomain.CurrentDomain.AssemblyResolveসেখানে লাইন এবং বব আমার চাচা হয়ে ওঠে।

সংযোজন : আমি এখনও এটি 100% পরীক্ষা করে দেখিনি, তবে আমার কাছে একটি কালি রয়েছে যা Sub New()ক্লাসের চেয়ে একটি মডিউলটিতে আলাদা ক্রমে চলেছে, কেবল এড়ানো যে আমাকে এড়িয়ে চলার জন্য বাইরে থেকে অভ্যন্তরীণ পদ্ধতিতে কিছু ঘোষণা সরিয়ে নিয়ে যেতে হয়েছিল had ত্রুটি।

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