পরে এটি ব্যবহার করতে কোনও লুপে একটি পতাকা সেট করা কি কোডের গন্ধ?


30

আমার একটি কোডের টুকরো রয়েছে যেখানে আমি কোনও শর্তটি সঠিক না হওয়া পর্যন্ত মানচিত্রের পুনরাবৃত্তি করি এবং তারপরে পরে আরও কিছু জিনিস করার জন্য সেই শর্তটি ব্যবহার করি।

উদাহরণ:

Map<BigInteger, List<String>> map = handler.getMap();

if(map != null && !map.isEmpty())
{
    for (Map.Entry<BigInteger, List<String>> entry : map.entrySet())
    {
        fillUpList();

        if(list.size() > limit)
        {
            limitFlag = true;
            break;
        }
    }
}
else
{
    logger.info("\n>>>>> \n\t 6.1 NO entries to iterate over (for given FC and target) \n");
}

if(!limitFlag) // Continue only if limitFlag is not set
{
    // Do something
}

আমি একটি পতাকা নির্ধারণ করছি এবং তারপরে আরও স্টাফ করার জন্য এটি ব্যবহার করা কোডের গন্ধ।

আমি কি সঠিক? আমি কীভাবে এটি সরিয়ে ফেলতে পারি?


10
আপনি কেন এটি একটি কোড গন্ধ অনুভব করেন? এটি কোনও পৃথক কাঠামোর অধীনে না ঘটলে আপনি কোন নির্দিষ্ট সমস্যাগুলির পূর্বাভাস দিতে পারেন?
বেন কটরেল

13
@ gnasher729 কৌতূহলের বাইরে, আপনি এর পরিবর্তে কোন শব্দটি ব্যবহার করবেন?
বেন কটরেল

11
-1, আপনার উদাহরণটি কোনও অর্থ দেয় না। entryফাংশন লুপের ভিতরে কোথাও ব্যবহৃত হয় না এবং আমরা কী অনুমান করতে পারি তা listকেবল। হয় fillUpListভরাট অনুমিত list? এটি পরামিতি হিসাবে কেন পায় না?
ডক ব্রাউন

13
আমি আপনার সাদা স্থান এবং খালি লাইনের ব্যবহার নিয়ে পুনর্বিবেচনা করব
ড্যানিয়েল জোর

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

উত্তর:


70

বুলিয়ান মানকে তার উদ্দেশ্যযুক্ত উদ্দেশ্যে ব্যবহার করার ক্ষেত্রে কোনও ভুল নেই: বাইনারি পার্থক্য রেকর্ড করার জন্য।

যদি আমাকে এই কোডটি রিফ্যাক্টর করতে বলা হয়, আমি সম্ভবত লুপটিকে তার নিজস্ব কোনও পদ্ধতিতে রেখে দেব যাতে অ্যাসাইনমেন্টটি + এ breakপরিণত হয় return; তবে আপনার এমনকি কোনও ভেরিয়েবলের প্রয়োজন নেই, আপনি কেবল বলতে পারেন

