নাল পয়েন্টার বনাম নাল অবজেক্ট প্যাটার্ন


27

অ্যাট্রিবিউশন: এটি সম্পর্কিত একটি পি.এসই প্রশ্ন থেকে বেড়েছে

আমার পটভূমিটি সি / সি ++ এ রয়েছে তবে আমি জাভাতে মোটামুটি পরিমাণে কাজ করেছি এবং বর্তমানে সি # কোডিং করছি। আমার সি ব্যাকগ্রাউন্ডের কারণে, পাস করা এবং ফিরে আসা পয়েন্টারগুলি পরীক্ষা করা দ্বিতীয় হ্যান্ড হ'ল তবে আমি স্বীকার করি এটি আমার দৃষ্টিভঙ্গিকে পক্ষপাতদুষ্ট করে।

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

  • নাল অবজেক্ট প্যাটার্ন ব্যবহার করে নাল চেকের পক্ষে কি কি?

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

  • নাল অবজেক্ট প্যাটার্নে নাল চেক না করায় একই সমস্যা হতে পারে না?

আমি অনেকগুলি অবজেক্টগুলিকে হোল্ড অবজেক্টস বা তাদের নিজস্ব পাত্রে রেখে কাজ করেছি। দেখে মনে হচ্ছে যে মুখ্য অবজেক্টের সমস্ত পাত্রে তাদের নিজস্ব খালি জিনিস ছিল তা গ্যারান্টি সহ আমার একটি বিশেষ কেস থাকতে হবে। এরকম মনে হচ্ছে বাসা বাঁধার একাধিক স্তর দিয়ে কুৎসিত হতে পারে।


"ত্রুটি মামলা" নয় "সমস্ত ক্ষেত্রে একটি বৈধ অবজেক্ট"।

@ থরবজর্নআরএনএন্ডারসেন - ভাল বিষয়, এবং আমি এটি সম্পাদন করতে প্রশ্নটি সম্পাদনা করেছি। আমি যদি এখনও এনওপি-র ভিত্তিকে ভুল ব্যবহার করছি তবে দয়া করে আমাকে জানান let

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

1
@ জেরি কফিন এই মামলাটি একটি ব্যতিক্রম দ্বারা নির্দেশিত হওয়া উচিত। ধারণাটি হ'ল আপনি কখনই নাল পেতে পারবেন না এবং তাই নাল পরীক্ষা করার দরকার নেই।

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

উত্তর:


24

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

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

User* pUser = GetUser( "Bob" );

if( pUser )
{
    pUser->SetAddress( "123 Fake St." );
}

আপনি যদি এনওপি ব্যবহার করেন তবে আপনি লিখবেন:

GetUser( "Bob" )->SetAddress( "123 Fake St." );

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

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


4
নাল বস্তুর নিদর্শনগুলির জন্য ব্যবহারের ক্ষেত্রে সম্মত হন। তবে বিপর্যয়কর ব্যর্থতার মুখোমুখি হয়ে কেন নালাগুলি ফিরে আসবে? কেন ব্যতিক্রম ছোঁড়াবেন না?
অপুরভ খুরসিয়া

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

2
@ মনস্টারট্রাক: "বিপরীত" দ্বারা আমি বোঝাচ্ছি, আপনি যখন বিপর্যয়জনিত ত্রুটি সনাক্ত করেন তখন স্পষ্টভাবে NULL ফিরিয়ে দেবেন না, তবে প্রত্যাশা করেন যে কেবল কিছু অপ্রত্যাশিত বিপর্যয়জনিত ত্রুটির কারণে NULL ঘটবে।
ডিএক্সএম

বিপর্যয়মূলক ত্রুটি বলতে আপনি কী বোঝাতে চেয়েছিলেন তা এখন আমি বুঝতে পেরেছি - এমন কিছু যা অবজেক্টের বরাদ্দকে নিজেই ব্যর্থ করে দেয়। রাইট? সম্পাদনা: @ ডিএক্সএম করতে পারবেন না কারণ আপনার ডাকনামটি মাত্র 3 টি অক্ষর দীর্ঘ।
অপুরভ খুরসিয়া

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

