নালগুলি যদি মন্দ হয় তবে কোনও মান যখন অর্থপূর্ণভাবে অনুপস্থিত হতে পারে তখন কী ব্যবহার করা উচিত?


26

এটি নিয়মগুলির মধ্যে একটি যা বার বার পুনরাবৃত্তি হয় এবং তা আমাকে বিভ্রান্ত করে।

নালগুলি মন্দ এবং যখনই সম্ভব এড়ানো উচিত

তবে, তবে - আমার নির্দোষ থেকে, আমাকে চিৎকার করতে দিন - কখনও কখনও কোনও মান অর্থপূর্ণভাবে অনুপস্থিত হতে পারে!

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

প্রতিটি টার্নের পরে সার্ভার ক্লায়েন্ট সাইড জেএস কোডে আপডেটগুলির একটি তালিকা সম্প্রচার করে। আপডেট ক্লাস:

public class GameUpdate
{
    public Player player;
    // other stuff
}

এই শ্রেণিটি জেএসএনে সিরিয়ালীকৃত এবং সংযুক্ত খেলোয়াড়দের কাছে প্রেরণ করা হয়েছে।

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

অবশ্যই, উত্তরাধিকার কাজে লাগিয়ে এই কোডটি "সংশোধন" করতে পারলাম:

public class GameUpdate
{
    // stuff
}

public class GamePlayerUpdate : GameUpdate
{
    public Player player;
    // other stuff
}

তবে, দুটি কারণে এটি কীভাবে কোনও উন্নতি হয় তা দেখতে আমি ব্যর্থ হয়েছি:

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

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

আপনি কি আমাকে এই বিষয়টি ব্যাখ্যা করতে পারেন?


