কেন একক পদ্ধতির জন্য চক্রবৃত্তীয় জটিলতা গুরুত্বপূর্ণ?


10

আমি সম্প্রতি থেকে সোনারলিন্টকে গ্রহণের জন্য ব্যবহার করছি এবং এটি আমাকে অনেক সাহায্য করেছে। যাইহোক, এটি আমার কাছে সাইক্লোমেটিক জটিলতা সম্পর্কে একটি প্রশ্ন উত্থাপন করেছিল।

সোনারলিন্ট 10 এর সিসি হিসাবে গ্রহণযোগ্য হিসাবে বিবেচনা করে এবং এমন কিছু ঘটনা রয়েছে যেখানে আমি এর বাইরে, প্রায় 5 বা 6 ইউনিট। এই অংশগুলি ম্যাপারগুলির সাথে সম্পর্কিত যেখানে মানগুলি বিভিন্ন ভেরিয়েবলের উপর নির্ভর করে, উদাহরণস্বরূপ:

  • ফিল্ড এ স্ট্রিং এসএ উপর নির্ভর করে;
  • ফিল্ড বি স্ট্রিং এসবিতে নির্ভর করে;
  • ফিল্ড সি স্ট্রিং এসসির উপর নির্ভর করে;
  • ইত্যাদি ...

আমার আর কোনও পছন্দ নেই যা ifপ্রতিটি ক্ষেত্রের জন্য রাখ। এটি আমার পছন্দ নয় (ভাগ্যক্রমে) তবে ইতিমধ্যে বিদ্যমান এবং জটিল সিস্টেম যা আমি নিজেই পরিবর্তন করতে পারি না।


আমার প্রশ্নের মূলটি হ'ল: একক পদ্ধতিতে খুব বেশি সিসি না থাকা কেন এত গুরুত্বপূর্ণ ? জটিলতা হ্রাস করতে যদি আপনি কিছু শর্তগুলি এক বা একাধিক উপ-পদ্ধতিতে সরিয়ে থাকেন তবে এটি আপনার সামগ্রিক ক্রিয়াকলাপের ব্যয় হ্রাস করে না, এটি সমস্যাটি অন্যত্র সরিয়ে নিয়েছে, আমার ধারণা?

(ছোট ভুলের জন্য দুঃখিত, যদি থাকে)।


সম্পাদনা

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

তবে দ্বিতীয় লিঙ্কটি ( অ্যান্টি-প্যাটার্ন সম্পর্কে ) দুর্দান্ত সহায়ক help




arrow "তীর মাথা" প্রশ্নটি সম্ভবত এই অর্থে আরও ভাল সদৃশ যা আপনার কোডটি কীভাবে উন্নত করবে তা ব্যাখ্যা করে তবে সাইক্লোমেটিক জটিলতা সম্পর্কে আপনার প্রশ্নের অংশটির উত্তর দেওয়ার বিশদ ব্যাখ্যা দেওয়ার কারণে আমি প্রথমটি বেছে নিয়েছিলাম
gnat

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

1
আপনার নির্দিষ্ট বর্ণিত কেসটির জন্য, আমি আপনার প্রাথমিক পদ্ধতিতে "এ = এক্সট্র্যাকএফ্রোম (এসএ)" এর মতো কিছু করব; প্রতিটি ক্ষেত্রের জন্য। আপনি সম্ভবত আরও ভাল নাম নিয়ে আসতে পারেন যেহেতু আপনি আসল ক্ষেত্রগুলি এবং তাদের ব্যবহারগুলি জানেন।
টিন ম্যান

উত্তর:


32

এখানে মূল জিনিস: "মস্তিষ্কের ক্ষমতা"।

আপনি দেখুন, কোডের অন্যতম প্রধান কাজ হ'ল ... পড়তে হবে । এবং কোড পড়া এবং বুঝতে সহজ হতে পারে; বা শক্ত।

এবং উচ্চতর সিসি থাকা কেবল একটি পদ্ধতির মধ্যে প্রচুর "স্তর" বোঝায়। এবং এটি সূচিত করে: আপনি একজন মানব পাঠক হিসাবে সেই পদ্ধতিটি বোঝার জন্য খুব কঠিন সময় কাটাবেন।

আপনি যখন সোর্স কোডটি পড়েন, আপনার মস্তিষ্ক স্বয়ংক্রিয়ভাবে বিষয়গুলিকে দৃষ্টিভঙ্গিতে রাখার চেষ্টা করে: অন্য কথায় - এটি "প্রসঙ্গ" এর কিছু ফর্ম তৈরি করার চেষ্টা করে।

এবং যখন আপনার কাছে একটি ছোট পদ্ধতি রয়েছে (একটি ভাল নাম সহ) যা কেবল কয়েকটি লাইন নিয়ে গঠিত এবং খুব কম সিসি; তাহলে আপনার মস্তিষ্ক সহজেই এই "ব্লক" গ্রহণ করতে পারে। আপনি এটি পড়া, আপনি এটি বুঝতে; সম্পন্ন.

