আমাকে কখন এবং কখন একটি ক্লাস 'স্ট্যাটিক' করা উচিত? ক্লাসগুলিতে 'স্ট্যাটিক' কীওয়ার্ডের উদ্দেশ্য কী?


47

staticবিভিন্ন ভাষায় সদস্য উপর শব্দ মানে আপনি যে ক্লাসের একটা নিদর্শন যে সদস্য এক্সেস আছে পাবে না তৈরি করা উচিত। তবে পুরো ক্লাস করার কোনও যৌক্তিকতা আমি দেখছি না static। কেন এবং কখন আমার ক্লাস করা উচিত static?

ক্লাস তৈরি করে আমি কী উপকার পেতে পারি static? আমি বলতে চাইছি, একটি স্ট্যাটিক ক্লাস ঘোষণার পরেও, সমস্ত সদস্যকে তত্ক্ষণাত ছাড়াই অ্যাক্সেস পেতে চায় এমন সমস্ত সদস্যকে স্থির হিসাবে ঘোষণা করা উচিত।

এর অর্থ হ'ল উদাহরণস্বরূপ, Mathবিকাশকারীদের কোড কীভাবে প্রভাবিত না করে ক্লাসটিকে সাধারণ (স্থিতিশীল নয়) হিসাবে ঘোষণা করা যেতে পারে। অন্য কথায়, বর্গকে স্থির বা স্বাভাবিক করা বিকাশকারীদের কাছে এক ধরণের স্বচ্ছ।


আপনি যদি ফানক প্রোগ স্টাইলে একটি লা রিচ হিকির কোডিং করছেন তবে এটি কার্যকর হতে পারে।
কাজ

1
আমার মতে, স্ট্যাটিক ক্লাসগুলি কেবল একটি ক্রাচ যার মাধ্যমে সি # ভাষায় বিশাল ডিজাইনের ত্রুটি লুকানোর চেষ্টা করে। কেন এই অযৌক্তিক সবকিছুকে-একটি-শ্রেণীর আদর্শের চারপাশে একটি ভাষা গঠন করুন, কেবল তখনই অতিরিক্ত সিনট্যাক্স প্রবর্তন করুন যাতে আপনি প্রতারণা করতে পারেন এবং এই অপ্রয়োজনীয় সীমাবদ্ধতার চারপাশে কাজ করতে পারেন। সি # যদি সবেমাত্র ফ্রি ফাংশনগুলির অনুমতি দেয় তবে স্থির শ্রেণীর প্রয়োজন হবে না।

উত্তর:


32

এটি ক্লাসটি কীভাবে ব্যবহৃত হয় তা ব্যবহারকারীদের কাছে এটি স্পষ্ট করে তোলে। উদাহরণস্বরূপ, নিম্নলিখিত কোডটি লিখতে সম্পূর্ণ বোকা হবে:

Math m = new Math();

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


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

19
@ চ্যাড এর পরে গ্রন্থাগারটি খারাপভাবে নকশা করা হয়েছে। সম্প্রসারণের জন্য ডিজাইন করা হয়নি এমন ক্লাসগুলি প্রসারিত করা শেষ পর্যন্ত কাজ করে না, তাই ক্লাসটিকে sealedপ্রথম স্থানে তৈরি করুন। আমি স্বীকার করি যে সমস্ত লোক এই অনুভূতির সাথে একমত নয় তবে মন্তব্যগুলি এটির আলোচনার পক্ষে ভাল জায়গা নয়। কিন্তু ক্ষেত্রে staticএই সমস্যা এমনকি নিজেই জাহির করে না: শুরু করতে গিয়ে System.Mathকরবে না জানার জন্য।
কনরাড রুডল্ফ

1
@ কোনার্ড, আপনি যদি Mathক্লাসের সমস্ত সদস্যকে ক্লাসটিকে অবিচলিত হিসাবে ঘোষণা না করে Mathস্থিতিশীল হিসাবে ঘোষণা করেন , তবুও আপনি ইনস্ট্যানটিশনের প্রয়োজন ছাড়াই এটি ব্যবহার করতে পারেন।
সা Saeedদ নেমতি

