সাইক্লোমেটিক জটিলতা বোঝা


11

আমি সম্প্রতি সাইক্লোমাটিক জটিলতা পেরিয়ে এসেছি এবং এটি আরও ভাল করে বোঝার চেষ্টা করতে চাই।

জটিলতার গণনা করার ক্ষেত্রে বিভিন্ন কারণগুলির কয়েকটি ব্যবহারিক কোডিং উদাহরণ কী কী? বিশেষত, উইকিপিডিয়া সমীকরণের জন্য M = E − N + 2P, আমি নীচের প্রতিটি শর্তটির অর্থ আরও ভালভাবে বুঝতে চাই:

  • E = গ্রাফের প্রান্তের সংখ্যা
  • এন = গ্রাফের নোডের সংখ্যা
  • পি = সংযুক্ত উপাদানগুলির সংখ্যা

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

অনুসরণ হিসাবে, সাইক্লোমাটিক জটিলতা 100% পাথ কভারেজের জন্য প্রয়োজনীয় ইউনিট পরীক্ষার সংখ্যার সাথে সরাসরি সম্পর্কযুক্ত করে ? উদাহরণস্বরূপ, 4 এর জটিলতাযুক্ত কোনও পদ্ধতিটি কি নির্দেশ করে যে সেই পদ্ধতিটি আবরণ করার জন্য 4 ইউনিট পরীক্ষার প্রয়োজন?

অবশেষে, নিয়মিত প্রকাশগুলি সাইক্লোমেটিক জটিলতাগুলিকে প্রভাবিত করে এবং যদি তাই হয় তবে কীভাবে?


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

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

উত্তর:


8

সূত্রটি সম্পর্কে: নোডগুলি রাষ্ট্রসমূহকে প্রতিনিধিত্ব করে, প্রান্তগুলি রাষ্ট্রের পরিবর্তনের প্রতিনিধিত্ব করে। প্রতিটি প্রোগ্রামে, বিবৃতিগুলি প্রোগ্রামের স্থিতিতে পরিবর্তন আনায়। প্রতিটি পরপর বিবৃতি একটি প্রান্ত দ্বারা প্রতিনিধিত্ব করা হয়, এবং প্রোগ্রামের (বা তার আগে ...) বিবৃতি কার্যকর করার পরে নোড হয়।

আপনার যদি ব্রাঞ্চিং স্টেটমেন্ট থাকে ( ifউদাহরণস্বরূপ) - তবে আপনার দুটি নোড বের হচ্ছে, কারণ রাষ্ট্রটি দুটি উপায়ে পরিবর্তন করতে পারে।

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

CCN জন্য ব্যবহার করা হয় শাখাবিন্যাস কভারেজ, বা পাথ কভারেজ, যা একই। সিসিএন একক থ্রেডেড অ্যাপ্লিকেশনটিতে তাত্ত্বিকভাবে সম্ভব বিভিন্ন শাখার পাথের সংখ্যার সমান (এতে " if x < 2 and x > 5 then" এর মতো শাখাও থাকতে পারে , তবে এটি একটি অপ্র্রাপযোগ্য কোড হিসাবে একটি ভাল সংকলক দ্বারা ধরা উচিত)। কমপক্ষে আপনাকে বিভিন্ন পরীক্ষার কেস থাকতে হবে (আরও কিছু হতে পারে যেহেতু কিছু পরীক্ষার ক্ষেত্রে পূর্বেরগুলি দ্বারা আবৃত পথগুলি পুনরাবৃত্তি হতে পারে তবে প্রতিটি ক্ষেত্রে একটি একক পথ জুড়েই কম নয়)) যদি আপনি কোনও সম্ভাব্য পরীক্ষার ক্ষেত্রে কোনও পথ আবরণ করতে না পারেন - আপনি অ্যাক্সেসযোগ্য কোডটি পেয়েছেন (যদিও এটি নিজেকে অ্যাক্সেসযোগ্য কেন এটি সম্ভবত আপনাকে নিজেকে প্রমাণ করতে হবে, সম্ভবত x < 2 and x > 5কোথাও কোথাও কিছু লুকিয়ে আছে)।

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


2
+1: আসলে, আপনাকে অবশ্যই বিশ্বাস করতে হবে যে রেজেক্স ইঞ্জিনটি পরীক্ষা করা হয়েছে। আপনি এটা বিশ্বাস না থাকে, তাহলে এক পেতে যে আপনার কি বিশ্বাস রাখুন।
এসলট

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

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

