একই পদ্ধতি একাধিকবার কল করার সময় সাইক্লোমেটিক জটিলতা


12

কোড রিভিউ- তে একটি প্রশ্নের জন্য ধন্যবাদ আমি নীচের কোডটির জন্য সাইক্লোমাটিক জটিলতাটি কী তা সম্পর্কে কিছুটা দ্বিমত (যা মূলত কিছু শেখার সুযোগ) হয়ে পড়েছিল।

public static void main(String[] args) {
    try {
        thro();
        thro();
        thro();
        thro();
        thro();
        thro();
        thro();
    }
    catch (NullPointerException e) {
    }
}

private static Random random = new Random();

public static void thro() throws NullPointerException {
    if (random.nextBoolean())
        throw new NullPointerException();
    System.out.println("No crash this time");
}

ইক্লিপসে এই কোডটি লেখার সময় এবং এক্লিপস মেট্রিক্স প্লাগইন ব্যবহার করার সময় , এটি আমাকে বলে যে মূল পদ্ধতির জন্য ম্যাককেব সাইক্লোমেটিক জটিলতা 2 এবং throপদ্ধতিটির জন্য এটি 2 বলে।

তবে, অন্য কেউ আমাকে বলেছেন যে throএকাধিকবার কল করার জটিলতা number of calls * method complexity, এবং তাই দাবি করে যে মূল পদ্ধতির জটিলতা 7 * 2 = 14।

আমরা কি বিভিন্ন জিনিস পরিমাপ করছি? আমরা দুজনই কি সঠিক হতে পারি? বা এখানে প্রকৃত চক্রবৃদ্ধি জটিলতা কি?


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

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

আপনি যদি সিসি পরিমাপের সম্ভাব্য ব্যতিক্রমগুলির কারণে সৃষ্ট সমস্ত পাথ গণনা করেন, তবে god
শ্বর

উত্তর:


9

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

আমার ধারণা ম্যাককেবে যখন সেই মেট্রিকটি আবিষ্কার করেছিলেন, তখন ব্যতিক্রমের কথা মাথায় রেখে প্রোগ্রামিং ল্যাঙ্গুয়েজ তাঁর নেই।


তবে ব্যতিক্রমটি ছুঁড়ে কোন লাইনটি সত্যই গুরুত্বপূর্ণ?
সাইমন ফোর্সবার্গ

5
@ সায়মনআন্ড্রে ফোর্সবার্গ: হ্যাঁ, তা হয়। "থ্রো" এর একটি পার্শ্ব প্রতিক্রিয়া থাকার কথা ভাবুন যেখানে এটি বলা হয় যখন এটি একটি বিশ্বব্যাপী কাউন্টারকে বাড়িয়ে তোলে (যা কোডের মাধ্যমে সম্ভাব্য পাথগুলিকে পরিবর্তন করে না)। তারপরে এই কাউন্টারটির সম্ভাব্য ফলাফলগুলি 0 থেকে 7 হয়, সুতরাং এটি প্রমাণ করে যে সিসি কমপক্ষে 8 হয়
ডক ব্রাউন

আপনি কি বলতে পারবেন যে আমি যে মেট্রিক্স প্লাগিনটি ব্যবহার করছি সে পদ্ধতির জন্য একটি ভুল মানটির প্রতিবেদন করছে main?
সাইমন ফোর্সবার্গ

@ সিমোনআন্ড্রে ফোর্সবার্গ: ভাল, আমি আপনার মেট্রিক্স প্লাগইনটি জানি না, তবে 2 অবশ্যই 8 টি নয়
ডক ব্রাউন

আমার প্রশ্নের মেট্রিক্স প্লাগইনে একটি লিঙ্ক রয়েছে ....
সাইমন ফোরসবার্গ

6

'অন্য লোক' হওয়ার কারণে আমি এখানে উত্তর দেব এবং আমি যা বলি সে সম্পর্কে সুনির্দিষ্ট হয়ে উঠব (যা আমি অন্যান্য ফর্মামের সাথে নির্দিষ্ট করে দেখিনি)।

উপরের কোড উদাহরণটি ব্যবহার করে, আমি সাইক্লোমেটিক জটিলতা 8 হিসাবে গণনা করি এবং আমি কীভাবে এটি গণনা করি তা দেখানোর জন্য কোডটিতে আমার মন্তব্য রয়েছে। পাথ বর্ণনা করার আমি মাধ্যমে একটি সফল লুপ বিবেচনা করব সবthro() 'প্রধান' 'কোড পাথ হিসাবে কল' (অথবা 'সিপি = 1'):

public static void main(String[] args) {
  try {
             // This is the 'main' Code Path: CP = 1
    thro();  // this has a branch, can succeed CP=1 or throw CP=2
    thro();  // this has a branch, can succeed CP=1 or throw CP=3
    thro();  // this has a branch, can succeed CP=1 or throw CP=4
    thro();  // this has a branch, can succeed CP=1 or throw CP=5
    thro();  // this has a branch, can succeed CP=1 or throw CP=6
    thro();  // this has a branch, can succeed CP=1 or throw CP=7
    thro();  // this has a branch, can succeed CP=1 or throw CP=8
  }
  catch (NullPointerException e) {
  }
}

সুতরাং, আমি এই প্রধান পদ্ধতিতে 8 টি কোড পাথ গণনা করি, যা আমার কাছে 8 এর একটি সাইক্লোমেটিক জটিল।

জাভা পদগুলিতে, কোনও ক্রিয়াকলাপটি প্রস্থান করার জন্য প্রতিটি প্রক্রিয়া তার জটিলতার জন্য গণনা করে, সুতরাং, একটি পদ্ধতি যা সাফল্য-রাষ্ট্র রয়েছে এবং এটি ফেলে দেয়, উদাহরণস্বরূপ, সম্ভবত 3 টি ব্যতিক্রম, 4 টি নথিভুক্ত প্রস্থান পথ রয়েছে has

এমন পদ্ধতির জটিলতা যা এই জাতীয় ফাংশন বলে,

CC(method) = 1 + sum (methodCallComplexity - 1)

আমার মনে হয় অন্যান্য বিষয়গুলি বিবেচনা করতে হবে, তা কি, আমার মতে, catchধারাটি জটিলতার ক্ষেত্রে অবদান রাখে না , এটি catchকেবল একটি throwsশাখার লক্ষ্যমাত্রা , এবং এইভাবে একটি ক্যাচ ব্লক যা একাধিক throws এর লক্ষ্য হিসাবে 1 বার গণনা করা হয় প্রত্যেকের জন্য throw, এবং কেবল একবারের জন্য নয়।


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

না, আমি নই ... এবং আপনি ঠিক বলেছেন, কিন্তু এই যুক্তির প্রসঙ্গে আমি পদ্ধতিটি নিক্ষেপ করার জন্য ঘোষণা করা ব্যতিক্রমগুলিই গণনা করি। এছাড়াও, যদি কোনও পদ্ধতি তিনটি ব্যতিক্রম ঘোষণা করে তবে কলিঞ্চ কোড একটি করে catch (Throwable t) {...তবে আমি অনুমান করি এটি কতটা ব্যতিক্রম ছুঁড়ে দেওয়ার ঘোষণা দেয় তা বিবেচনা করে না।
rolfl
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.