স্থিতিশীল সদস্য ব্যতীত ইউটিলিটি ক্লাসগুলি কি সি ++ এ অ্যান্টি-প্যাটার্ন?


39

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

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

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


"ফাংশনাল পচন" এন্টিপ্যাটার্নের মতো কিছুটা লাগে।
ব্যবহারকারী 281377

7
সংক্ষিপ্ত উত্তর: এই ফাংশনগুলি মোড়ানোর জন্য আপনার কেবল শ্রেণির দরকার নেই। ফ্রি ফাংশনগুলি কোনও সিউডো-ওও কনস্ট্রাক্টে ক্রঞ্চ করার চেয়ে আপনার টাস্কের জন্য বেশ ক্লিনার ফিট, যা কেবলমাত্র "খাঁটি-ও" ভাষায় আপনার প্রয়োজন।
ক্রিস

উত্তর:


39

আমি উত্তর দিয়ে অনুমান করি যে আমাদের উভয় শ্রেণি এবং নেমস্পেসের উদ্দেশ্যগুলি তুলনা করা উচিত। উইকিপিডিয়া অনুসারে:

শ্রেণী

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

নামস্থান

সাধারণভাবে, একটি নেমস্পেস এমন একটি ধারক যা সনাক্তকারীদের (নাম, বা প্রযুক্তিগত শর্তাবলী, বা শব্দগুলি) ধারণ করে এর জন্য প্রসঙ্গ সরবরাহ করে এবং বিভিন্ন নামের জায়গাতে থাকা স্বামী নাম সনাক্তকারীদের অসম্মানের অনুমতি দেয়।

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

সম্ভবত প্রযুক্তিগত কারণগুলিও রয়েছে তবে যে কেউ জাভা থেকে এসেছেন এবং সি ++, এমন বহু-দৃষ্টিকোণ ভাষাটি সম্পর্কে আমার মাথা পেতে চেষ্টা করছেন, আমার কাছে সবচেয়ে সুস্পষ্ট উত্তর হ'ল: কারণ এটি অর্জনের জন্য আমাদের ওও দরকার নেই।


1
"এটি অর্জনের জন্য আমাদের OO দরকার নেই" এর জন্য +1
Ixrec

আমি এটির ওও-এর অনুরাগী হিসাবে একমত, তবে আমি অনুমান করি যে কয়েকটি অল্প পরিস্থিতি রয়েছে যেখানে অল-স্ট্যাটিক শ্রেণি ব্যবহার করা একমাত্র সমাধান, উদাহরণস্বরূপ, একটি নেমস্পেস প্রতিস্থাপন করা, যেহেতু আপনি ভিতরে নেস্টেড নেমস্পেস ঘোষণা করতে পারবেন না since একটি শ্রেণী.
ওয়েল বাটগ্লে

26

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


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

2
@ cbamber85 ন্যায্য হতে, আমি যে লাইন করা ছিল শুধুমাত্র পরে প্রথম দুই উত্তর পড়া চালিয়ে যান।
ব্যক্তিগতনেক্সাস

@ পার্সোনালনেক্সাস আহ মেলা যথেষ্ট, আমি বুঝতে পারিনি!
cmannett85

10
@ cbamber85: এটি সম্পূর্ণ সত্য নয়। আপনি প্রয়োগকারী ফাইলে "ব্যক্তিগত" ফাংশনগুলি রেখে আরও ভাল এনক্যাপসুলেশন পেতে চাইবেন, যাতে ব্যবহারকারীরা এমনকি ব্যক্তিগত ঘোষণাও দেখতে পান না।
আঙ্কেলবেন্স

2
+1 টেমপ্লেটগুলি প্রকৃতপক্ষে এমন একটি পয়েন্ট যেখানে নামস্থানগুলিতে এখনও বৈশিষ্ট্যের অভাব রয়েছে।
ক্রিস

13

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

অনুরূপ ইস্যু এখানে খেলতে হয়: সি ++ এ ইউটিলিটি ফাংশনগুলি হোস্ট করার জন্য স্ট্যাটিক ক্লাস ব্যবহার করা সি ++ এর একটি বিদেশী প্রতিমা।

