মোংগোডিবি জাভা ড্রাইভার শর্তাধীন কেন এলোমেলো নম্বর জেনারেটর ব্যবহার করে?


211

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

if (!((_ok) ? true : (Math.random() > 0.1))) {
    return res;
}

(সম্পাদনা: এই প্রশ্নটি পোস্ট করার পরে কোডটি আপডেট করা হয়েছে )


13
এর কোন অংশ আপনাকে বিভ্রান্ত করছে?
অলিভার চার্লসওয়ার্থ

4
আমি মনে করি এটি বিভ্রান্তিকর এই কোডটি একটি ক্যাচ ব্লকে কার্যকর করা হয়!
Proviste

11
@ মার্কো টপলনিক: তাই না? এটি if (!ok || Math.random() < 0.1)(বা অনুরূপ কিছু) হিসাবে আরও স্পষ্টভাবে লেখা যেতে পারে ।
অলিভার চার্লসওয়ার্থ

5
github.com/mongodb/mongo-java-driver/commit/… আপনি প্রথমে নন, সেই লাইনে কমেন্ট দেখুন
এমসানজেল

3
@ ম্যাসাঙ্গেল এই ছেলেরা কোডিং শৈলী নয়, যুক্তির সমালোচনা করছে বলে মনে হচ্ছে।
মার্কো টপলনিক

উত্তর:


279

সেই লাইনের ইতিহাস পর্যালোচনা করার পরে, আমার মূল উপসংহারটি হল যে কর্মক্ষেত্রে কিছু অযোগ্য প্রোগ্রামিং হয়েছে।

  1. এই লাইনটি অকৃত্রিমভাবে সংশ্লেষিত। সাধারণ ফর্ম

    a? true : b

    জন্য boolean a, bসহজ সমতুল্য

    a || b
  2. আশেপাশের অবহেলা এবং অতিরিক্ত বন্ধনী বিষয়গুলিকে আরও দৃolute় করে তোলে। মনে রাখা ডি মরগান আইন এটি একটি তুচ্ছ পর্যবেক্ষণ যে কোড এই টুকরা পরিমাণ হয়

    if (!_ok && Math.random() <= 0.1)
      return res;
  3. প্রতিশ্রুতিবদ্ধ যে এই যুক্তিটির মূলত পরিচয় করেছিল

    if (_ok == true) {
      _logger.log( Level.WARNING , "Server seen down: " + _addr, e );
    } else if (Math.random() < 0.1) {
      _logger.log( Level.WARNING , "Server seen down: " + _addr );
    }

    অপদার্থের -another উদাহরণ কোডিং কিন্তু লক্ষ্য বিপরীত যুক্তিবিজ্ঞান : এখান ঘটনা লগ করা হয় যদি পারেন _okবা অন্যান্য ক্ষেত্রে 10% এ, 2. কোড যেহেতু আয় কাল ও লগ সময়ের 90% 10%। সুতরাং পরবর্তী প্রতিশ্রুতি কেবল স্পষ্টতাই নয়, নিজেই সঠিকতা নষ্ট করেছিল।

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

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

আমি কেবলমাত্র আশা করতে পারি যে কেবলমাত্র তিন লাইন কোডের পরিদর্শন থেকে সংগৃহীত অযোগ্যতার এই সমস্ত প্রমাণ পুরোপুরি এই প্রকল্পটির বিষয়ে মোটামুটি কথা বলবে না এবং এই টুকরোটি কাজটি ASAP সাফ হয়ে যাবে।


26
অতিরিক্ত হিসাবে এটি প্রদর্শিত হবে, যতদূর আমি বলতে পারি, মোঙ্গোডিবি-র অফিসিয়াল 10gen জাভা ড্রাইভার তাই জাভা ড্রাইভার সম্পর্কে মতামত ছাড়াও, আমি মনে করি এটি আমাকে মঙ্গোডিবি
ক্রিস ট্র্যাভার্স

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

1
@ChrisTravers এটা হয় মোঙ্গো জন্য অফিসিয়াল মোঙ্গো জাভা ড্রাইভার।
Assylias

17

https://github.com/mongodb/mongo-java-driver/commit/d51b3648a8e1bf1a7b7886b7ceb343064c9e2225#commitcomment-3315694

11 ঘন্টা আগে গ্যারেথ-রিস দ্বারা:

