কেন বেশিরভাগ "সুপরিচিত" অপরিহার্য / ওও ভাষাগুলি এমন কোনও ধরণের 'যা কিছু না' মূল্য উপস্থাপন করতে পারে তা পরীক্ষা করতে পারবেন না?


29

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

উদাহরণ হিসাবে, নিম্নলিখিত সি # কোডটি দেখুন:

void doSomething(string username)
{
    // Check that username is not null
    // Do something
}

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

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

  • nullআপনার প্রোগ্রামিং ভাষার পরিবর্তে আপনার কী ধরণের যুক্তি প্রয়োগ করতে হবে Maybe? এর কোন কারণ আছে নাকি এটি কেবল "historicalতিহাসিক লাগেজ"?

দয়া করে নিশ্চিত করুন যে আপনি এই প্রশ্নের উত্তর দেওয়ার আগে নাল এবং সম্ভবত এর মধ্যে পার্থক্যটি বুঝতে পেরেছেন।


3
আমি টনি হোয়ের সম্পর্কে পড়ার পরামর্শ দিচ্ছি , বিশেষত তার বিলিয়ন ডলারের ভুল।
ওদেড

2
ঠিক আছে, তার কারণ ছিল । এবং দুর্ভাগ্যজনক ফলাফলটি হল যে এটি আজ পর্যন্ত বেশিরভাগ ভাষায় অনুলিপি করা হয়েছিল। সেখানে হয় ভাষায় যেখানে nullবা তার ধারণা উপস্থিত না থাকার (IIRC Haskell, এক ধরনের উদাহরণ)।
ওডে

9
Bagতিহাসিক লাগেজ হ্রাস করার মতো কিছু নয়। এবং মনে রাখবেন যে ওএসগুলি যেগুলি তৈরি করে সেগুলি ভাষাগুলিতে লেখা হয়েছিল যা nullদীর্ঘদিন ধরে তাদের মধ্যে রয়েছে। কেবল এটি ফেলে দেওয়া সহজ নয়।
ওডে

3
আমি মনে করি আপনার কোনও লিঙ্ক পোস্ট করার পরিবর্তে সম্ভবত ধারণার উপর কিছুটা আলোকপাত করা উচিত।
JeffO

1
সি # তে গ্লেনএইচ 7 স্ট্রিংগুলি হল রেফারেন্স মান (এগুলি নাল হতে পারে)। আমি জানি যে ইনট একটি আদিম মান, তবে সম্ভবত এটির ব্যবহার দেখানো কার্যকর হয়েছিল।
আওচাগিয়া

উত্তর:


15

আমি বিশ্বাস করি এটি মূলত historicalতিহাসিক লাগেজ।

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

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

অন্যান্য সমস্ত ভাষা জাভা হিসাবে একই। তারা সাধারণত সি ++ বা জাভা যেভাবে করে তা অনুলিপি করে এবং nullরেফারেন্স প্রকারের অন্তর্নিহিত মূল ধারণাটি কীভাবে বিবেচনা করে তা স্পষ্টভাবে ব্যবহার করে এমন কোনও ভাষা নকশা করা সত্যিই শক্ত হয়ে যায় null


"তারা সম্ভবত ভাষার মূল ধারণাটি নিয়ে গণ্ডগোল করতে চায়নি" তারা ইতিমধ্যে পয়েন্টারগুলিকে সম্পূর্ণরূপে অপসারণ করেছে, অপসারণও nullকোনও বড় পরিবর্তন হবে না বলে আমি মনে করি।
সুইভ