7

নাল অবজেক্ট প্যাটার্ন ব্যবহার করে নাল চেকের পক্ষে কি কি?

পেশাদাররা

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

কনস

  • স্যান ডিফল্ট সাধারণত ক্লিনার কোডে ফলাফল করে।
  • সান ডিফল্টগুলি বন্যার মধ্যে প্রবেশ করতে পরিচালিত হলে সাধারণত কম বিপর্যয়মূলক ত্রুটির ফলস্বরূপ।

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

অন্যান্য ডিজাইনের সিদ্ধান্তের মতো, আপনার প্রয়োজনের উপর নির্ভর করে আপসাইড এবং ডাউনসাইড রয়েছে।


1
পেশাদার বিভাগে: প্রথম পয়েন্ট সহ একমত। দ্বিতীয় বিষয় হ'ল ডিজাইনারদের ত্রুটি কারণ এমনকি নাল যেখানে ব্যবহার করা উচিত নয় সেখানে ব্যবহার করা যেতে পারে। প্যাটার্ন সম্পর্কে খারাপ কিছু বলে না কেবল সেই বিকাশকারীকে প্রতিফলিত করে যারা প্যাটার্নটি ভুলভাবে ব্যবহার করেছিল।
অপুরভ খুরসিয়া

প্রাপক গ্রহণ না করে এবং সুস্পষ্ট চেকের আগে এটি না জেনে অর্থ প্রেরণ না করা বা প্রেরণকারী (এবং এইভাবে আর নেই) অর্থ পাঠাতে সক্ষম না হওয়া এবং এর চেয়ে বেশি বিড়াল কী হতে পারে?
ব্যবহারকারী470365

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

@ শাওহঙ্কুরি - কি?
টেলাস্টিন

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

6

আমি উদ্দেশ্যমূলক তথ্যের কোনও ভাল উত্স নই, তবে বিষয়গতভাবে:

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

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

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

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

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


9
অপ্রত্যাশিত কিছু ঘটলে আমার আবেদনটি ব্যর্থ হওয়ার কারণটি হ'ল - অপ্রত্যাশিত কিছু ঘটেছিল। এটা কিভাবে ঘটেছে? কেন? আমি ক্র্যাশ ডাম্প পেয়েছি এবং কোডে লুকিয়ে থাকার পরিবর্তে আমি একটি সম্ভাব্য বিপজ্জনক সমস্যাটি তদন্ত করতে এবং ঠিক করতে পারি। সি # তে, আমি অবশ্যই চেষ্টা এবং অ্যাপ্লিকেশনটি পুনরুদ্ধার করার জন্য সমস্ত অপ্রত্যাশিত ব্যতিক্রমগুলি ধরতে পারি, তবে তারপরেও আমি যেখানে সমস্যাটি করেছি সেখানে লগইন করতে এবং এটির জন্য পৃথক হ্যান্ডলিংয়ের দরকার আছে কিনা তা খুঁজে পেতে চাই (এটি "না হলেও" এই ত্রুটিটি লগ করুন, এটি আসলে প্রত্যাশিত এবং পুনরুদ্ধারযোগ্য ")।
লুয়ান

3

আমি মনে করি এটি আকর্ষণীয় যে আমার ভাষা স্থিতিযুক্ত টাইপ করা হয়েছে কি না তার উপর নির্ভর করে নাল অবজেক্টের কার্যক্ষমতা কিছুটা আলাদা বলে মনে হচ্ছে। রুবি এমন একটি ভাষা যা নুলের (বা Nilভাষার পরিভাষায়) কোনও বস্তু প্রয়োগ করে ।

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