2
এই প্রশ্নটি কি জাভাস্ক্রিপ্টের সাথে নির্দিষ্ট? অনেকগুলি ভাষাতে এই উদ্দেশ্যে একটি ptionচ্ছিক প্রকার রয়েছে তবে আমি জানি না যে জেএস রয়েছে কিনা (যদিও আপনি এটি তৈরি করতে পারেন) বা এটি জসসনের সাথে কাজ করবে (যদিও এটি আপনার কোডের উপরে কদর্য নাল চেকগুলির একটি অংশ নয়
রিচার্ড টিঙ্গল

9
এই নিয়মটি কেবল মিথ্যা। আমি কিছুটা অবাক হয়েছি যে কেউ এই ধারণার সাথে সাবস্ক্রাইব করবে। কিছু ক্ষেত্রে নাল জন্য কিছু ভাল বিকল্প আছে। নাল একটি অনুপস্থিত মান উপস্থাপনের জন্য সত্যিই ভাল। এ জাতীয় এলোমেলো নিয়মগুলি যেন আপনাকে নিজের যুক্তিযুক্ত রায়কে বিশ্বাস করতে বাধা দেয় না।
usr ডিরেক্টরির

1
@ আমাদের - আমি সম্পূর্ণ একমত নাল আপনার বন্ধু। আইএমএইচও, অনুপস্থিত মানের প্রতিনিধিত্ব করার কোনও সুস্পষ্ট উপায় নেই। এটি আপনাকে বাগগুলি সন্ধান করতে সহায়তা করতে পারে, এটি আপনাকে ত্রুটির শর্তগুলি পরিচালনা করতে সহায়তা করতে পারে, এটি আপনাকে ক্ষমা প্রার্থনা করতে সহায়তা করতে পারে (চেষ্টা করুন / ধরুন)। কি পছন্দ করেন না?!
স্কুবা স্টিভ

4
ডিজাইনের সফ্টওয়্যারটির প্রথম নিয়মের একটি হ'ল "সর্বদা নাল জন্য চেক করুন"। কেন এটি এমনকি একটি ইস্যু আমার কাছে বোকা বানাচ্ছে।
ম্যাট

1
@ ম্যাট - সম্পূর্ণ। আমি কেন ডিজাইন প্যাটার্নটি ইঞ্জিনিয়ার করব যখন সত্যই, নুল আপনার বেসিক টুলবক্সে রাখা ভাল। গ্রাহাম যা বলছিলেন, আইএমএইচও আমাকে ওভার ইঞ্জিনিয়ারিং হিসাবে আঘাত করে।
স্কুবা স্টিভ

উত্তর:


20

অনেকগুলি জিনিস নালার চেয়ে ফিরে ভাল।

  • একটি খালি স্ট্রিং ("")
  • একটি খালি সংগ্রহ
  • একটি "alচ্ছিক" বা "সম্ভবত" মোনাড
  • এমন একটি ফাংশন যা নিঃশব্দে কিছুই করে না
  • এমন পদ্ধতিতে পূর্ণ একটি বস্তু যা নিঃশব্দে কিছুই করে না
  • একটি অর্থবহ মান যা প্রশ্নের ভুল ভিত্তি প্রত্যাখ্যান করে
    (যা আপনাকে প্রথমে নাল মনে করে)

কৌতুকটি বুঝতে পারে যে এটি কখন করা উচিত। নাল আপনার মুখে ফুঁকিয়ে উঠতে খুব ভাল তবে কেবল যখন আপনি এটির জন্য পরীক্ষা না করে বিন্দু বিন্দু। কেন তা ব্যাখ্যা করা ভাল নয়।

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

মনডস অভিনব শব্দ তবে এখানে তারা যা করছে তা হ'ল এটি আপনাকে পরিষ্কার করে দেয় যে সংগ্রহের জন্য বৈধ মাপগুলি 0 এবং 1। যদি আপনার সেগুলি থাকে তবে সেগুলি বিবেচনা করুন।

এগুলির যে কোনওটি শূন্যতার চেয়ে আপনার উদ্দেশ্য পরিষ্কার করার জন্য আরও ভাল কাজ করে। এটি সবচেয়ে গুরুত্বপূর্ণ পার্থক্য।

আপনি কেন কেবল ব্যতিক্রম ছুঁড়ে মারার পরিবর্তে একেবারে ফিরে আসছেন তা বুঝতে এটির সহায়তা হতে পারে। ব্যতিক্রমগুলি মূলত একটি অনুমানকে প্রত্যাখ্যান করার একটি উপায় (এগুলি একমাত্র উপায় নয়)। আপনি যখন দুটি রেখাকে ছেদ করে এমন বিন্দুর জন্য জিজ্ঞাসা করছেন যখন তারা অনুমান করছেন তা ধরে নিচ্ছেন। তারা সমান্তরাল হতে পারে। আপনার কি "সমান্তরাল রেখা" ব্যতিক্রম ছুঁড়ে দেওয়া উচিত? ওয়েল আপনি কিন্তু এখন আপনি যে ব্যতিক্রম অন্য কোথাও পরিচালনা করতে হবে বা এটি সিস্টেমটি থামিয়ে দিতে হবে।

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

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

নালীর সাথে সমস্যাটি হ'ল এটি অনেকগুলি জিনিস বোঝাতে পারে। সুতরাং এটি কেবল তথ্য ধ্বংস করে শেষ করে।


আমার প্রিয় নাল চিন্তার পরীক্ষায় আমি আপনাকে একটি জটিল রুবে গোল্ডবারজিয়ান মেশিনটি কল্পনা করতে বলি যা একটি বাহক বেল্ট থেকে রঙিন আলোর বাল্বগুলি তুলে, তাদের সকেটে স্ক্রু করে, এবং তাদেরকে শক্তিশালী করে রঙিন আলো ব্যবহার করে এনকোড করা বার্তাগুলির সংকেত দেয় imagine সংকেতটি কনভেয়র বেল্টে রাখা বাল্বের বিভিন্ন রঙের দ্বারা নিয়ন্ত্রিত হয়।

আপনাকে এই আধ্যাত্মিক ব্যয়বহুল জিনিসটি আরএফসি 3.14159 এর সাথে সামঞ্জস্যপূর্ণ করতে বলা হয়েছে যা জানিয়েছে যে বার্তাগুলির মধ্যে একটি চিহ্নিতকারী থাকা উচিত। চিহ্নিতকারীটি কোনও হালকা হওয়া উচিত। এটি ঠিক একটি ডালের জন্য স্থায়ী হওয়া উচিত। একক রঙিন আলো সাধারণত একইভাবে জ্বলজ্বল করে time

আপনি কেবলমাত্র বার্তাগুলির মধ্যে ফাঁকা স্থান ছেড়ে দিতে পারবেন না কারণ যদি সকেটে কোনও বাল্ব খুঁজে না পাওয়া যায় তবে বৈকল্পিকতা অ্যালার্মগুলি এবং থামিয়ে দেয়।

এই প্রকল্পের সাথে পরিচিত সকলেই যন্ত্রপাতি বা এটির নিয়ন্ত্রণ কোডের স্পর্শ করার পরেও কাঁপছে। এটি পরিবর্তন করা সহজ নয়। আপনি কি করেন? ভাল আপনি ডুব এবং জিনিস ভাঙ্গা শুরু করতে পারেন। হতে পারে এই জিনিসগুলি ঘৃণ্য নকশা আপডেট করুন। হ্যাঁ আপনি এটিকে আরও ভাল করে তুলতে পারেন। অথবা আপনি দরজার সাথে কথা বলতে এবং পোড়া আউট বাল্ব সংগ্রহ করা শুরু করতে পারেন।

এটাই বহুতল সমাধান। সিস্টেমটি এমনকি কিছু পরিবর্তিত হয়েছে জানার প্রয়োজন নেই।


আপনি যদি এটিকে টানতে পারেন তবে এটি সত্যিই দুর্দান্ত। একটি মান হিসাবে একটি অনুমানের অর্থপূর্ণ প্রত্যাখ্যান এনকোডিং দ্বারা আপনি প্রশ্ন পরিবর্তন করতে বাধ্য করতে হবে না।

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

যাইহোক, কখনও কখনও প্রশ্ন পরিবর্তন করা আসলে উপায় the যদি অনুমানটিকে আরও নির্ভরযোগ্য করে তোলা যায়, তবুও দরকারী থাকা অবস্থায়, এটি করার বিষয়ে বিবেচনা করুন।

আপনার সমস্যাটি হ'ল, সাধারণত খেলোয়াড়দের কাছ থেকে আপডেট আসে। তবে আপনি এমন একটি আপডেটের প্রয়োজনীয়তার সন্ধান করেছেন যা প্লেয়ার 1 বা প্লেয়ার 2 থেকে আসে না You আপনার এমন একটি আপডেটের প্রয়োজন যা বলবে যে সময় শেষ হয়ে গেছে। কোনও খেলোয়াড়ই এটি বলছে না তাই আপনার কী করা উচিত? প্লেয়ার নাল ছেড়ে যাওয়া এত লোভনীয় মনে হচ্ছে। তবে তথ্য নষ্ট করে দেয়। আপনি ব্ল্যাকহোলে জ্ঞানকে এনকোড করার চেষ্টা করছেন।

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

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

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

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


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

2
@ গাজকম দেখছেন? আমি আপনাকে বলেছি এটি মানুষকে বাগিয়ে দেয়। তবুও প্রতিবার খালি স্ট্রিংটি ব্যবহার করার সময় আপনি যা করছেন ঠিক তা এটি।
candied_orange

16
একটি বৈধ মান আছে যা খালি স্ট্রিং বা সেট হিসাবে ঘটে যখন কী ঘটে?
blrfl

5
যাইহোক @gaazkam, আপনি সংগ্রহে আইটেম আছে কিনা তা পরিষ্কারভাবে পরীক্ষা করে দেখুন না। ফাঁকা তালিকার উপরে লুপিং (বা ম্যাপিং) একটি নিরাপদ ক্রিয়া যা এর কোনও প্রভাব ফেলেনি।
রাবারডাক

3
আমি জানি আপনি নাল ফেরার পরিবর্তে কারও কী করা উচিত সে সম্পর্কে প্রশ্নের উত্তর দিচ্ছেন তবে আমি এই পয়েন্টগুলির সাথে সত্যই একমত নই। তবে আমরা ভাষা নির্দিষ্ট না থাকায় এবং প্রতিটি নিয়মকে ভাঙ্গার কারণ আছে যা আমি ডাউনওয়েট করতে অস্বীকার করি
লিথ

15

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

কীভাবে এই সমস্যাটি আরও ভাল উপায়ে মোকাবেলা করা যায় তা দেখুন।

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

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

একটি স্পষ্ট, জেনেরিক প্রকার যা সম্ভাব্য অনুপস্থিতিকে বোঝায় এটির সাথে মোকাবিলা করার আরেকটি উপায়। যেমন জাভাতে আছে java.util.Optional। এটি কাজ করতে পারে:
একটি প্রকল্প বা সংস্থা পর্যায়ে আপনি বিধি / নির্দেশিকা প্রতিষ্ঠা করতে পারেন

  • কেবলমাত্র উচ্চ-মানের তৃতীয় পক্ষের লাইব্রেরি ব্যবহার করুন
  • সর্বদাjava.util.Optional পরিবর্তে ব্যবহার করুনnull

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


আপনি দয়া করে বিশদভাবে বলতে পারেন, জাভা অপশনগুলি নালদের চেয়ে ভাল কীভাবে? আমি যেমন ডকুমেন্টেশনটি পড়ছি , abচ্ছিক থেকে কোনও মান পাওয়ার চেষ্টা করা যদি একটি অনুপস্থিত থাকে তবে মানটি অনুপস্থিত থাকে; সুতরাং দেখে মনে হবে আমরা একই জায়গায় আছি: একটি চেক করা দরকার এবং আমরা যদি একটিটি ভুলে যাই, আমরা ভুল হয়ে গেছি?
গাজকাম

3
@gaazkam আপনি ঠিক বলেছেন, এটি সংকলন-সাফের সরবরাহ করে না। এছাড়াও, ptionচ্ছিক নিজেই শূন্য হতে পারে, অন্য একটি সমস্যা। তবে এটি সুস্পষ্ট (ভেরিয়েবলের সাথে কেবল সম্ভবত নাল / ডক মন্তব্যের তুলনায়) compared এটি কেবলমাত্র সত্যিকারের সুবিধা দেয় যদি পুরো কোডবাসের জন্য, একটি কোডিং বিধি সেট আপ করা হয়। আপনি জিনিস বাতিল করতে পারবেন না। যদি তথ্য অনুপস্থিত থাকে তবে ptionচ্ছিক ব্যবহার করুন। যে স্পষ্টতই সাক্ষ্য দেয়। সাধারণ নাল-চেকগুলি পরে কল হয়ে যায়Optional.isPresent
মার্সাতাতো

8
@ মার্সাতাতো সাথে নাল চেকগুলি প্রতিস্থাপন করা ptionচ্ছিক isPresent() ব্যবহারের প্রস্তাবিত ব্যবহার নয়
ক্যান্ডিড_আরঞ্জ

10

নাল খারাপ যে বিবৃতিতে আমি কোনও যোগ্যতা দেখছি না। আমি এটি সম্পর্কে আলোচনাগুলি পরীক্ষা করেছিলাম এবং সেগুলি কেবল আমাকে অধৈর্য এবং বিরক্ত করে তোলে।

নালকে "ম্যাজিক মান" হিসাবে ভুল হিসাবে ব্যবহার করা যেতে পারে, যখন এটি আসলে কিছু বোঝায়। তবে সেখানে যাওয়ার জন্য আপনাকে কিছু চমকিত বাঁকানো প্রোগ্রামিং করতে হবে।

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

নাল দিয়ে আপনি রানটাইমটিতে ধাক্কা খেয়ে চলেছেন যেখানে আপনি সংকলন সময়ে ধাক্কায় পড়েছেন কোনও ধরণের টাইপ-সেফ নাল বিকল্পের সাথে।

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

সচেতন হওয়ার জন্য একটি বিষয় রয়েছে। একাধিক-থ্রেড প্রসঙ্গে আপনাকে শূন্যতার জন্য চেক সম্পাদন করার আগে প্রথমে স্থানীয় ভেরিয়েবলকে বরাদ্দ দিয়ে রেস শর্তগুলির বিরুদ্ধে রক্ষা করতে হবে।

নালীর সাথে সমস্যাটি হ'ল এটি অনেক কিছুই বোঝাতে পারে। সুতরাং এটি কেবল তথ্য ধ্বংস করে শেষ করে।

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

সম্পাদনা:

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

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

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


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

3
@ ক্যান্ডিড_আরঞ্জ আপনি যে কোনও alচ্ছিক-প্রকার সম্পর্কে ঠিক একই যুক্তি তৈরি করতে পারেন: Noneউপস্থাপন করে না…।
18-28-2008

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

2
নাল ভুল কারণ আপনার কিছুই করার অর্থ এনকোড করার সুযোগ ছিল। আপনার কিছুই বুঝতে না পারার সাথে সাথে কিছুই হ'ল তাৎক্ষণিকভাবে পরিচালনা করার দাবি রাখে না। 0, নাল, এনএন, খালি স্ট্রিং, খালি সেট, বাতিল, নাল অবজেক্ট, প্রযোজ্য নয়, প্রয়োগ ব্যতিক্রম নয়, অনেকগুলি অনেকগুলি ফর্মের মধ্যে কিছুই আসে না। আপনি এখন যা জানেন তা আপনাকে ভুলতে হবে না কারণ আপনি এখন যা জানেন তা নিয়ে ডিল করতে চান না। আমি যদি আপনাকে -1 এর বর্গমূল নিতে বলি তবে আপনি আমাকে অসম্ভব বলে জানাতে এবং সবকিছু ভুলে যেতে বা কাল্পনিক সংখ্যা আবিষ্কার করতে এবং আপনি যা জানেন সেটি সংরক্ষণ করার জন্য ব্যতিক্রম করতে পারেন।
candied_orange

1
@ মার্টিনম্যাট আপনি এটির মতো শব্দটি তৈরি করেছেন প্রতিবার আপনার প্রত্যাশা লঙ্ঘন করা অবশ্যই একটি ব্যতিক্রম অবশ্যই ছুঁড়ে ফেলবে। এই কেবল সত্য নয়। এর সাথে মোকাবিলা করার জন্য প্রায়শই কোণার মামলা রয়েছে। তাহলে আপনি কি সত্যিই দেখতে পারে না পড়তে এই
candied_orange

7

তোমার প্রশ্ন.

তবে, তবে - আমার নির্দোষ থেকে, আমাকে চিৎকার করতে দিন - কখনও কখনও কোনও মান অর্থপূর্ণভাবে অনুপস্থিত হতে পারে!

আপনার সাথে সেখানে পুরোপুরি যাইহোক, কিছু সাবধানতা রয়েছে যা আমি এক সেকেন্ডের মধ্যে প্রবেশ করব। কিন্তু প্রথম:

নালগুলি মন্দ এবং যখনই সম্ভব এড়ানো উচিত।

আমি মনে করি এটি একটি সুচিন্তিত তবে অত্যধিক জেনারেলাইজড বিবৃতি।

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

তবে আমি বুঝতে পারি না যে নালটি পরীক্ষা করতে ব্যর্থ হওয়া কোনওভাবেই প্রমাণ যে নাল ব্যবহার করা সহজাতভাবে ভুল।

যদি নালটি মন্দ হয় তবে অ্যারে সূচি এবং সি ++ পয়েন্টারগুলিও তাই। তারা না. এগুলির সাহায্যে তারা নিজেকে পায়ে আটকানো সহজ তবে এগুলি কোনও মূল্যে এড়ানো হবে বলে মনে করা হয় না।

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


আপনার সমাধান।

যদিও আমি বিশ্বব্যাপী নিয়ম হিসাবে নাল ব্যবহার সম্পর্কে আপনার মতামতের সাথে একমত; এই বিশেষ ক্ষেত্রে আপনার নাল ব্যবহারের সাথে আমি একমত নই।

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

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

যদি এই আপডেটগুলি অর্থপূর্ণভাবে আলাদা হয় (যা সেগুলি হয়) তবে আপনার দুটি পৃথক আপডেটের প্রয়োজন need

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

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

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

আপনার যুক্তি বহুবর্ষের ভুলের উপর নির্ভর করে। আপনি যদি একটি পদ্ধতি যা ফেরৎ যদি GameUpdateবস্তু, সাধারণভাবে কি কখনো মধ্যে পার্থক্য করতে পরোয়া করা উচিত নয় GameUpdate, PlayerGameUpdateঅথবা NewlyDevelopedGameUpdate

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

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

যেমন সি # টি টাইপ ভাষায় এমনকি না অনুমতি দেয় আপনি চেষ্টা এবং অ্যাক্সেস করতে Playerএকটি সম্পত্তির GameUpdateকারণ GameUpdateকেবল সম্পত্তি নেই। জাভাস্ক্রিপ্ট এর পদ্ধতির তুলনায় যথেষ্ট বেশি শিথিল (এবং এটি পূর্বনির্মাণের প্রয়োজন হয় না) সুতরাং এটি আপনাকে সংশোধন করতে বিরক্ত করে না এবং পরিবর্তে রানটাইম এ এটি ফুরিয়ে যায়।

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

অযোগ্য বৈশিষ্ট্য সংযোজনের ভিত্তিতে আপনার ক্লাস তৈরি করা উচিত নয়। গেম আপডেটের কার্যত অনন্য প্রকারের ভিত্তিতে আপনার ক্লাস তৈরি করা উচিত ।


সাধারণভাবে নাল দিয়ে সমস্যাগুলি কীভাবে এড়ানো যায়?

আমি মনে করি যে আপনি কীভাবে কোনও মূল্যবোধের অনুপস্থিতি অর্থপূর্ণভাবে প্রকাশ করতে পারেন সে সম্পর্কে বিস্তারিতভাবে প্রাসঙ্গিক বলে মনে করি। এটি কোনও নির্দিষ্ট ক্রমে সমাধানের (বা খারাপ পদ্ধতির) সংগ্রহ।

1. যাইহোক নাল ব্যবহার করুন।

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

২. একটি নন-নাল অর্থহীন মান ব্যবহার করুন

একটি সাধারণ উদাহরণ এখানে indexOf():

"abcde".indexOf("b"); // 1
"abcde".indexOf("f"); // -1

পরিবর্তে null, আপনি পেতে -1। প্রযুক্তিগত স্তরে, এটি একটি বৈধ পূর্ণসংখ্যার মান। তবে সূচকগুলি ধনাত্মক পূর্ণসংখ্যার হিসাবে প্রত্যাশিত বলে একটি নেতিবাচক মান হ'ল অযৌক্তিক উত্তর।

যৌক্তিকভাবে, এটি কেবলমাত্র সেই ক্ষেত্রে ব্যবহৃত হতে পারে যেখানে রিটার্নের ধরণটি যথাযথরূপে প্রত্যাবর্তনের চেয়ে আরও বেশি সম্ভাব্য মানগুলির মঞ্জুরি দেয় (indexOf = ইতিবাচক পূর্ণসংখ্যা; int = নেতিবাচক এবং ধনাত্মক পূর্ণসংখ্যার)

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

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

৩. পরিবর্তে একটি ব্যতিক্রম নিক্ষেপ করুন।

না কিছু না. যৌক্তিক প্রবাহের জন্য ব্যতিক্রমগুলি পরিচালনা করা উচিত নয়।

বলা হচ্ছে, এমন কিছু মামলা রয়েছে যেখানে আপনি (নালারফেরেন্স) ব্যতিক্রমটি গোপন করতে চান না, বরং একটি উপযুক্ত ব্যতিক্রম দেখান। উদাহরণ স্বরূপ:

var existingPerson = personRepository.GetById(123);

PersonNotFoundExceptionযখন আইডি 123 সহ কোনও ব্যক্তি নেই তখন এটি (বা অনুরূপ) ফেলে দিতে পারে ।

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


5

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


হ্যাঁ! সমস্যাটি একটি অযৌক্তিক ডিফল্ট।
Deduplicator

আমি একমত নই এমন শৈলীতে প্রোগ্রামিং যা নালকে এড়ায় কম রেফারেন্স ভেরিয়েবলগুলি নাল হয়ে যায়, যার ফলে কম রেফারেন্স ভেরিয়েবলগুলি নাল হওয়া উচিত নয়। এটি 100% নয় তবে এটি 90% হতে পারে, এটি আইএমওর পক্ষে মূল্যবান।
মনিকা 19

1

নালগুলি মন্দ নয়, বাস্তবের বাস্তবতার কোনও উপায় নেই যে কোনও স্থানে শূন্যতার মতো দেখায় এমন কিছু করার ছাড়াই বিকল্পগুলির কোনও প্রয়োগ করার উপায় নেই।

নালগুলি তবে বিপজ্জনক । ঠিক তেমন কোনও অন্য নিম্ন স্তরের কনস্ট্রাক্টের মতোই যদি ভুল হয়ে যায় তবে আপনাকে ধরার জন্য নীচের কিছুই নেই।

আমি মনে করি নাল বিরুদ্ধে অনেক বৈধ যুক্তি আছে:

  • এটি যদি আপনি ইতিমধ্যে একটি উচ্চ স্তরের ডোমেনে থাকেন তবে নিম্ন-স্তরের মডেলটি ব্যবহার করার চেয়ে নিরাপদ নিদর্শন রয়েছে।

  • আপনার যদি নিম্ন-স্তরের সিস্টেমের সুবিধার প্রয়োজন না হয় এবং উপযুক্ত সতর্ক হতে প্রস্তুত না হন তবে আপনি সম্ভবত নিম্ন-স্তরের ভাষা ব্যবহার করবেন না।

  • ইত্যাদি ...

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

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


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

1
@ নিকলবোলাস, আপনি ঠিক বলেছেন, তবে মূল উত্সটি বেশিরভাগ লোকের উদ্ধৃত পরামর্শ নয়, এটি রিলেড বার্তা। আমি যে বক্তব্যটি তৈরি করতে চেয়েছিলাম তা কেবল এটি ছিল যে প্রচুর প্রোগ্রামারদের বলা হয়েছে 'কখনই এক্স করবেন না, এক্স খারাপ / খারাপ / যাই হোক না কেন' এবং, ঠিক যেমনটি আপনি বলেছেন, এটি প্রচুর পরিমাণে অনুপস্থিত comes সম্ভবত তাদের বাদ দেওয়া হয়েছে, সম্ভবত তারা কখনও উপস্থিত ছিল না, শেষ ফলাফলটি একই।
drjpizzle

0

জাভার একটি Optionalক্লাস রয়েছে স্পষ্টভাবেifPresentযে কোনও মান নিরাপদে অ্যাক্সেস করতে + ল্যাম্বদা । এটি জেএসেও তৈরি করা যেতে পারে:

দেখুন এই Stackoverflow প্রশ্ন

যাইহোক, অনেক খাঁটিবাদী এই ব্যবহারটিকে সন্দেহজনক দেখতে পাবেন তবে আমি তা মনে করি না। .চ্ছিক বৈশিষ্ট্য বিদ্যমান।


একটি রেফারেন্স খুব java.lang.Optionalহতে পারে nullনা?
উত্সাহক

@ ডিডুকিপেটর নং, Optional.of(null)একটি ব্যতিক্রম ছুঁড়ে মারবে - Optional.ofNullable(null)দিবে Optional.empty()না - মান।
জোপ এগজেন

আর Optional<Type> a = null?
Deduplicator

@ অনুচ্ছেদে সত্য, তবে সেখানে আপনার ব্যবহার করা উচিত Optional<Optional<Type>> a = Optional.empty();;) - জেএসে অন্য কথায় (এবং অন্যান্য ভাষায়) এই জাতীয় জিনিসগুলি ব্যবহার্য হবে না। ডিফল্ট মান সহ স্কেল করতে হবে। জাভা হয়ত কোনও এনামের সাথে। জাতীয় আমার সন্দেহ: Optional<Type> a = Optional.empty();
জোপ এগেন

