পুনরুক্তি পদ্ধতিগুলি কি চক্রবৃত্তীয় জটিলতা হ্রাস করে এবং সমর্থনযোগ্যতা উন্নত করে?


11

পুনরুক্তি পদ্ধতিগুলি যেমন আধুনিক ভাষায় যেমন সি #, জাভাস্ক্রিপ্ট এবং (আশাবাদী) জাভা 8-তে সাধারণত পাওয়া যায় তবে কোডের উপলব্ধি এবং সমর্থনযোগ্যতার উপর চক্রবৃত্তীয় জটিলতার প্রভাব হ্রাস পায়?

উদাহরণস্বরূপ সি # তে আমাদের নিম্নলিখিত কোড থাকতে পারে:

List<String> filteredList = new List<String>();

foreach (String s in originalList){
   if (matches(s)){
      filteredList.add(s);
   }
}

এটিতে একটি সাধারণ চক্রোলোমিক জটিলতা রয়েছে।

আমরা সহজেই এটিকে আবার লিখতে পারি:

List<String> filteredList = originalList.where(s => matches(s));

যা 0 এর একটি সহজ চক্রযুক্ত জটিলতা রয়েছে।

এর ফলে কি আরও বেশি সমর্থনযোগ্য কোড আসে? এই বিষয়ে কোন বাস্তব গবেষণা আছে?


2
আপনার শিরোনাম সাইক্লোমেটিক জটিলতা হ্রাস সম্পর্কে জিজ্ঞাসা করে, তবে আপনার পাঠ্য সিসি হ্রাস গ্রহণ করে এবং রক্ষণাবেক্ষণ সম্পর্কে জিজ্ঞাসা করে। এটি একটি মূল্যবান প্রশ্ন হওয়ার সম্ভাবনা রয়েছে, আপনি আরও সঠিক হয়ে শিরোনামটি সম্পাদনা করতে পারেন?
কিলিয়ান ফট

পছন্দ করুন
সি রস

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

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

উত্তর:


14

আমার অনুমান যে আপনি কেবল জটিলতা ভাগ করেছেন / সরিয়ে নিয়েছেন। এটি হ্রাস পেয়েছে কারণ আপনি .where()আপনার সিসিতে বাস্তবায়ন গণনা করেন না ।

সামগ্রিক সিসি সত্যই সরানো হয়নি, আপনার নিজের কোডের সিসি হ্রাস পেয়েছে, কেবল কারণ এটি এখন ফ্রেমওয়ার্কের কোডে চলে গেছে।

আমি বলব এটি আরও রক্ষণাবেক্ষণযোগ্য। এটি যখন ভাষার কোনও বৈশিষ্ট্য হয় তখন এটি ব্যবহার করুন। এটি কোনও "ওহ, আমি দেখছি, এটি একটি চালাক কৌশল" যা আপনি ব্যবহার করছেন, কেবল একটি সাধারণ ইনলাইন হ্রাস-মতো ফাংশন।


11

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


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

6

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

MI = 171 - 5.2 * ln(V) - 0.23 * (G) - 16.2 * ln(LOC)

Gপ্রশ্নে কোডটির চক্রবৃত্তীয় জটিলতা কোথায় । সুতরাং, কোডের টুকরোটির চক্রবৃত্তীয় জটিলতা হ্রাস সংজ্ঞা দ্বারা কোডের রক্ষণাবেক্ষণ সূচক এবং অন্যান্য মেট্রিকগুলিতে উন্নতি করে যা একইভাবে চক্রবৃত্তীয় জটিলতা ব্যবহার করে

আপনার প্রস্তাবিত পরিবর্তনের ফলে প্রোগ্রামারদের কাছে প্রোগ্রামটি আরও রক্ষণাবেক্ষণযোগ্য বলে মনে হয় কিনা তা বলা শক্ত ; এটি সম্ভবত (আপনার ক্ষেত্রে) whereপদ্ধতির সাথে কতটা পরিচিত তার উপর নির্ভর করে ।


সতর্কতা: যাদু নম্বর! (>_<)
ইজকাটা

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

@ জনআর.স্ট্রোহম আমি মনে করি আপনি কেবলমাত্র রক্ষণাবেক্ষণের মেট্রিক হিসাবে এলওসি ব্যবহার করলেও আপনি একই রকম ফল পাবেন। ওপির পরিবর্তন এলওসিকে 4 থেকে 1 এ হ্রাস করে এবং অন্যান্য পরিবর্তনগুলি যা চক্রবৃত্তীয় জটিলতা হ্রাস করে একইভাবে এলওসি হ্রাস করার সম্ভাবনাও রয়েছে। যেভাবেই হোক না কেন, এটি কীভাবে আপনি রক্ষণাবেক্ষণের সংজ্ঞা এবং পরিমাপ করেন তা সত্যিই নেমে আসে।
কালেব

1
@ কালেব: একমত আমি যে বক্তব্যটি তৈরির চেষ্টা করছি তা হ'ল লোকেরা প্রায়শই এই জটিল জটিল মেট্রিকগুলি এবং মেট্রিকের সংমিশ্রনের জন্য যায়, বুঝতে পারছেন না যে তাদের প্রায় সমস্তগুলিই সরল পুরাতন লাইনের অফ লাইন (এলওসি) এর সাথে বাস্তব কোডের সাথে দৃ strongly়ভাবে সম্পর্কযুক্ত দেখানো হয়েছে not , এবং সুতরাং LOC এর চেয়ে বেশি ভবিষ্যদ্বাণীমূলক বা বর্ণনামূলক মান নেই।
জন আর স্ট্রোহম

3

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

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


2

আপনি যদি সাইক্লোমেটিক জটিলতার কাঁচা স্ট্যাটিটির বিষয়ে কথা বলছেন তবে অবশ্যই। আপনি এটিকে কেবল 2 থেকে 0 পর্যন্ত ডেকেছেন you're

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

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

এই ক্ষেত্রে, a.where(x => matches(x, arg))ব্যবহারটি ভয়াবহ নয়, এবং সত্যই সত্য যে কোনও সহকর্মীকে প্রথমবারের জন্য লিনিকিউ এবং ল্যাম্বডা ভাব প্রকাশের সাথে দেখার এবং তার সাথে কাজ করার এক দুর্দান্ত উপায় (আমি আসলে লিনকিউ / ল্যাম্বডাসের টিউটোরিয়ালটি প্রাক্তন কিছু সহকর্মীর কাছে উপস্থাপন করেছি) এবং কোডের অন্যান্য সেটগুলি দুর্দান্ত প্রভাব ফেলবে)) তবে এগুলির ব্যবহারের জন্য কিছু জ্ঞানের প্রয়োজন।

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


1

বিষয়গতভাবে, এটি বিকাশকারী শ্রোতার উপর নির্ভর করে, যদি তারা ল্যাম্বদা এক্সপ্রেশন বুঝতে পারে, তবে;

List<String> filteredList = originalList.where(s => matches(s));

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

List<String> filteredList = 
    originalList.where(stringToBeTested => matchesNameTest(stringToBeTested));

অথবা

List<String> filteredList = 
        originalList.where(originalListString => matchesNameTest(originalListString));

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

রক্ষণাবেক্ষণ কেবল কোডটি বোঝার ক্ষমতা সম্পর্কেই নয়, তবে মূলত গতি এবং যথাযথতা যার সাথে কোড বোঝা যায়।


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