অন্যদিকে, যদি আপনার কোডটিতে উচ্চ সিসি থাকে, আপনার মস্তিষ্ক যা চলছে তা হ্রাস করতে অনেকগুলি "চক্র" আরও ব্যয় করবে।

বলার আর একটি উপায়: আপনার জটিল জিনিসগুলির একটি সাধারণ নেটওয়ার্কের চেয়ে সাধারণ জিনিসের একটি জটিল নেটওয়ার্ককে অগ্রাধিকারের দিকে ঝুঁকানো উচিত । কারণ আপনার মস্তিষ্ক ছোট জিনিস বোঝার ক্ষেত্রে আরও ভাল।


9
সুতরাং মূলত এটি প্রযুক্তিগত সমস্যা সম্পর্কে নয় , তবে মানুষের সম্পর্কে ? এই শব্দগুলি, প্রকৃতপক্ষে, এক ধরণের চালাক, আমি কীভাবে আগে এটি ভাবিনি তা আমি জানি না। ধন্যবাদ!
ইয়াসাইন বাদচে

4
যদি তা হয় তবে আমি আন্তরিকভাবে রবার্ট মার্টিনের "ক্লিন কোড" অর্জনের জন্য আপনাকে পরামর্শ দিচ্ছি (আপনি নেটগুলিতে বিনামূল্যে পিডিএফ খুঁজে পেতে পারেন)। আপনি দেখুন, পঠনযোগ্য কোড তৈরি করা একটি ভাল প্রোগ্রামারের অন্যতম গুরুত্বপূর্ণ তবে খুব প্রায়ই উপেক্ষা করা গুণ virt
ঘোস্টগেট মনিকা সি কে সালাম জানায়

@ ইয়াসাইনবাডাচ সিসি প্রতিটি নোক এবং ক্রেনির (সম্পূর্ণ কভারেজ) পরীক্ষা করাও শক্ত করে তোলে।
তুলাইনস কর্ডোভা

এই মূল অংশ ছিল Dijkstra এর এতে যান কাগজ , অত্যধিক।
শেঠ ব্যাটিন

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

6

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

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


2
"ফিল্ডা যদি স্ট্রিং এসএ'র উপর নির্ভর করে" তবে ওপি বলেছে যে আমি নিশ্চিত নই যে এটিকে ক্যালকুলেটফিল্ডে (স্ট্রিং এসএ) সরিয়ে নেওয়া আরও সংশ্লেষিত কোড তৈরি করে।
তাইমির

2

সংক্ষেপে: এটি সমস্তই পঠনযোগ্যতা এবং তাই আপনার কোডের রক্ষণাবেক্ষণ সম্পর্কে।

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


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

2

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

এর বাইরে, আমি অন্যান্য বিবেচনার জন্য অন্যান্য উত্তরগুলির সাথে একমত - কোনও বিকাশকারীর মানসিক ক্ষমতা বা সম্ভাব্য সমস্যাগুলির একটি সূচক বা রিফ্যাক্টরিং বা কোডের পাঠযোগ্যতা এবং রক্ষণাবেক্ষণের একটি পরিমাপ


0

সিসি কেবল একটি হিউরিস্টিক, এবং নির্দিষ্ট স্কোরটি কীভাবে 'খারাপ' হয় তা অনেক কিছুর উপর নির্ভর করে।

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


0

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

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

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

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


0

কোডটি দেখার জন্য এবং মস্তিষ্কের চক্রগুলি দেখার জন্য এবং কোডটি কী করছে তা বোঝার জন্য এটি কতটা সময় ব্যয় করে তা নেমে আসে।

  • একটি 10 ​​লাইন পদ্ধতি বিবেচনা করুন - সম্ভবত এটি কী করছে তা বোঝার জন্য কয়েক মিনিট সময় নিন।
  • একটি 100 লাইন পদ্ধতি বিবেচনা করুন - সম্ভবত কি করছে তা বোঝার জন্য সম্ভবত এক ঘন্টা বা আরও বেশি সময় লাগবে।
  • 1000 লাইন পদ্ধতি বিবেচনা করুন - সম্ভবত কি করছে তা বোঝার জন্য আরও এক দিন বা তার বেশি সময় লাগবে।

এছাড়াও বৃহত্তর পদ্ধতিগুলি পরীক্ষা করা আরও কঠিন এবং কী ধরণের আচরণ হতে পারে তা অনুমান করা আরও শক্ত।

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

আরেকটি বিষয় বিবেচনা করার বিষয় হ'ল জটিল কোড আপডেট করা। বিশ্লেষণ করার সময়, কোনও বিকাশকারী রিপোর্ট করতে পারে যে কোডটি পরিবর্তন করা জটিলতা দেখে কমবেশি ঝুঁকিপূর্ণ।

সুতরাং, জটিলতা পরিমাপ করার অনেক মূল্য রয়েছে যা লাভের জন্য এবং সিদ্ধান্ত গ্রহণের উদ্দেশ্যে ব্যবহার করা যেতে পারে।


1
দুঃখিত ঘোস্ট ক্যাট উত্তরটি খুব অনুরূপ, সতেজ পৃষ্ঠা থাকা উচিত।
জন রেয়নর
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.