যেমন আপনি আপনার প্রশ্নে উল্লেখ করেছেন, সি # তে ইউটিলিটি ফাংশনের জন্য স্ট্যাটিক ক্লাস ব্যবহার করা প্রয়োজনীয়তার বিষয়: ফ্রি-স্ট্যান্ডিং ফাংশনগুলি কেবল সি # তে কোনও বিকল্প নয়। প্রোগ্রামারদের অন্য কোনও উপায়ে ফ্রি-স্ট্যান্ডিং ফাংশনগুলি সংজ্ঞায়িত করার অনুমতি দেওয়ার জন্য ভাষাটির একটি প্যাটার্ন বিকাশ করা দরকার - যথা স্থির ইউটিলিটি ক্লাসের মধ্যে। এই শব্দটিকে জন্য শব্দ গ্রহণ একটি জাভা কৌতুক ছিল: যেমন, java.lang.Math এবং System.Math .NET প্রায় isomorphic হয়।

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

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


6
সিলেটলেটের প্রস্তাবনা ব্যতীত +1। এগুলিকে সি ++ তে অগ্রাধিকার দেওয়া হয় না ! কার্যাবলী একটি বর্গ হতে পারে যদি তারা ভাগ অবস্থায় প্রয়োজন, কিন্তু ক্লাস singletons যতক্ষণ না তারা সত্যিই, করা উচিত হবে না সত্যিই হতে হবে। এবং তারা সাধারণত না।
ম্যাক্সপাম

@ ম্যাক্সপাম আমাকে ভুল করবেন না, সিঙ্গেলটন কেবলমাত্র বিশ্বব্যাপী স্ট্যাটিক ভেরিয়েবলের চেয়ে বেশি পছন্দ করা হয়। তা ব্যতীত, সে সম্পর্কে "পছন্দসই" কিছুই নেই।
dasblinkenlight

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

আমি নিশ্চিত না যে "বিদেশী প্রতিবাদ" সঠিক শব্দটি। এটি একটি খুব সাধারণ প্রতিমা। আমি মনে করি বেশ কয়েকটি প্রোগ্রামিং দল স্ট্রস্ট্রপ এর ই 2 ব্যবহার করছে ...
নিক কেইগলি

10

সম্ভবত আপনাকে জিজ্ঞাসা করতে হবে যে আপনি কেন একটি সর্ব-স্থির শ্রেণি চান?

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

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

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


10
প্রকৃতপক্ষে - আমি বলব জাভাতে "সমস্ত স্ট্যাটিক সদস্য সহ শ্রেণি" আসলে জাভা সীমাবদ্ধতা লাভ করার জন্য একটি হ্যাক
চার্লস সালভিয়া

@ চারলেসালভিয়া: আমি ভদ্র হয়ে উঠছিলাম :) মূল () কেও জাভা ক্লাসের অংশ হওয়া নিয়ে আমার একই খারাপ লাগা আছে, যদিও তারা বুঝতে পেরেছিল আমি কেন বুঝতে পেরেছি।
gbjbaanb

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

5

কমপক্ষে পৃষ্ঠের উপরে, কোনও শ্রেণীর স্থির পদ্ধতিগুলি কোনও নেমস্পেসের ফ্রি ফাংশন থেকে অবিচ্ছেদ্য বলে মনে হয়।

অন্য কথায় নেমস্পেসের পরিবর্তে ক্লাস করার কোনও সুবিধা নেই।

এইভাবে পরবর্তীকালের জন্য অগ্রাধিকার কেন?

একটি কিছুর জন্য এটি আপনাকে staticসর্বদা টাইপ করা বাঁচায় , যদিও এটি তাত্ক্ষণিকভাবে একটি বরং সামান্য সুবিধা।

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

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


5

... বেশ কয়েকটি মন্তব্য অবশ্য বলে যে নিখরচায় ফাংশনগুলি অগ্রাধিকার দেওয়া উচিত, এমনকি স্ট্যাটিক ক্লাসগুলি একটি বিরোধী নিদর্শন হিসাবেও বোঝানো হয়েছিল। সি ++ এ কেন এমন হয়? কমপক্ষে পৃষ্ঠের উপরে, কোনও শ্রেণীর স্থির পদ্ধতিগুলি কোনও নেমস্পেসের ফ্রি ফাংশন থেকে অবিচ্ছেদ্য বলে মনে হয়। এইভাবে পরবর্তীকালের জন্য অগ্রাধিকার কেন?

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

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

