কখন এবং কেন আপনার অকার্যকর ব্যবহার করা উচিত (উদাহরণস্বরূপ বুল / ইনট এর পরিবর্তে)


30

আমি মাঝে মধ্যে এমন পদ্ধতিতে দৌড়ে যাই যেখানে কোনও বিকাশকারী কোনও জিনিস ফাংশনটির পক্ষে সমালোচনা না করে এমনটি ফিরিয়ে দিতে পছন্দ করে। আমি বলতে চাইছি কোডটি দেখার সময় এটি দৃশ্যত ঠিক তেমন সুন্দরভাবে কাজ করে voidএবং কিছুক্ষণ চিন্তাভাবনার পরে, আমি জিজ্ঞাসা করি "কেন?" এই শব্দটি কি পরিচিত?

মাঝে মাঝে আমি যে একমত হবে প্রায়শই এটা ভাল একটি ভালো কিছু ফেরত দিতে boolবা int, বরং তারপর শুধু একটি না void। আমি নিশ্চিত না যদিও বড় ছবিতে, কুফলগুলি সম্পর্কে।

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

অন্য দিকে,

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

এটি দিয়ে আপনার অভিজ্ঞতাগুলি কী? আপনি এই কিভাবে অভিনয় করবে?


1
একটি ফাংশন যা অকার্যকর ফিরে আসে প্রযুক্তিগতভাবে কোনও ফাংশন নয়। এটি কেবল একটি পদ্ধতি / পদ্ধতি। voidকমপক্ষে ফিরে আসা বিকাশকারীকে জানতে দেয় যে পদ্ধতির ফেরতের মানটি অপ্রয়োজনীয়; এটি কোনও মান গণনা করার পরিবর্তে একটি ক্রিয়া করে।
কেচালাক্স

উত্তর:


32

কোনও পদ্ধতির সাফল্য বা ব্যর্থতা নির্দেশ করার জন্য বুল রিটার্ন মানের ক্ষেত্রে, আমি Try। নেট পদ্ধতিতে বিভিন্ন ক্ষেত্রে ব্যবহৃত-প্রিফিক্স দৃষ্টান্ত পছন্দ করি ।

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


4
প্রত্যাশিত এবং অপ্রত্যাশিত ব্যর্থতাগুলির সাথে ডিলের মধ্যে পার্থক্য তৈরি করার জন্য +1 - আমার নিজের উত্তর এটিকে যথেষ্ট জোর দেয়নি।
প্যাটার তুরাক

ট্রাইএক্সএক্স পদ্ধতির জন্য একটি নীতি আবিষ্কার করার চেষ্টা করার জন্য একেবারে একটি +1 যা স্পষ্টতই চেষ্টা করার পদ্ধতি এবং মূল পদ্ধতি উভয়কে বজায় রাখা সহজ এবং তাদের উদ্দেশ্য বুঝতে সহজতর করে তোলে।
স্বতন্ত্র

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

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

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

28

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

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

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


4
স্থিতি কোডের চেয়ে ব্যতিক্রমগুলির জন্য +1। এটির ব্যতিক্রম (খারাপ শোধ করার উদ্দেশ্যে) হ'ল ব্যবহৃত ট্রাইএক্সএক্স প্যাটার্ন।
অ্যান্ডি লোরি

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

+1 অতিরিক্ত তথ্য হ'ল কেন আমি সি # এর মতো উচ্চ-স্তরের ভাষায় এই জাতীয় পদ্ধতিগুলি কোড করি। এটি যখন আপনার প্রয়োজন হয় অতিরিক্ত তথ্য ব্যবহার করা সহজ করে তোলে।
ashes999

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

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

14

পিটারের উত্তর ব্যতিক্রমগুলি ভালভাবে কভার করে। এখানে অন্যান্য বিবেচনা কমান্ড-কোয়েরি পৃথককরণ জড়িত

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

কয়েকটি ক্ষেত্রে সিকিউএস নীতি লঙ্ঘন করা একটি ভাল ধারণা। এগুলি সাধারণত কর্মক্ষমতা বা থ্রেড সুরক্ষার আশেপাশে থাকে।


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

আহ কিন্তু কমান্ড দ্বারা প্রভাবিত সারি সংখ্যা পুরানোগুলি থেকে নতুন কমান্ড তৈরি করা আরও সহজ করে তোলে। উত্স: বছরের অভিজ্ঞতা এবং বছর।
জোশুয়া

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

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

3

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


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

1

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


1
পদ্ধতি শৃঙ্খলা উত্তরাধিকারসূত্রে জটিল এবং কঠিন করে তুলতে পারে। আপনার পদ্ধতিগুলিকে "অকার্যকর" না দিতে চাওয়া ব্যতীত অন্য কোনও কারণ করার উপযুক্ত কারণ না থাকলে আমি পদ্ধতিটিতে শৃঙ্খলাবদ্ধ না করব।
ক্যালড্রেক্সিক্স

সত্য। কিন্তু উত্তরাধিকার জটিল এবং ব্যবহার করা কঠিন হতে পারে।
ওয়াইয়াট বার্নেট

কোনও অজানা কোডের দিকে তাকানো যা কিছু ফিরে আসে (পুরো বস্তুর উল্লেখ রয়েছে) কেবলমাত্র মনোযোগ দেয় কেবল অভ্যন্তরীণ এবং বাইরের পদ্ধতিগুলি পরীক্ষা করে ..
স্বাধীন

আমি মনে করি না আপনি Rubyকোন সময় প্রবেশ করেছেন? এটিই আমাকে পদ্ধতিতে শৃঙ্খলার সাথে পরিচয় করিয়ে দেয়।
কেচালাক্স

পদ্ধতি শৃঙ্খলাবদ্ধতার সাথে আমার একটি কোয়ামটি হ'ল এটি এটিকে কম স্পষ্ট করে তোলে যে মতামতটি কোনও মূলটির সাথে কোনও রেফারেন্স return Thing.Change1().Change2();পরিবর্তনের Thingএবং প্রত্যাবর্তনের প্রত্যাশা করে, বা প্রত্যাশা করা হয় যে কোনও নতুন জিনিসের সাথে একটি রেফারেন্স প্রত্যাবর্তিত হবে যখন ছেড়ে যাওয়ার সময় আসল অস্পৃশ্য।
সুপারক্যাট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.