if(fill_list_from_map()) {
  ...

6
আসলে তার কোডের গন্ধটি দীর্ঘ ফাংশন যা ছোট ফাংশনে বিভক্ত হওয়া দরকার। আপনার পরামর্শটি যাওয়ার উপায়।
বার্নহার্ড হিলার

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

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

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

6
ক্লিন কোডের 45 নম্বর পৃষ্ঠায় চাচা বব বলেছেন : "ফাংশনগুলি হয় কিছু করে বা কিছু উত্তর দেয়, তবে উভয়ই হয় না ither হয় আপনার ফাংশনটি কোনও বস্তুর অবস্থার পরিবর্তন করা উচিত, অথবা এটি সেই বস্তুর সম্পর্কে কিছু তথ্য ফিরিয়ে আনতে হবে। উভয়টিই প্রায়শই বাড়ে to বিভ্রান্তির। "
সিজে ডেনিস

25

এটি অগত্যা খারাপ নয়, এবং কখনও কখনও এটি সেরা সমাধান হয়। কিন্তু নেস্টেড ব্লক ভালো পতাকা সেটিং করতে কোড অনুসরণ করা কঠিন আছে।

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


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

1
@ সিদ্ধার্থ ত্রিখা: এটা বলা শক্ত যেহেতু কোডটি আসলে কী করার কথা তা আমি জানি না। আপনি যদি কেবলমাত্র মানচিত্রে কমপক্ষে একটি আইটেম সীমাবদ্ধতার চেয়ে বড় তালিকাবদ্ধ কিনা তা খতিয়ে দেখতে চান তবে আমি মনে করি আপনি এটি কোনও একক মিলের অভিব্যক্তি দিয়ে করতে পারেন।
জ্যাকবিবি 22'18

2
@ সিদ্ধার্থ ত্রিখা: স্কোর সমস্যাটি প্রাথমিক পরীক্ষার প্রহরী দফায় পরিবর্তন করে সহজেই সমাধান করা যেতে পারে if(map==null || map.isEmpty()) { logger.info(); return;}তবে এটি কেবল তখনই কাজ করবে যখন আমরা দেখি কোডটি কোনও ফাংশনের পূর্ণাঙ্গ // Do somethingঅংশ , এবং মানচিত্রের ক্ষেত্রে অংশটির প্রয়োজন নেই নাল বা খালি।
ডক ব্রাউন

14

আমি 'কোড গন্ধ' সম্পর্কে যুক্তি বিরুদ্ধে পরামর্শ দিতে চাই। এটি আপনার নিজের পক্ষপাতদুষ্টিকে যৌক্তিক করার সহজতম উপায়। সময়ের সাথে সাথে আপনি প্রচুর পক্ষপাত বিকাশ করতে পারবেন এবং তাদের মধ্যে অনেকগুলি যুক্তিসঙ্গত হবে তবে তাদের মধ্যে অনেকগুলি বোকা হবে।

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

"কোড গন্ধ পাচ্ছি" যখন আপনার জন্য নেই চিন্তা। আপনি যদি কোডটি সম্পর্কে সত্যিই ভাবতে চলেছেন, তবে এটি সঠিকভাবে করুন!

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

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

অন্যদিকে, যদি "// কিছু কিছু করুন" কোডটি খুব সহজ হয়, তবে এটি ifপতাকা নির্ধারণের পরিবর্তে এটিকে ব্লকের ভিতরে রাখলে আরও বুদ্ধিমান হতে পারে । এটি প্রভাবটিকে কারণের কাছাকাছি রাখে এবং পতাকাটি আপনার নির্ধারিত মানটি ধরে রাখে তা নিশ্চিত করার জন্য পাঠককে বাকী কোডটি স্ক্যান করতে হবে না।


5

হ্যাঁ, এটি একটি কোড গন্ধ (এটি করে এমন প্রত্যেকের কাছ থেকে সংকেত নেমে আসে)।

আমার জন্য মূল জিনিসটি হ'ল ব্যবহার break বিবৃতিটি । আপনি যদি এটি ব্যবহার না করেন তবে আপনি প্রয়োজনের চেয়ে বেশি আইটেমগুলি নিয়ে পুনরাবৃত্তি করতে পারবেন তবে এটি ব্যবহার করে লুপ থেকে দুটি সম্ভাব্য প্রস্থান পয়েন্ট দেয়।

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

কোডটি আপনার উদাহরণের মতো সহজ হলে এটি কমে যেতে পারে while লুপ বা সমমানের মানচিত্র, ফিল্টার নির্মাণে ।

পতাকাগুলি এবং বিরতিগুলির প্রয়োজনের জন্য কোডটি যখন জটিল পর্যাপ্ত হয় তখন এটি বাগের ঝুঁকিতে পড়বে।

সমস্ত কোডের গন্ধ মতো: আপনি যদি কোনও পতাকা দেখতে পান তবে এটির সাথে একটিটি প্রতিস্থাপনের চেষ্টা করুন while। যদি আপনি না পারেন তবে অতিরিক্ত ইউনিট পরীক্ষা যুক্ত করুন।


আমার কাছ থেকে +1 এটি নিশ্চিতভাবে একটি কোডের গন্ধ এবং আপনি কেন এবং কীভাবে এটি পরিচালনা করবেন তা ভাল করে জানান।
ডেভিড আরনো

@ ইভান: SO as with all code smells: If you see a flag, try to replace it with a whileআপনি কি উদাহরণ দিয়ে এটিকে বিস্তারিত বলতে পারবেন?
সিদ্ধার্থ ত্রিখা 11

2
লুপ থেকে একাধিক বহির্গমন পয়েন্ট থাকার কারণে এটি যুক্তিযুক্ত হতে আরও কঠিন হতে পারে, তবে এই ক্ষেত্রে এটি লুপের শর্তটিকে পতাকাটির উপর নির্ভরশীল করার জন্য এটি পুনর্নির্মাণ করবে - এর অর্থ প্রতিস্থাপন for (Map.Entry<BigInteger, List<String>> entry : map.entrySet())করা উচিত for (Iterator<Map.Entry<BigInteger, List<String>>> iterator = map.entrySet().iterator(); iterator.hasNext() && !limitFlag; Map.Entry<BigInteger, List<String>> entry = iterator.next())। এটি একটি অস্বাভাবিক পর্যাপ্ত প্যাটার্ন যে তুলনামূলক সহজ বিরতির চেয়ে এটি বুঝতে আমার আরও বেশি সমস্যা হবে।
জেমস_পিক

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

1
আপনি কি "কিউ" এর চেয়ে "কিউ" বলতে চাইছেন না?
স্মৃতি

0

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


0

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

সীমাতে পৌঁছে গেলে তা ভাঙার জন্য আপনার লুপ লজিককে ফিলআপআপ তালিকাটিতে সরানো উচিত। তারপরে সরাসরি তালিকাটির আকারটি সরাসরি পরীক্ষা করে দেখুন।

যদি এটি আপনার কোডটি ভঙ্গ করে, তবে কেন?


0

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

private <T> boolean checkCollection(Collection<T> collection)
{
    for (T element : collection)
        if (checkElement(element))
            return true;
    return false;
}

জাভা 8-এর পর থেকে আরও বেশি সংক্ষিপ্ততর উপায় রয়েছে Stream.anyMatch(…):

collection.stream().anyMatch(this::checkElement);

আপনার ক্ষেত্রে এটি সম্ভবত এটির মতো দেখাবে ( list == entry.getValue()আপনার প্রশ্নের ধারণা ধরে ):

map.values().stream().anyMatch(list -> list.size() > limit);

আপনার নির্দিষ্ট উদাহরণটিতে সমস্যাটি অতিরিক্ত কল fillUpList()। এই পদ্ধতিটি কী করার কথা রয়েছে তার উত্তর অনেকটাই নির্ভর করে।

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

সুতরাং আমি ধরে নিই যে আসল কোডটি বর্তমানটিতে entryপদ্ধতিটি পাস করে ।

তবে আরও জিজ্ঞাসা করার জন্য আরও প্রশ্ন রয়েছে:

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

কোডের খণ্ডটি বোঝার চেষ্টা করার সময় এটি কেবল আমার মনে আসে questions সুতরাং, আমার মতে, এটিই আসল কোডের গন্ধ : আপনার কোডটি স্পষ্টভাবে অভিপ্রায়টি যোগাযোগ করে না।

এটি হয় এর অর্থ হতে পারে ("সমস্ত কিছু বা কিছুই নয়" এবং সীমাতে পৌঁছানো ত্রুটি নির্দেশ করে):

/**
 * Computes the list of all foo strings for each passed number.
 * 
 * @param numbers the numbers to process. Must not be {@code null}.
 * @return all foo strings for each passed number. Never {@code null}.
 * @throws InvalidArgumentException if any number produces a list that is too long.
 */
public Map<BigInteger, List<String>> computeFoos(Set<BigInteger> numbers)
        throws InvalidArgumentException
{
    if (numbers.isEmpty())
    {
        // Do you actually need to log this here?
        // The caller might know better what to do in this case...
        logger.info("Nothing to compute");
    }
    return numbers.stream().collect(Collectors.toMap(
            number -> number,
            number -> computeListForNumber(number)));
}

private List<String> computeListForNumber(BigInteger number)
        throws InvalidArgumentException
{
    // compute the list and throw an exception if the limit is exceeded.
}

বা এর অর্থ এটি হতে পারে ("প্রথম সমস্যা হওয়া পর্যন্ত আপডেট করুন"):

/**
 * Refreshes all foo lists after they have become invalid because of bar.
 * 
 * @param map the numbers with all their current values.
 *            The values in this map will be modified.
 *            Must not be {@code null}.
 * @throws InvalidArgumentException if any new foo list would become too long.
 *             Some other lists may have already been updated.
 */
public void updateFoos(Map<BigInteger, List<String>> map)
        throws InvalidArgumentException
{
    map.replaceAll(this::computeUpdatedList);
}

private List<String> computeUpdatedList(
        BigInteger number, List<String> currentValues)
        throws InvalidArgumentException
{
    // compute the new list and throw an exception if the limit is exceeded.
}

অথবা এটি ("সমস্ত তালিকা আপডেট করুন তবে এটি যদি খুব বড় হয়ে যায় তবে মূল তালিকাটি রাখুন"):

/**
 * Refreshes all foo lists after they have become invalid because of bar.
 * Lists that would become too large will not be updated.
 * 
 * @param map the numbers with all their current values.
 *            The values in this map will be modified.
 *            Must not be {@code null}.
 * @return {@code true} if all updates have been successful,
 *         {@code false} if one or more elements have been skipped
 *         because the foo list size limit has been reached.
 */
public boolean updateFoos(Map<BigInteger, List<String>> map)
{
    boolean allUpdatesSuccessful = true;
    for (Entry<BigInteger, List<String>> entry : map.entrySet())
    {
        List<String> newList = computeListForNumber(entry.getKey());
        if (newList.size() > limit)
            allUpdatesSuccessful = false;
        else
            entry.setValue(newList);
    }
    return allUpdatesSuccessful;
}

private List<String> computeListForNumber(BigInteger number)
{
    // compute the new list
}

অথবা এমনকি নিম্নলিখিতগুলি ( computeFoos(…)প্রথম উদাহরণ থেকে তবে ব্যতীত ব্যবহার করে ):

/**
 * Processes the passed numbers. An optimized algorithm will be used if any number
 * produces a foo list of a size that justifies the additional overhead.
 * 
 * @param numbers the numbers to process. Must not be {@code null}.
 */
public void process(Collection<BigInteger> numbers)
{
    Map<BigInteger, List<String>> map = computeFoos(numbers);
    if (isLimitReached(map))
        processLarge(map);
    else
        processSmall(map);
}

private boolean isLimitReached(Map<BigInteger, List<String>> map)
{
    return map.values().stream().anyMatch(list -> list.size() > limit);
}

বা এর অর্থ সম্পূর্ণ আলাদা কিছু হতে পারে… ;-)

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