আসলে তা না. staticসি (এবং পরবর্তী সময়ে সি ++) এর আসল উদ্দেশ্যটি ছিল স্থির স্টোরেজ যা কোনও সুযোগের স্তরে ব্যবহারযোগ্য us

int counter() {
    static int value = 0;
    value++;
}

আপনি সুযোগটি কোনও ফাইলের স্তরে নিয়ে যেতে পারেন, যা এটি সমস্ত সঙ্কুচিত স্কোপের কাছে দৃশ্যমান করে তবে ফাইলের বাইরে নয়:

static int value = 0;

int up() { value++; }
int down() { value--; }

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


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

তারা ডেটা ভাগ করে নিলে তারা স্ট্যাটিক পদ্ধতি ছাড়া ক্লাস হিসাবে আরও ভাল হতে পারে?
নিক কেইগলি

@ নিককিহলে এটি নির্ভর করে যে কে একটি দৃষ্টান্ত তৈরি করে এবং এটি প্রয়োজনীয় সমস্ত কিছু যা কেবল এটি স্ট্যাটিক-ইন-ক্লাসে তৈরি করা ভাল কিনা তা নিয়ে বিতর্ক কে জিতবে।
blrfl

1

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


1

বিষয়ে বক্তৃতা বেশিরভাগটাই এখানে জ্ঞান করে তোলে যদিও সি সম্পর্কে ++, করে নির্মিত হয় খুব মৌলিক কিছু namespacesএবং classস্প্যানিশ ভাষায় / structভিন্ন s।

স্ট্যাটিক ক্লাস (যে ক্লাসে সমস্ত সদস্য স্থির থাকে এবং ক্লাসটি কখনই ইনস্ট্যান্ট হয় না) সেগুলি নিজেরাই বস্তু themselves এগুলি কেবল namespaceফাংশনগুলি ধারণ করে না।

টেমপ্লেট মেটা-প্রোগ্রামিং আমাদের সংকলন-সময় অবজেক্ট হিসাবে স্ট্যাটিক ক্লাস ব্যবহার করতে দেয় allows

এই বিবেচনা:

template<typename allocator_type> class allocator
{
public:
    inline static void* allocate(size_t size)
    {
        return allocator_type::template allocate(size);
    }
    inline static void release(void* p)
    {
        allocator_type::template release(p);
    }
};

এটি ব্যবহারের জন্য আমাদের ক্লাসের ভিতরে থাকা ফাংশনগুলি প্রয়োজন। একটি নেমস্পেস এখানে কাজ করবে না। বিবেচনা:

class mallocator
{
    inline static void* allocate(size_t size)
    {
        return std::malloc(size);
    }
    inline static void release(void* p)
    {
        return std::free(p);
    }
};

এখন এটি ব্যবহার করতে:

using my_allocator = allocator<mallocator>;

void* p = my_allocator::allocate(1024);
...
my_allocator::release(p);

এতক্ষণ যে কোনও নতুন বরাদ্দকারী কোনও allocateএবং releaseকার্যকর যা সামঞ্জস্যপূর্ণ তা প্রকাশ করে, নতুন বরাদ্দকারীর কাছে স্যুইচ করা সহজ।

নেমস্পেস দিয়ে এটি অর্জন করা যায় না।

আপনার কি ক্লাসের অংশ হতে সর্বদা ফাংশন প্রয়োজন? না।

স্ট্যাটিক ক্লাসটি কি একটি অ্যান্টি-প্যাটার্ন ব্যবহার করছে? ইহা পারিপার্শ্বিক অবস্থা উপর নির্ভর করে।

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

সেক্ষেত্রে আপনি যা অর্জন করতে চাইছেন তা অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিংয়ের মাধ্যমে সবচেয়ে ভাল পরিবেশন করা হতে পারে।


শ্রেণিবদ্ধ সংজ্ঞায়িত পদ্ধতিগুলি অন্তর্নিহিত ইনলাইন হিসাবে এখানে ইনলাইন কীওয়ার্ডের ব্যবহার অপ্রয়োজনীয়। En.cppreferences.com/w/cpp/language/inline দেখুন ।
ট্রেভর

1

জন কারম্যাক যেমন বিখ্যাত বলেছেন:

"কখনও কখনও, মার্জিত বাস্তবায়ন কেবল একটি ফাংশন। কোনও পদ্ধতি নয় a শ্রেণি নয় a কাঠামো নয় Just কেবল একটি ফাংশন" "

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

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