মিস্টারলিস্টার এই বিষয়টি সামনে এলো যে আপনি যখন প্রথম প্রথম তৈরি করবেন তখন সি ++ এ আপনার আরম্ভের রেফারেন্স / পয়েন্টার থাকার নিশ্চয়তা নেই। কাঁচা নাল পয়েন্টারের পরিবর্তে একটি উত্সর্গীকৃত নাল বস্তু রাখার মাধ্যমে আপনি কয়েকটি দুর্দান্ত অতিরিক্ত বৈশিষ্ট্য পেতে পারেন। রুবি এর Nilএকটি অন্তর্ভুক্ত to_s(toString) ফাংশন যা ফাঁকা টেক্সট ফলাফল নেই। আপনি যদি কোনও স্ট্রিংয়ে শূন্য রিটার্ন পেতে আপত্তি করেন না এবং ক্রাশ না করে এটির প্রতিবেদনটি এড়িয়ে যেতে চান তবে এটি দুর্দান্ত। ওপেন ক্লাসেস আপনাকে Nilপ্রয়োজন হলে আউটপুটটিকে ম্যানুয়ালি ওভাররাইড করার অনুমতি দেয় ।

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


1

কিছু অতিরিক্ত দৃষ্টিভঙ্গির জন্য, অবজেক্টিভ-সি দেখুন, যেখানে কোনও নুল বস্তুর পরিবর্তে কোনও বস্তুর মতো মান শূন্য প্রকারের কাজ করে। কোনও শূন্য বস্তুকে প্রেরণ করা যে কোনও বার্তার কোনও প্রভাব নেই এবং 0 / 0.0 / NO (মিথ্যা) / NULL / শূন্যের মান প্রদান করে, পদ্ধতিটির রিটার্ন মান ধরণের যাই হোক না কেন। এটি ম্যাকওএস এক্স এবং আইওএস প্রোগ্রামিংয়ে খুব বিস্তৃত নিদর্শন হিসাবে ব্যবহৃত হয় এবং সাধারণত পদ্ধতিগুলি এমনভাবে নকশাকৃত করা হয় যাতে কোনও শূন্য বস্তু 0 ফেরত যুক্তিসঙ্গত ফলাফল হয়।

উদাহরণস্বরূপ, আপনি যদি স্ট্রিংয়ের এক বা একাধিক অক্ষর রয়েছে কিনা তা পরীক্ষা করতে চান, আপনি লিখতে পারেন

aString.length > 0

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

(NSNull শ্রেণীর একটি সিঙ্গলটন অবজেক্টও রয়েছে যা বেশ আলাদা আচরণ করে এবং অনুশীলনে খুব বেশি ব্যবহৃত হয় না)।


উদ্দেশ্য-সি নাল অবজেক্ট / নাল পয়েন্টার জিনিসটিকে সত্যই অস্পষ্ট করে তুলেছে। nilপেতে #defineশূন্য এবং একটি নাল বস্তুর মত আচরণ করতে 'ঘ। এটি একটি রানটাইম বৈশিষ্ট্য যখন সি # / জাভায় নাল পয়েন্টারগুলিতে ত্রুটি প্রকাশ করে।
ম্যাক্সথন চ্যান

0

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

প্রথমে দেশটির তালিকা তৈরি করা যাক এরপরে আমরা কীভাবে কয়েকটি ভাষায় এটি প্রকাশ করতে পারি সে সম্পর্কে ভাবুন (সি ++, ওক্যামেল, পাইথন)

  1. সংকলনের সময় কোনও ডিফল্ট অবজেক্টের অযাচিত ব্যবহার ধরা।
  2. কোডটি পড়ার সময় প্রদত্ত মানটি সম্ভাব্য-খেলাপি আছে কিনা তা সুস্পষ্ট করুন।
  3. আমাদের বুদ্ধিমান ডিফল্ট মান চয়ন করুন, যদি প্রযোজ্য হয়, প্রতি টাইপ একবার । অবশ্যই প্রতিটি কল সাইটে একটি সম্ভাব্য ভিন্ন ডিফল্ট চয়ন করবেন না ।
  4. স্থিতিশীল বিশ্লেষণ সরঞ্জামগুলি বা কোনও মানুষের grepপক্ষে সম্ভাব্য ভুলগুলির জন্য অনুসন্ধান করা সহজ করে দিন।
  5. কিছু অ্যাপ্লিকেশনের জন্য , অপ্রত্যাশিতভাবে একটি ডিফল্ট মান দেওয়া হলে প্রোগ্রামটি স্বাভাবিকভাবে চলতে হবে। অন্যান্য অ্যাপ্লিকেশনগুলির জন্য , আদর্শভাবে তথ্যমূলক উপায়ে কোনও ডিফল্ট মান দেওয়া হলে প্রোগ্রামটি তত্ক্ষণাত থামানো উচিত।