11
@ সাeedদ - এটি সত্য, তবে আপনি ক্লাসটি ইনস্ট্যান্টও করতে পারেন, যা কোনও উদ্দেশ্য করে না। ম্যাথ ক্লাসের উদাহরণ দিয়ে আমি কী করব ? স্পষ্টভাবে ক্লাসের অভিপ্রায় (কোন ইনস্ট্যান্স প্রয়োজন বা চেয়েছিলেন) দেখাতে, চিহ্নিত হচ্ছে static
কর্বিন মার্চ

3
@ সাeedদ আসুন এটিকে ঘুরিয়ে দিন: আমি আপনাকে আমার উত্তরটি পড়ার প্রস্তাব দিই যেহেতু আপনি এটিকে ভুল বুঝেছেন বলে মনে হচ্ছে: আপনার মন্তব্যগুলি আমার উত্তরের সাথে সম্পর্কিত নয়। আমি কখনও বলিনি যে আপনার লেখার দরকার আছে new Math()
কনরাড রুডল্ফ

24

স্ট্যাকওভারফ্লো এই বিষয়ে দুর্দান্ত আলোচনা করেছে । সহজেই রেফারেন্সের জন্য, আমি এখানে এটির অনুলিপি করে এটির লেখক, মার্ক এস। রাসমুসেনের পক্ষে পোস্ট করব :

আমি স্ট্যাটিক ক্লাস সম্পর্কে আমার ধারণাগুলি আগের থ্রেডে লিখেছি :

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

পলিমরফিজ্ম

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

ইন্টারফেস দুর্দশা

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

পরীক্ষামূলক

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

পালকরা ব্লব করে

যেহেতু স্থিতিশীল পদ্ধতিগুলি সাধারণত ইউটিলিটি পদ্ধতি হিসাবে ব্যবহৃত হয় এবং ইউটিলিটি পদ্ধতিগুলির সাধারণত বিভিন্ন উদ্দেশ্য থাকে, তাই আমরা খুব শীঘ্রই একটি বৃহত শ্রেণীর সাথে সংযুক্ত না করে সুসংগত কার্যকারিতা দিয়ে পূর্ণ করব - আদর্শভাবে, প্রতিটি শ্রেণির সিস্টেমের মধ্যেই একক উদ্দেশ্য থাকা উচিত। যতক্ষণ না তাদের উদ্দেশ্যগুলি ভালভাবে সংজ্ঞায়িত করা হয় ততক্ষণ আমি তার চেয়ে পাঁচ গুণ বেশি ক্লাস করতাম।

প্যারামিটার হামাগুড়ি

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

বিনা কারণে ক্লাসগুলির উদাহরণ তৈরি করার জন্য গ্রাহকদের দাবী

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

কেবলমাত্র একটি সিথ বিস্মৃত হয়

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

মান, মান, মান!

উদাহরণস্বরূপ পদ্ধতি ব্যবহার করা আপনাকে স্থির পদ্ধতিগুলি ব্যবহার করা থেকে বিরত রাখে না এবং বিপরীতে। যতক্ষণ না পার্থক্যের পিছনে যুক্তি রয়েছে এবং এটি মানক করা হয়েছে। বিভিন্ন বাস্তবায়ন পদ্ধতির সাথে বিস্তৃত ব্যবসায়ের স্তর দেখার চেয়ে খারাপ আর কিছু নেই।


12
হুঁ, জানি না যে আমি এখানে একটি সম্পূর্ণ উত্তর অনুলিপি করে আটকিয়ে রেখেছি। হতে পারে লিঙ্ক এবং প্যারাফ্রেজ, একটি বিকল্প দৃষ্টিভঙ্গি অন্তর্ভুক্ত করুন যেহেতু আপনি একটি "আলোচনার" উল্লেখ করেছেন, নিজের অভিজ্ঞতা শেয়ার করবেন?
কর্বিন মার্চ