সুতরাং, আমরা একটি ইন্ডিরিশন এবং সম্ভাব্য nullবা খালি থেকে দুটো প্লাসকে ইন্টারপোজড অবজেক্টে কিছু অতিরিক্ত পদ্ধতিতে স্থানান্তরিত করেছি । এটি বেশ একটি অর্জন।
Deduplicator

0

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

যে ভাষাগুলি তার ভুলটির পুনরাবৃত্তি করে তার নাল দিয়ে সমস্যা হ'ল আপনি বলতে পারবেন না যে কোনও ফাংশন অ-ননযোগ্য ডেটা আশা করে; এটি ভাষাতে মৌলিকভাবে অবিশ্বাস্য। এটি ফাংশনগুলিকে প্রচুর অকেজো এক্সটেনারাস নাল হ্যান্ডলিং বয়লারপ্লেট অন্তর্ভুক্ত করতে বাধ্য করে এবং নাল চেকটি ভুলে যাওয়া বাগগুলির একটি সাধারণ উত্স।

অভিব্যক্তির সেই মৌলিক অভাবটি ঘটাতে কিছু সম্প্রদায় (যেমন: স্কালা সম্প্রদায়) নাল ব্যবহার করে না। স্কালায়, আপনি যদি প্রকারের একটি অবর্ণনীয় মান চান T, আপনি টাইপের একটি যুক্তি গ্রহণ করেন Option[T]এবং আপনি যদি একটি অ-মানযোগ্য মান চান তবে আপনি কেবল একটি নিন T। যদি কেউ আপনার কোডটিতে একটি নাল পাস করে তবে আপনার কোডটি ফুরিয়ে যাবে। তবে, এটি বিবেচনা করা হয় যে কলিং কোডটি বগি কোড। Optionনাল জন্য একটি দুর্দান্ত সুন্দর প্রতিস্থাপন, যদিও, সাধারণ নাল হ্যান্ডলিং নিদর্শন .map(f)বা মত লাইব্রেরি ফাংশন এ বের করা হয় .getOrElse(someDefault)

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