শাখার কভারেজ এবং পাথ কভারেজ এক নয়। শাখাগুলি কভারেজটি সমস্ত শাখাগুলিকে coveringেকে রাখার লক্ষ্য করে যেখানে পাথ কভারেজটি শাখাগুলির সমস্ত সংমিশ্রণকে আচ্ছাদন করে।
mouviciel

13

এ বিষয়ে কিছু মন্তব্য যে আমি নির্লিপ্তভাবে লিখি ...

বিশেষত, এম = ই - এন + 2 পি এর উইকিপিডিয়া সমীকরণের জন্য

যে সমীকরণ খুব ভুল

কোনও কারণে ম্যাককেব সত্যই এটি তার মূল কাগজে ("একটি জটিলতা পরিমাপ", সফটওয়্যার ইঞ্জিনিয়ারিং, আইওইইই লেনদেন, ভো। এসই -২, নং ৪, ডিসেম্বর ১৯66) এ ব্যবহার করেছেন, তবে এটিকে যথাযথভাবে প্রমাণ করার পরে এবং সঠিকভাবে উদ্ধৃত করার পরে প্রথম পৃষ্ঠায় সূত্র , যা হয়

v (G) = e - v + p

(এখানে, সূত্র উপাদানগুলি আবার সম্পর্কিত করা হয়েছে)

বিশেষত, ম্যাককেবে সি.বার্জ, গ্রাফ এবং হাইপারগ্রাফ বইটি উল্লেখ করেছেন (নীচে সংক্ষেপে G&HG এর সংক্ষেপে)। সরাসরি সেই বই থেকে :

সংজ্ঞা (জিএন্ডএইচজির নীচে পৃষ্ঠা 27):

একটি (পুনর্নির্দেশিত) গ্রাফ জি (যার বেশ কয়েকটি সংযোগ বিচ্ছিন্ন উপাদান থাকতে পারে) এর সাইক্লোমেটিক নম্বর ভি (জি) হিসাবে সংজ্ঞায়িত করা হয়েছে:

v (G) = e - v + p

যেখানে ই = প্রান্ত সংখ্যা, v = শীর্ষে সংখ্যা, পি = সংযুক্ত উপাদান সংখ্যা

উপপাদ্য (জিএন্ডএইচজির 29 পৃষ্ঠার শীর্ষে) (ম্যাককেব ব্যবহার করেননি):

একটি গ্রাফ জি এর সাইক্লোমেটিক সংখ্যা v (G) সর্বোচ্চ চক্রের সর্বাধিক সংখ্যার সমান

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

Intuitively, একটি চক্র সেট হয় স্বাধীন চক্র কেউই পেশার superimposing অন্যদের কাছ থেকে নির্মাণ করা যাবে যদি।

উপপাদ্য (জিএন্ডএইচজির 29 পৃষ্ঠার মাঝামাঝি) (ম্যাককেবের দ্বারা ব্যবহৃত):

দৃ strongly়ভাবে সংযুক্ত গ্রাফ জি-তে, চক্রাকারে সংখ্যাটি লিনিয়ারলি স্বাধীন সার্কিটের সর্বাধিক সংখ্যার সমান।

একটি সার্কিট এমন একটি চক্র যা অনুভূমিক এবং প্রান্তগুলির পুনরাবৃত্তিগুলি অনুমোদিত নয়।

নির্দেশিত গ্রাফটি দৃ strongly়ভাবে সংযুক্ত বলে মনে করা হয় যদি প্রতিটি শীর্ষবিন্দু তাদের নির্ধারিত দিকের প্রান্তের মধ্য দিয়ে প্রান্তরে গিয়ে প্রতিটি অন্যান্য শীর্ষবিন্দু থেকে পৌঁছতে পারে।

নোট এখানে যে আমরা থেকে পাশ undirected গ্রাফ থেকে জোরালোভাবে সংযুক্ত গ্রাফ (যা নির্দেশ করা হয় ... Berge এই সম্পূর্ণভাবে স্পষ্ট করতে না)

ম্যাককেবে এখন এইভাবে একটি "ম্যাককেব সাইক্লোমেটিক জটিলতা নম্বর" (সিসিএন) গণনা করার সহজ উপায় অর্জন করতে উপরের উপপাদ্যটিকে প্রয়োগ করেছেন:

কোনও পদ্ধতির "লাফ টপোলজি" প্রতিনিধিত্বকারী একটি নির্দেশিত গ্রাফ দেওয়া হয়েছে (নির্দেশ প্রবাহের গ্রাফ), একটি স্বতন্ত্র এন্ট্রি পয়েন্টকে উপস্থাপিত একটি মনোনীত শীর্ষবিন্দু এবং অনন্য প্রস্থান বিন্দুর প্রতিনিধিত্বকারী একটি মনোনীত শীর্ষবিন্দু (প্রস্থান বিন্দু শীর্ষটি "নির্মিত" হতে পারে) এটি একাধিক রিটার্নের ক্ষেত্রে যুক্ত করে), প্রস্থান বিন্দুটি থেকে প্রান্তিক বিন্দুতে একটি নির্দেশিত প্রান্ত যুক্ত করে একটি দৃ connected়ভাবে সংযুক্ত গ্রাফ তৈরি করুন, সুতরাং এন্ট্রি পয়েন্টের শীর্ষস্থানটি অন্য কোনও শীর্ষবিন্দু থেকে পৌঁছনীয় করে তোলে।

ম্যাককেবে এখন পোস্ট করেছেন (পরিবর্তে বিভ্রান্তিকরভাবে আমি বলতে পারি) পরিবর্তিত নির্দেশিকা প্রবাহ গ্রাফের চক্রবৃত্তীয় সংখ্যা "'ন্যূনতম পথের সংখ্যা'" সম্পর্কে আমাদের স্বজ্ঞাত ধারণাকে মেনে চলে এবং তাই আমরা সেই সংখ্যাটিকে জটিলতার পরিমাপ হিসাবে ব্যবহার করব।

শীতল, তাই:

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

v (G) = e - v + p

যদি কেউ প্রান্তগুলির দিকনির্দেশকে উপেক্ষা করে।

সমস্ত ক্ষেত্রে, আমরা কেবল একটি একক পদ্ধতি বিবেচনা করি, সুতরাং পুরো গ্রাফের মধ্যে কেবল একটি সংযুক্ত উপাদান রয়েছে এবং তাই:

v (জি) = ই - ভি + 1।

যদি কেউ যুক্ত করা "প্রস্থান-থেকে-প্রবেশ" প্রান্ত ব্যতীত আসল গ্রাফটি বিবেচনা করে তবে একটি সহজভাবে প্রাপ্ত:

ṽ (জি) = ẽ - ভি + ২

হিসাবে ẽ = ই - 1

আসুন তার কাগজ থেকে ম্যাককেবের উদাহরণ ব্যবহার করে চিত্রিত করুন:

ম্যাককেবের উদাহরণ

আমাদের এখানে আছে:

  • e = 10
  • v = 6
  • পি = 1 (একটি উপাদান)
  • v (G) = 5 (আমরা পরিষ্কারভাবে 5 টি চক্র গণনা করছি)

সাইক্লোমেটিক সংখ্যার সূত্র বলে:

v (G) = e - v + p

যা ফলন করে 5 = 10 - 6 + 1 এবং তাই সঠিক!

"ম্যাককেবে সাইক্লোমেটিক জটিলতা নম্বর" যেমন তার কাগজে দেওয়া আছে

5 = 9 - 6 + 2 (কীভাবে কাগজে আরও কোনও ব্যাখ্যা দেওয়া হয়নি)

যা সঠিক হতে পারে (এটি ভি (জি) দেয়) তবে ভুল কারণে, যেমন আমরা ব্যবহার করি:

ṽ (জি) = ẽ - ভি + ২

এবং এইভাবে ṽ (G) = v (G) ... ভাই!

কিন্তু এই পরিমাপ কোন ভাল?

দুটি কথায়: খুব বেশি নয়

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

এখানে চিত্র বর্ণনা লিখুন


1
পছন্দ করুন নিশ্চই আমি করবো. সংশোধন করা হয়েছে!
ডেভিড টনহোফার

1
মূল কাগজে লিঙ্ক করার জন্য বড় +1। সেই সময়ে লেখা অনেকগুলি কাগজপত্র যে কোনও মধ্য স্তরের প্রোগ্রামারের পক্ষে যথেষ্ট পাঠযোগ্য এবং এটি পড়তে হবে।
ড্যানিয়েল টি।

1

অনুসরণ হিসাবে, সাইক্লোমাটিক জটিলতা 100% পাথ কভারেজের জন্য প্রয়োজনীয় ইউনিট পরীক্ষার সংখ্যার সাথে সরাসরি সম্পর্কযুক্ত করে?

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

অবশেষে, নিয়মিত প্রকাশগুলি সাইক্লোমেটিক জটিলতাগুলিকে প্রভাবিত করে এবং যদি তাই হয় তবে কীভাবে?

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


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