সম্ভবত কাউন্টার বা টাইমার বজায় রাখার ব্যয় ব্যতীত সার্ভার ব্যর্থতার প্রায় 1/10 টি লগ করা (এবং তাই লগকে ব্যাপকভাবে স্প্যামিং এড়ানোর জন্য) ধারণা করা যেতে পারে। (তবে অবশ্যই টাইমার বজায় রাখা সাশ্রয়ী হবে?)


13
নীটপিকের জন্য নয় তবে: 1/10 তম সময় এটি পুনরায় ফিরে আসবে, সুতরাং এটি অন্যান্য 9-10 বার লগ করবে।
সুপ্রাইস

23
@ সুপেরিসি এটি অবশ্যই নিটপিকিং নয়। এটি এই ব্যক্তির ভয়ানক কোডিং অনুশীলনের আরও প্রমাণ।
আনোরভ 31'13

7

নেগেটিভ 1 এ আরম্ভ করা একটি শ্রেণীর সদস্য যুক্ত করুন:

  private int logit = -1;

চেষ্টা ব্লকে, পরীক্ষাটি করুন:

 if( !ok && (logit = (logit + 1 ) % 10)  == 0 ) { //log error

এটি সর্বদা প্রথম ত্রুটি লগ করে, তারপরে প্রতি দশম পরবর্তী ত্রুটি। লজিকাল অপারেটরগুলি "শর্ট সার্কিট", সুতরাং লজিট কেবল একটি আসল ত্রুটিতে বৃদ্ধি পায়।

আপনি যদি সংযোগ নির্বিশেষে সমস্ত ত্রুটিগুলির প্রথম এবং দশম চান , আ সদস্যের পরিবর্তে লজিট শ্রেণি স্থির করুন।

যেমনটি উল্লেখ করা হয়েছিল যে এটি থ্রেডটি নিরাপদ হওয়া উচিত:

private synchronized int getLogit() {
   return (logit = (logit + 1 ) % 10);
}

চেষ্টা ব্লকে, পরীক্ষাটি করুন:

 if( !ok && getLogit() == 0 ) { //log error

দ্রষ্টব্য: আমি মনে করি না যে 90% ত্রুটিগুলি ফেলে দেওয়া ভাল ধারণা।


1

আমি এই ধরণের জিনিস আগেও দেখেছি।

কোডের একটি অংশ ছিল যা নির্দিষ্ট 'প্রশ্নের' জবাব দিতে পারে যা অন্য একটি 'ব্ল্যাক বক্স' কোডের টুকরো থেকে এসেছে। যদি এটি তাদের উত্তর না দিতে পারে তবে এটি তাদের 'ব্ল্যাক বক্স' কোডের অন্য একটি অংশে পাঠিয়ে দেবে যা সত্যই ধীর ছিল।

তাই কখনও কখনও পূর্বে অদেখা নতুন নতুন 'প্রশ্ন' দেখানো হত এবং তারা তাদের মধ্যে 100 টির মতো এক ব্যাচে প্রদর্শিত হত।

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

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

যেহেতু লগগুলি খুব বড় হয়ে উঠছিল, এবং লগিং এই সমাধানটিতে আসল গুরুত্বপূর্ণ জিনিসগুলিকে লগ করার পথে আসছিল:

কেবল একটি এলোমেলো 5% লগইন করুন, এটি লগগুলি সাফ করবে, দীর্ঘমেয়াদে এখনও কোন প্রশ্ন / উত্তর যুক্ত হতে পারে তা দেখায়।

সুতরাং, যদি কোনও অজানা ঘটনা ঘটে থাকে তবে এগুলির একটি এলোমেলো পরিমাণে, এটি লগ করা হবে।

আমি মনে করি এটি এখানে আপনি যা দেখছেন তার সাথে মিল রয়েছে।

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


3
আমরা এখানে একটি ডাটাবেস ড্রাইভারের কথা বলছি ... ভুল সমস্যার জায়গা, আইএমও ছাড়া!
স্টিভেন শ্লানস্কার

@ স্টিভেনশ্ল্যাঙ্কার আমি কখনও বলিনি যে এটি একটি ভাল অনুশীলন was আমি এই টুকরা কোডটি সরিয়ে দিয়েছি এবং এই বার্তাগুলিকে অন্য কোনও ফাইলে লগ করেছি।
জেনস টিমারম্যান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.