প্রোগ্রামিং ভাষা / প্ল্যাটফর্মে কোনও বৈশিষ্ট্যটিকে কখনই "প্রথম শ্রেণির নাগরিক" হিসাবে বিবেচনা করা হয়?


61

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

উত্তর:


40

সংজ্ঞা

একটি বস্তু প্রথম শ্রেণীর হয় যখন এটি:

  • ভেরিয়েবল এবং ডেটা স্ট্রাকচারে সংরক্ষণ করা যেতে পারে
  • পরামিতি হিসাবে সাবউরটিনে যেতে পারে
  • একটি সাবরুটিন ফলাফল হিসাবে ফিরে আসতে পারে
  • রানটাইম এ নির্মাণ করা যেতে পারে
  • অন্তর্নিহিত পরিচয় আছে (প্রদত্ত নামের চেয়ে পৃথক)

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

http://en.wikipedia.org/wiki/First_class_object


1
সুতরাং, এনট / সি # তে এনামসকে দ্বিতীয় শ্রেণীর বস্তুটি কী করে?
গুলশান

7
@ গুলশান - আপনি স্বতন্ত্র পরিচয়ের অভাব নিয়ে তর্ক করতে পারেন - সি # এনামগুলি মূলত পূর্ণসংখ্যার মানের জন্য কেবল সিনট্যাকটিক চিনি (অর্থাত্ "প্রদত্ত নাম")। জাভার সাথে তুলনা করুন, যেখানে এনামগুলি তাদের নিজস্ব অধিকারে বস্তু।
মাইকের

@ মিকেরা,। নেট এনামগুলিতে তাদের নিজস্ব অধিকার রয়েছে। জাভাতে কেবল কোনও মান নেই, কেবলমাত্র বস্তু রয়েছে, এটিই কেবলমাত্র পার্থক্য।
এসকে-যুক্তি

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

আমি মনে করি না এনটগুলিতে রানটাইম সময়ে এনটগুলি তৈরি করা যেতে পারে। নেট, তারা কি পারে? আমি ভেবেছিলাম তারা সবসময় ধ্রুবক ছিল।
ট্র্যাভিস

33

প্রোগ্রামিং ভাষায় "প্রথম-শ্রেণীর নাগরিক" বা "প্রথম শ্রেণীর উপাদান" ধারণাটি প্রথম শ্রেণির কার্যাবলির প্রসঙ্গে ১৯60০ এর দশকে ব্রিটিশ কম্পিউটার বিজ্ঞানী ক্রিস্টোফার স্ট্রাচি প্রবর্তন করেছিলেন । এই নীতিটির সর্বাধিক বিখ্যাত সূত্রটি সম্ভবত জেরাল্ড জে সুসমান এবং হ্যারি অ্যাবেলসনের কম্পিউটার প্রোগ্রামগুলির কাঠামো এবং ব্যাখ্যায় :

  • তারা ভেরিয়েবল দ্বারা নামকরণ করা যেতে পারে।
  • তারা প্রক্রিয়া যুক্তি হিসাবে পাস হতে পারে।
  • প্রক্রিয়াগুলির ফলাফল হিসাবে তারা ফিরে আসতে পারে।
  • এগুলি ডেটা স্ট্রাকচারে অন্তর্ভুক্ত থাকতে পারে।

মূলত, এর অর্থ এই যে আপনি প্রোগ্রামিং ভাষার অন্যান্য উপাদানগুলির সাথে এই প্রোগ্রামিং ভাষা উপাদানটি যা করতে পারেন তা করতে পারেন।

এটি সমস্ত "সমান অধিকার" সম্পর্কে: আপনি উপরের সমস্ত কিছু করতে পারেন, বলতে পারেন, পূর্ণসংখ্যার সাথে, তবে অন্য কোনও জিনিস আলাদা হওয়া উচিত কেন?

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

