পড়ার যোগ্যতা উন্নত করতে "ব্যতিক্রম ধরা" ব্যবহার করছেন, ভাল না খারাপ?


9

বিভাগে যখন না ব্যবহার ব্যতিক্রম মধ্যে বাস্তবমুখী প্রোগ্রামার , বই লিখেছেন পরিবর্তে যে:

retcode = OK;
     if (socket.read(name) != OK) {
      retcode = BAD_READ;
    }
     else {
      processName(name);
       if (socket.read(address) != OK) {
        retcode = BAD_READ;
      }
       else {
        processAddress(address);
         if (socket.read(telNo) != OK) {
          retcode = BAD_READ;
        }
         else {
          //  etc, etc...
        }
      }
    }
     return retcode;

, তারা পছন্দ:

 retcode = OK;
     try {
      socket.read(name);
      process(name);
      socket.read(address);
      processAddress(address);
      socket.read(telNo);
      //  etc, etc...
    }
     catch (IOException e) {
      retcode = BAD_READ;
      Logger.log( "Error reading individual: " + e.getMessage());
    }
     return retcode;

এটি আরও সুন্দর দেখায় কারণ আমি সবই নীটার কোডের জন্য আছি , তবে ব্যতিক্রমকে অপ্রয়োজনীয়ভাবে ধরা কোনও পারফরম্যান্সের বাধা নয়?

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

বা বরং, আপনি কোন কোড পছন্দ করবেন?


কোড পর্যালোচনা থেকে স্থানান্তরিত হয়েছে কারণ এটি একটি সেরা-অনুশীলন প্রশ্ন নয় যা কোড পুনর্বিবেচনার প্রশ্ন
উইনস্টন এওয়ার্ট

1
আইএমও, যদি তোমরা আশা করছি সকেট থেকে যারা valuse পড়তে পাবে, তারপর IOEx হয় ব্যতিক্রমী।
স্টিভেন ইভার্স


আপনি কি পরিমাপ করেছেন?

@ থরবজরন রাভানএন্ডারসেন অবশ্যই আমি বইটি পড়ছিলাম এবং পরিমাপের জন্য সত্যিকারের "টেস্ট কেস" নেই .. তবে আমরা যদি এটি কোনও অনুমোদিত কোডে পরিমাপ করি তবে স্পষ্টতই একটি পারফরম্যান্স পেনাল্টি রয়েছে
পেসারিয়ার

উত্তর:


18

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

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


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

বিটিডব্লু আমি ভাবছিলাম যে ডকস.অরাকল.com/javase/tutorial/essential/io/datastreams.html এ প্রদর্শিত হিসাবে আমরা EOFExceptionটি কীভাবে ন্যায়সঙ্গত করব যা ডাটা স্ট্রিমগুলি লাইনের একটি শেষ সনাক্ত করতে ব্যবহার করে (লাইনের শেষটি ব্যতিক্রমী নয়) ?
পেসারিয়ার

@ পেসারিয়ার, এটি ব্যতিক্রমী হতে পারে। লাইনে ইনপুট শেষ না হওয়া খারাপ ডেটা বা মারাত্মকভাবে ভুল কিছু হতে পারে indicate আমার সন্দেহ হয় যে উদ্দেশ্যটি ব্যবহারটি হ'ল একটি লাইন ছাড়িয়ে বেশ কয়েকটি ক্ষেত্র পার্স করা।
উইনস্টন ইওয়ার্ট

@ ডাউনভোটার, আপনার যদি উত্তর নিয়ে সমস্যা হয় তবে দয়া করে ব্যাখ্যা করুন!
উইনস্টন ইওয়ার্ট

5

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

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

এটি একটি পারফরম্যান্স বাধা কিনা তা নিশ্চিত করার জন্য, কিছু প্রোফাইলিং করুন, এবং বিশ্লেষণ করুন এবং সেই বিশ্লেষণের উপর ভিত্তি করে আরও জটিল কাজগুলিতে মনোনিবেশ করুন।


5

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

আপনি কোথা থেকে জানেন? আপনি "লক্ষণীয় বিলম্ব" কীভাবে সংজ্ঞায়িত করবেন?

এটি হ'ল ধরণের অস্পষ্টতা (এবং পুরোপুরি ভুল) পারফরম্যান্সের পৌরাণিক কাহিনী যা অকেজো অকাল অনুকূলকরণের দিকে নিয়ে যায়।

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


আমি .NET থেকে আসা তাই জাভার আমার জ্ঞান ক্ষমা, কিন্তু আমি ব্যক্তিগতভাবে উন্মাদ বিলম্ব (সেকেন্ড মাত্রার) যা সরানোর দ্বারা নির্ধারিত হয় যার ফলে .NET ইন ব্যতিক্রম সংক্রামক অভিজ্ঞতা আছে "সংক্রামক-ব্যতিক্রম কোড" ..
Pacerier

@ পেসারিয়ার, সিরিয়াসলি? সেকেন্ডের আকার? আমার ধারণা সম্ভবত এটি ব্যতিক্রম প্রচুর ছিল? তখন আমি তা দেখতে পেতাম।
উইনস্টন ইওয়ার্ট

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

5

আপনি ইতিমধ্যে যে উত্তরগুলি পেয়েছেন তা আমি একমত হয়েছি যে এটি একটি ব্যতিক্রমী মামলা, সুতরাং ব্যতিক্রম হ্যান্ডলিংটি ব্যবহার করার পক্ষে যুক্তিযুক্ত।

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

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

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

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

নীচের লাইন: এমন কিছু ক্ষেত্রে রয়েছে যেখানে ব্যতিক্রমগুলি ওভারহেড পরিচালনা করা তাৎপর্যপূর্ণ হতে পারে তবে এটি অবশ্যই তাদের মধ্যে একটি নয়

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