আমি মনে করি নাল অবজেক্ট প্যাটার্ন এবং নাল পয়েন্টারগুলির মধ্যে উত্তেজনা (5) থেকে এসেছে। আমরা যদি প্রাথমিক পর্যায়ে ত্রুটিগুলি সনাক্ত করতে পারি তবে, (5) মোট হয়ে যায়।

আসুন ভাষা দ্বারা এই ভাষাটি বিবেচনা করুন:

সি ++

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

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

আমি একটি ফ্যাক্টরি ফাংশন ব্যবহার করার পরামর্শ দেব যা সম্ভব হলে কোনও std::optional<MyClass>, std::pair<bool, MyClass>বা একটি-আর-রেফারেন্স দেয় std::unique_ptr<MyClass>

যদি আপনি চান কারখানার ফাংশনটি কোনও ধরণের "প্লেসহোল্ডার" রাজ্যকে একটি ডিফল্ট-নির্মিত-নির্ধারিত থেকে পৃথক MyClassকরতে চায় তবে একটি ব্যবহার করুন std::pairএবং আপনার ফাংশনটি এটি করে যে ডকুমেন্ট করতে ভুলবেন না।

যদি কারখানার ফাংশনটির একটি অনন্য নাম থাকে grepতবে নামটির পক্ষে এটি সহজ এবং opালু সন্ধান করুন। যাইহোক, grepপ্রোগ্রামার কারখানার ফাংশনটি ব্যবহার করা উচিত ছিল তবে সে ক্ষেত্রে এটি করা কঠিন ।

OCaml

আপনি যদি ওসিএএমএল এর মতো ভাষা ব্যবহার করে থাকেন তবে আপনি কেবল একটি optionপ্রকার (ওসিএএমএল স্ট্যান্ডার্ড লাইব্রেরিতে) বা একটি eitherপ্রকার (স্ট্যান্ডার্ড লাইব্রেরিতে নয়, তবে নিজের নিজস্ব রোল করা সহজ) ব্যবহার করতে পারেন। বা একটি defaultableপ্রকার (আমি শব্দটি তৈরি করছি defaultable)।

type 'a option =
    | None
    | Some of 'a

type ('a, 'b) either =
    | Left of 'a
    | Right of 'b

type 'a defaultable =
    | Default of 'a
    | Real of 'a

একটি defaultableকারণ ব্যবহারকারী আবশ্যক প্যাটার্ন ম্যাচ বের করে আনতে উপরে দেখানো একজোড়া বেশী ভালো 'aকেবল যুগল প্রথম উপাদান উপেক্ষা করতে পারেন না।

defaultableউপরের মত উল্লিখিত ধরণের সমতুল্য std::variantএকই ধরণের দুটি উদাহরণ সহ সি ++ এ ব্যবহার করা যেতে পারে std::variantতবে উভয় প্রকারের মত একই থাকলে এপিআইয়ের অংশগুলি ব্যবহারযোগ্য নয়। std::variantএটির ধরণের নির্মাতারা নামবিহীন হওয়ায় এটি একটি অদ্ভুত ব্যবহার ।

পাইথন

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

আপনি যখন কোনও ডিফল্ট উদাহরণ তৈরি করতে বাধ্য হন তখন আমি কেবল একটি ব্যতিক্রম ছুঁড়ে ফেলার পরামর্শ দেব।

যদি তা গ্রহণযোগ্য না হয় তবে আমি প্রস্তাব দিচ্ছি যে এটি একটি DefaultedMyClassউত্তরাধিকার সূত্রে তৈরি হোক MyClassএবং এটি আপনার কারখানার ফাংশন থেকে ফিরে আসবে। এটি আপনার প্রয়োজন হলে ডিফল্ট উদাহরণগুলিতে কার্যকারিতা "স্টাব্বিং" এর ক্ষেত্রে আপনাকে নমনীয়তা ক্রয় করে।

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