উদাহরণস্বরূপ, জাভা অপারেটর এবং জাভা পদ্ধতিগুলি একই ধরণের। আপনি নতুন পদ্ধতি সংজ্ঞায়িত করতে পারেন, আপনি (কিছুটা) অবাধে নিজের পদ্ধতিগুলির নাম চয়ন করতে পারেন, আপনি পদ্ধতিগুলিকে ওভাররাইড করতে পারেন, আপনি পদ্ধতিগুলি ওভারলোড করতে পারেন। জেমস গোসলিং অপারেটরগুলির সাথেও এই সমস্ত কিছু করতে পারে তবে আপনি এবং আমি পারব না। আমি বলতে চাচ্ছি, জনপ্রিয় বিশ্বাসের বিপক্ষে, জাভা করে সমর্থন অপারেটর ওভারলোডিং: যেমন, +অপারেটর জন্য ওভারলোড হয় byte, short, int, long, float, doubleএবং String, এবং IIRC জাভা 7 এছাড়াও BigIntegerএবং BigDecimal(এবং সম্ভবত একটি দম্পতি আমি ভুলে গেছি), এটা ঠিক যে আপনিএটির উপর কোনও প্রভাব ফেলবে না। এটি পরিষ্কারভাবে অপারেটরদের এই দ্বিতীয় সংজ্ঞা অনুযায়ী দ্বিতীয় শ্রেণিতে পরিণত করে। নোট করুন যে পদ্ধতিগুলি এখনও প্রথম সংজ্ঞা অনুযায়ী প্রথম শ্রেণীর অবজেক্ট নয়। (এটি অপারেটরদের কি তৃতীয় শ্রেণীর করে তোলে?)


6

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


কোন শ্রেণিকে সি ++ এ প্রথম শ্রেণির নাগরিক করে তোলে?
বার্জার ফ্রেইন্ড-হ্যানসেন

2
@ বারজারেফ: পূর্ববর্তী বাক্যগুলিতে প্রদত্ত বর্ণনার সাথে এটির মত উত্তর পাওয়া গিয়েছে।
doppelgreener

@ জোনাথন: হ্যাঁ, দুঃখিত, আমি "রানটাইম এগুলি নির্মাণ করুন" এর ভুল লেখা পড়েছি। হ্যাঁ আপনি রানটাইম (একটি বস্তু) এ কোনও শ্রেণীর উদাহরণ তৈরি করতে পারেন, তবে ক্লাস নিজেই নয়। এটাই আমাকে বিভ্রান্ত করেছে।
বার্জার ফ্রয়েড-হানসেন

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

@ মার্টিন আমি কখনও বলিনি যে ফাংশনগুলি সি / সি ++ এ প্রথম শ্রেণির নাগরিক ছিল।
পেমদাস

1

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

উদাহরণ:

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


1
এতে বাউন্ড ফাংশনগুলি (বা "ক্লোজারগুলি") প্রথম শ্রেণীর না হয়ে ওঠে, যখন নিজেই ফাংশনগুলি হয়? আপনার বিশ্লেষণে ক্লোজার ফ্যাক্টরের জন্য 0x এর সমর্থন কীভাবে?
ফ্রেড নূরক

@ ফ্রেড নূরক: এটি সব ভাষার উপর নির্ভর করে। কিছু ভাষায় ক্লোজার হ'ল প্রথম শ্রেণির সিস্টেম। অন্যদের মধ্যে না। আমি এখনও স্পষ্টত মন্তব্য করতে C ++ 0x এর সাথে যথেষ্ট পরিচিত নই।
মার্টিন ইয়র্ক

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

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

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

-1

ইতিমধ্যে সরবরাহ করা উত্তরগুলিতে একটি উদাহরণ যুক্ত করতে:

ডাব্লুসিএফ / সি # তে আপনাকে বর্তমানে কোনও শ্রেণি অবজেক্টকে পরিষেবা হিসাবে চালিত করার জন্য পরিষেবা চুক্তির বৈশিষ্ট্যযুক্ত চিহ্নিত করতে হবে। এর মতো কোনও জিনিস নেই:

public **service** MyService (in relation public **class** MyClass). 

একটি শ্রেণি সি # তে প্রথম শ্রেণির নাগরিক, যেখানে কোনও পরিষেবা নেই।

আশাকরি এটা সাহায্য করবে

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