2
"কেবলমাত্র একটি সিথ বিস্ময়কর বিষয়গুলি নিয়ে কাজ করে" - আমি এর আগে এর আগে কখনও ব্যবহার করে দেখিনি .... তবে এটি নিখুঁত। আমাকে লোল বানিয়েছে
ব্রুক

4
@ কর্বিন: মার্কের দুর্দান্ত উত্তর ছিল। আমি তাকে ক্রেডিট দিয়েছি এবং রেফারেন্সের স্বাচ্ছন্দ্যে আমি অনুলিপি / পেস্ট করেছি। এই বিষয়ে আমার নিজের মতামত মার্কের সাথে মেলে। আমি বিতর্ক শুরু করা ছাড়া আপনার মন্তব্যটির বিন্দুটি দেখতে পাচ্ছি না।
রিক

1
@ রিক: অনুলিপি করা উত্তরটি বেশ দীর্ঘ and "এগুলি কেবল সত্যই কার্যকর নয়, এগুলি ক্ষতি করতেও পারে, এই জাতীয় বাক্যটি কেবল এই বাক্যটি দেখায়:" আমি যে তথ্যটি সন্ধান করছিলাম তা নয় বলে আমি দ্রুত এটিকে এড়িয়ে যেতে দেব over
blubb

@ সিমন: আপনার পোস্টটি LOL আমি +1 করলাম। এত বোকা কিছু নিয়ে তর্ক ছাড়ার প্রয়াসে, আমি কেবল রাজি হই। :) আশা করি মূল পোস্টারটি আমার উত্তর / অনুলিপি এবং পেস্টটি দরকারী বলে খুঁজে পেয়েছে।
রিক

16

আমি অবাক হয়েছি যে অন্য কেউ উল্লেখ করেন নি যে staticক্লাসগুলি এক্সটেনশন পদ্ধতিগুলিকে মঞ্জুরি দেয় - নিরাপদে একটি বিদ্যমান ধরণের ( ইন্টারফেসে পদ্ধতির সংজ্ঞা যুক্ত করে ) নিরাপদে প্রসারিত করে যা আপনার নিজস্ব নয়। উদাহরণস্বরূপ, স্কালায় যা রয়েছে

trait MyFoo {
  def foo: Int
  def plusFoo(a: Int) = foo + a
}

সি হিসাবে হিসাবে প্রকাশ করা যেতে পারে #

public interface IMyFoo {
  int Foo();
}

public static class MyFooExtensions {
  public static int PlusFoo(this IMyFoo f, int a) {
    return f.Foo() + a;
  }
}

আপনি খড়ের খাঁজে সুই পেয়েছেন। +1
সা Saeedদ নেমতি

3

আমার জন্য, একটি স্ট্যাটিক শ্রেণি (সি # তে) কোনও ধরণের ফাংশন ডাকার মতো।

উদাহরণ স্বরূপ

public static string DoSomething(string DoSomethingWithThisString){}

আমি একটি স্ট্রিং মধ্যে পাস এবং একটি স্ট্রিং ফিরে। সবকিছুই সেই পদ্ধতিতে রয়েছে। সদস্য ভেরিয়েবল ইত্যাদিতে অ্যাক্সেস নেই etc.

সত্যি বলতে, বেশিরভাগ ক্ষেত্রেই আমার ব্যবহার কোডের লাইনকে হ্রাস করার জন্য হয়েছে:

কেন:

MyClass class = new MyClass();
String s = class.DoSomething("test");

যখন আমি এটি করতে পারি:

String s = MyClass.DoSomething("test");

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

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

এটি সরল হতে পারে তবে বেশিরভাগ ক্ষেত্রেই আমি এটি ব্যবহার করেছি static


1
নতুন মাইক্লাস () .ডোসোমিংথিং ("পরীক্ষা") এখনও বৈধ। আমি এটি টেস্ট ডেটা বিল্ডারদের জন্য প্রচুর ব্যবহার করি।
জোয়ানকোমাসএফডিজেড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.