2
জাভা এর জন্য @ স্পট, রেফারেন্সগুলি পয়েন্টারগুলির জন্য প্রতিস্থাপন। এবং অনেক ক্ষেত্রে, সি ++ এর পয়েন্টারগুলি জাভা রেফারেন্সগুলির মতো একইভাবে ব্যবহৃত হত। কিছু লোক এমনকি এমন দাবিও করেন যে জাভাতে পয়েন্টার রয়েছে ( প্রোগ্রামার্স.স্ট্যাকেক্সেঞ্জার.কমেসেশনস
207196/…

আমি এটিকে সঠিক উত্তর হিসাবে চিহ্নিত করেছি। আমি এটি upvote করতে চাই তবে আমার যথেষ্ট খ্যাতি নেই।
আওচাগিয়া

1
একমত। নোট করুন যে সি ++ এ (জাভা এবং সি থেকে আলাদা) নাল-সক্ষম হওয়া ব্যতিক্রম। std::stringহতে পারে না nullint&হতে পারে না null। একটি int*ক্যান, এবং সি ++ দুটি কারণে এটিতে চেক করা অ্যাক্সেসের অনুমতি দেয়: 1. কারণ সি করেছে এবং ২. কারণ আপনি সি ++ এ কাঁচা পয়েন্টার ব্যবহার করার সময় আপনি কী করছেন তা বোঝার কথা।
এমসাল্টাররা

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

15

আসলে, nullএকটি দুর্দান্ত ধারণা। একটি পয়েন্টার দেওয়া, আমরা নির্ধারণ করতে চাই যে এই পয়েন্টারটি একটি বৈধ মান উল্লেখ করে না। সুতরাং আমরা একটি মেমরি অবস্থান নিয়েছি, এটিকে অবৈধ ঘোষণা করি এবং সেই সম্মেলনে আটকে থাকি (একটি সম্মেলন কখনও কখনও সেগফোল্টস দ্বারা প্রয়োগ করা হয়)। এখন যখনই আমার পয়েন্টার রয়েছে আমি এটি Nothing( ptr == null) বা Some(value)( ptr != null, value = *ptr) রয়েছে কিনা তা পরীক্ষা করতে পারি । আমি আপনাকে বুঝতে চাই যে এটি কোনও Maybeধরণের সমতুল্য ।

এর সাথে সমস্যাগুলি হ'ল:

  1. অনেক ভাষায় টাইপ সিস্টেমটি নন-নাল রেফারেন্সের গ্যারান্টি দিতে এখানে সহায়তা করে না।

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

  2. এপিআই ডিজাইনাররা nullব্যর্থতায় ফিরে আসতে পারে , তবে সাফল্যের সাথে প্রকৃত জিনিসের কোনও উল্লেখ নেই। প্রায়শই, জিনিস (কোনও রেফারেন্স ছাড়াই) সরাসরি ফিরে আসে। একটি পয়েন্টার স্তরের এই সমতলতা nullমান হিসাবে ব্যবহার করা অসম্ভব করে তোলে ।

    এটি কেবল ডিজাইনারের পক্ষে অলসতা এবং উপযুক্ত টাইপ সিস্টেমের সাহায্যে সঠিক বাসা বাঁধতে সাহায্য করা যায় না। কিছু লোক পারফরম্যান্স বিবেচনার সাথে, বা cheচ্ছিক চেকগুলির অস্তিত্বের সাথে এটিও ন্যায়সঙ্গত করার চেষ্টা করতে পারে (কোনও সংগ্রহ ফিরে আসতে পারে nullবা আইটেমটি নিজেই আসে, তবে একটি containsপদ্ধতিও সরবরাহ করে)।

  3. হাস্কেলের মধ্যে Maybeম্যানাদ হিসাবে ধরণের একটি ঝরঝরে দৃশ্য রয়েছে । এটি থাকা মানটিতে রূপান্তর রচনা করা সহজ করে তোলে makes

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


"সি # নাল রেফারেন্স থেকে পদক্ষেপ নিচ্ছে।" সেগুলি কী? ভাষার পরিবর্তনের ক্ষেত্রে আমি এর মতো কিছুই দেখিনি। বা আপনি কি বোঝাতে চেয়েছেন যে সাধারণ গ্রন্থাগারগুলি nullঅতীতের চেয়ে কম ব্যবহার করছে?
সুইভ

@ এসভিক আমার পক্ষে খারাপ ফরাসীকরণ। " C # এর একটি মূলধারার ভাষা যে ভাল হাতল ভাষা পর্যায়ের সরঞ্জাম চালু করেছে হল nullগুলি " - আমি কথা বলছি Nullableধরনের এবং ??ডিফল্ট অপারেটর। এটা তোলে উত্তরাধিকার কোড উপস্থিতিতে ডান এখন সমস্যা সমাধানের করে না, কিন্তু এটা হয় একটা ভাল ভবিষ্যত গড়ার দিকে একটি পদক্ষেপ।
আমন

আমি তোমার সাথে একমত আমি তোমার উত্তরের আপ ভোট দেবে কিন্তু আমি যথেষ্ট খ্যাতি হবে না :( যাইহোক, Nullable আদিম ধরনের জন্য শুধুমাত্র কাজ করে, তাই এটা শুধু একটা সামান্য
aochagavia

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

@ ইউফোরিক আমি মনে করি আপনার মন্তব্যটি সকালের জবাব হিসাবে বোঝানো হয়েছিল, আমি উল্লেখ করি নি Nullable
সুইভ

9

আমার বোঝার বিষয়টি হ'ল nullসমাবেশ থেকে বিমূর্ত প্রোগ্রামিং ভাষাগুলির জন্য প্রয়োজনীয় গঠন ছিল। 1 প্রোগ্রামারগুলির মধ্যে এটি নির্দেশ করার দক্ষতার প্রয়োজন ছিল যে কোনও পয়েন্টার বা নিবন্ধকের মান ছিল not a valid valueএবং nullসেই অর্থের জন্য সাধারণ শব্দ হয়ে উঠেছে।

দৃশ্যের শক্তিশালীকরণ যা nullএকটি ধারণাকে উপস্থাপনের জন্য কেবল একটি সম্মেলন, nullপ্রোগ্রামিং ভাষা এবং প্ল্যাটফর্মের উপর ভিত্তি করে ব্যবহার করতে সক্ষম হতে / ব্যবহার করতে পারে তার আসল মান can

যদি আপনি একটি নতুন ভাষা নকশা এবং এড়াতে চেয়েছিলেন ছিল nullকিন্তু ব্যবহার maybeপরিবর্তে, তারপর আমি যেমন একটি আরো বর্ণনামূলক শব্দ উত্সাহিত হবে not a valid valueবা navvঅভিপ্রায় নির্দেশ করে। তবে সেই অ-মানটির নাম হ'ল আপনার ভাষায় অ-মূল্যবোধের অস্তিত্ব থাকতে দেওয়া উচিত কিনা তা থেকে আলাদা ধারণা is

এই দুটি পয়েন্টের যে কোনওটির বিষয়ে আপনি সিদ্ধান্ত নেওয়ার আগে আপনাকে maybeআপনার সিস্টেমের অর্থ কী হবে তা নির্ধারণ করতে হবে। আপনি এটির nullঅর্থের পরিবর্তনের নামটি not a valid valueখুঁজে পেতে পারেন বা এটি আপনার ভাষার জন্য আলাদা অর্থপূর্ণ রয়েছে।

তেমনি, nullঅ্যাক্সেস বা রেফারেন্সের বিরুদ্ধে অ্যাক্সেস চেক করার বিষয়ে সিদ্ধান্তটি আপনার ভাষার অন্য ডিজাইনের সিদ্ধান্ত।

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

আমি বিশ্বাস করি যে কিছু সংকলক বা তাদের অতিরিক্ত সরঞ্জামাদি অবৈধ পয়েন্টার অ্যাক্সেসের বিরুদ্ধে চেক করার একটি পরিমাপ সরবরাহ করতে পারে। তাই অন্যরা এই সম্ভাব্য সমস্যাটি লক্ষ্য করেছেন এবং এর বিরুদ্ধে সুরক্ষার জন্য পদক্ষেপ নিয়েছেন।

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

সুতরাং আপনার প্রশ্নের উত্তর দিতে:

  1. "কী ধরণের যুক্তি ..." - ভাল, আপনি ভাষাটি কী করতে চান তার উপর এটি নির্ভর করে। আপনি যদি খালি-ধাতব অ্যাক্সেস অনুকরণ করতে চান তবে আপনি এটির অনুমতি দিতে চাইতে পারেন।

  2. "এটি কি কেবল historicalতিহাসিক লাগেজ?" সম্ভবত, সম্ভবত না। nullঅবশ্যই বেশ কয়েকটি ভাষার অর্থ / অর্থ ছিল এবং সেগুলির ভাষাগুলি চালাতে সহায়তা করে। Preতিহাসিক নজিরটি আরও সাম্প্রতিক ভাষাগুলি এবং সেগুলির মঞ্জুরিতে প্রভাবিত হতে পারে nullতবে আপনার হাতটি হালকা করে দেওয়া এবং ধারণাটি অকেজো historicalতিহাসিক ব্যাগেজ ঘোষণা করা কিছুটা বেশি।


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


মুল বক্তব্যটি হল, সি # বা জাভাতে বেশিরভাগ ভেরিয়েবলগুলিকে নাল রেফারেন্স নির্ধারণ করা যেতে পারে। দেখে মনে হচ্ছে যে কেবল অবজেক্টগুলিতে নাল রেফারেন্স নির্ধারণ করা আরও ভাল be সুতরাং, আমার প্রশ্নটি শব্দটি নয়, "ধারণা" নাল সম্পর্কে।
আওচাগিয়া

2
"নাল পয়েন্টার রেফারেন্সগুলি সংকলনের সময় ত্রুটি হিসাবে দেখাতে পারে" কোন সংকলকরা এটি করতে পারে?
সুইভ

সম্পূর্ণরূপে ন্যায্য হওয়ার জন্য, আপনি কখনই কোনও সামগ্রীর কাছে নাল রেফারেন্স বরাদ্দ করেন না ... বস্তুর রেফারেন্সটি কেবল উপস্থিত নেই (রেফারেন্সটি কিছুই (0x000000000), যা সংজ্ঞা অনুসারে null)।
mgw854

সি 99 অনুচ্ছেদের উদ্ধৃতিটি নাল চরিত্র সম্পর্কে আলোচনা করে , নাল পয়েন্টার নয় , সেগুলি দুটি খুব ভিন্ন ধারণা।
সুইভ

2
@ GlenH7 এটি আমার জন্য তা করে না। কোডটি object o = null; o.ToString();আমার পক্ষে ঠিক জরিমানা করে, ভিএস ২০১২-তে ত্রুটি বা সতর্কতা ছাড়াই। রিসার্পার সে সম্পর্কে অভিযোগ করেন তবে এটি সংকলক নয়।
সোভিক

7

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

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

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

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


আপনি কি মনে করেন যে এটি একটি নতুন ওও ভাষায় একটি আকাঙ্ক্ষিত বৈশিষ্ট্য হবে?
আওচাগিয়া

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

2
যদিও আপনাকে সম্ভবত টাইপ করে চেক করতে হবে না। মেইপ টাইপটি একটি মোনাদ তাই এটিতে এর ফাংশন থাকতে হবে map :: Maybe a -> (a -> b) এবং bind :: Maybe a -> (a -> Maybe b)এটি সংজ্ঞায়িত করা উচিত, তাই আপনি চালিয়ে যেতে পারেন এবং বেশিরভাগ অংশের জন্য যদি অন্য কোনও বিবৃতি ব্যবহার করে পুনর্ব্যবহার করে আরও কম্পিউটেশনগুলি থ্রেড করতে পারেন। এবং getValueOrDefault :: Maybe a -> (() -> a) -> aআপনি naclable কেস পরিচালনা করতে পারবেন। এটি Maybe aসুস্পষ্টভাবে প্যাটার্ন মিলের চেয়ে অনেক বেশি মার্জিত ।
ডেট্রিয়াসজিআই

1

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


2
আমি মনে করি এটি কম নাল চেকের দিকে পরিচালিত করবে, কারণ আপনি কেবল <T> দেখতে পাচ্ছেন কিনা এবং কেবলমাত্র অন্যান্য ধরণের সম্পর্কে চিন্তা করার দরকার নেই তা কেবল আপনাকে পরীক্ষা করতে হবে।
আওচাগিয়া

1
@ এসভিককে একটি মান হিসাবে Maybe<T>অনুমতি দিতে হবে null, কারণ মানটি নাও থাকতে পারে। আমার যদি থাকে Maybe<MyClass>এবং এর কোনও মান না থাকে তবে মান ক্ষেত্রে অবশ্যই নাল রেফারেন্স থাকতে পারে contain এটি যাচাইযোগ্যভাবে নিরাপদ হওয়ার জন্য আর কিছুই নেই।
এমজিডব্লিউ 854

1
@ mgw854 অবশ্যই আছে। ওও ভাষায়, Maybeএকটি বিমূর্ত শ্রেণি হতে পারে, যার উত্তরাধিকারসূত্রে দুটি শ্রেণি থাকে: Some(যার মানটির জন্য ক্ষেত্র থাকে) এবং None(যার ক্ষেত্রটি নেই)। এইভাবে, মান কখনই হয় না null
সুইভ

6
ডিফল্টরূপে "নন-নুলাব্যতা" সহ এবং সম্ভবত <T> আপনি নিশ্চিত হতে পারেন যে কিছু ভেরিয়েবলের সর্বদা অবজেক্ট থাকে। যথা, সমস্ত ভেরিয়েবলগুলি যা <T>
আওচাগিয়া

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

1

এর ধারণাটি nullসহজেই সি-তে ফিরে পাওয়া যায় তবে সমস্যাটি যেখানে নেই।

আমার প্রতিদিনের পছন্দের ভাষাটি সি # এবং আমি nullএকটি পার্থক্য রাখব । সি # এর দুটি প্রকার, মান এবং উল্লেখ রয়েছে । মানগুলি কখনই হতে পারে না nullতবে আমি এমন সময়গুলি প্রকাশ করতে সক্ষম হতে চাই যে কোনও মান পুরোপুরি ঠিক নয় is এই সি # এর জন্য Nullableবিভিন্ন ধরণের ব্যবহার করা হয় তাই intমান এবং int?হ্রাসযোগ্য মান হবে। আমি মনে করি রেফারেন্স প্রকারগুলি পাশাপাশি কাজ করা উচিত।

আরও দেখুন: নাল রেফারেন্স ভুল হতে পারে না :

নাল উল্লেখগুলি সহায়ক এবং কখনও কখনও অপরিহার্য (আপনি সি ++ তে কোনও স্ট্রিং ফিরিয়ে দিতে বা না করতে পারলে কতটা সমস্যা বিবেচনা করুন)। ভুলটি আসলে নাল পয়েন্টারগুলির অস্তিত্বের নয়, তবে টাইপ সিস্টেমটি কীভাবে তাদের পরিচালনা করে। দুর্ভাগ্যক্রমে বেশিরভাগ ভাষা (সি ++, জাভা, সি #) এগুলি সঠিকভাবে পরিচালনা করে না।


0

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

আপনি যে প্রোগ্রামিং ল্যাঙ্গুয়েজের (সি ++, সি #, জাভা) কথা বলছেন তার আধুনিক সংস্করণগুলি সমস্ত ভাষা ভিত্তিক যা জেনেরিক প্রোগ্রামিংয়ের কোনও রূপ নেই (সি, সি # 1.0, জাভা 1)। তা ছাড়া, আপনি এখনও ভাষায় নালযোগ্য এবং নন-অযোগ্য বস্তুর মধ্যে কিছু ধরণের পার্থক্য বানাতে পারেন (যেমন সি ++ রেফারেন্স, যা হতে পারে না nullতবে এটিও সীমাবদ্ধ) তবে এটি খুব কম প্রাকৃতিক।


আমি মনে করি ফাংশনাল প্রোগ্রামিংয়ের ক্ষেত্রে এটি এফপি-র রেফারেন্স বা পয়েন্টার ধরণের না থাকার ক্ষেত্রে। এফপিতে সমস্ত কিছুরই মূল্য থাকে। এবং যদি আপনার পয়েন্টারের ধরণ থাকে তবে "পয়েন্টার টু কিছুই না" বলা সহজ হয়ে যায়।
Euphoric

0

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

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


এই পোস্টটি পড়ার চেয়ে শক্ত (পাঠ্যের প্রাচীর)। আপনি এটিকে আরও ভাল আকারে সম্পাদনা করতে আপত্তি করবেন ?
জান্নাত

1
@ গ্যানাট: এটা কি আরও ভাল?
সুপারক্যাট

0

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

আপনি সম্ভবত এমন একটি ভাষার সাথে একটি প্রয়োগ করতে পারেন যা সহজেই শূন্য হয়ে যায়। সি ++ এর আকারে একটি রয়েছে boost::optional<T>। হতে পারে শূন্যের সমতুল্য করা খুব কঠিন। বিশেষত, আমার যদি একটি থাকে তবে আমি Maybe<Just<T>>এটিকে শূন্য করার জন্য নির্ধারণ করতে পারি না (কারণ এই ধরণের ধারণার অস্তিত্ব নেই), T**নাল যুক্ত ভাষায় একটি নালকে নির্ধারণ করা খুব সহজ। এটি একটিকে ব্যবহার করতে বাধ্য করে Maybe<Maybe<T>>, যা সম্পূর্ণ বৈধ, তবে আপনাকে সেই বস্তুটি ব্যবহার করতে আরও অনেক চেক করতে বাধ্য করবে।

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

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