ষোলটিও বেশি অষ্টিলিয়নের এনপিথ জটিলতা কি বাস্তবসম্মত? নাকি আমি হাতিয়ারটি ভেঙে ফেলেছি?


13

আমি পিএইচপিএমডি ( http://phpmd.org/ ) ব্যবহার করে পিএইচপি কোড (1153 লাইন) এর একটি বিশাল অংশ পরিমাপ করেছি এবং এটি আমাকে বলে যে কোডটির একটি এনপ্যাথ জটিলতা রয়েছে 16244818757303403077832757824।

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

দুটি সম্ভবত গুরুত্বপূর্ণ বিশদ -

  1. এটি HTML- এর সাথে মিশ্রিত পদ্ধতিগত কোড ছিল এবং পিএইচপিএমডি কেবল অবজেক্ট-ভিত্তিক কোড পরিমাপ করবে। এটি পেতে, আমি একটি ফাংশন সহ পুরো ফাইলটি একটি শ্রেণিতে মুড়ে ফেলেছি - এটি কীভাবে এটি ব্যবহার করা হয় তার প্রতিনিধি।

  2. ফাইলটি নেস্টেড সুইচ বিবৃতিগুলির একটি সিরিজ নিয়ে গঠিত এবং এর মধ্যে প্রচুর if..else বিবৃতি রয়েছে - সুতরাং এটি অবশ্যই জটিল complicated

সম্পাদন করা

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


2
আপনি যদি সরঞ্জামটি ভেঙেছিলেন কিনা আমি জানি না, তবে # 2 ইঙ্গিত দেয় যে কোডটি সম্ভবত কিছুটা রিফ্যাক্টর হয়ে দাঁড়াতে পারে।
লিন্ডা জিনে 14'15

1
@ লিন্ডা জিনে আমি সম্মতি জানাই আমি ঠিক কতটা
গণ্ডগোলের

2
ওয়ার্ডপ্রেস ' WP_Query::get_posts()এর 2013 সালে এনপিথ জটিলতা ছিল 1.435 কুইন্ডিকিলিয়ন । এটি আজকাল আরও খারাপ ...
ফুসিয়া

@ টসচো এটি আমার নতুন পছন্দের তথ্য। ধন্যবাদ!
জেজ

উত্তর:


24

এটি সম্পূর্ণ সম্ভব। ধরা যাক আমাদের প্রতিটি 10 ​​টি ক্ষেত্রে 35 টি সুইচ-কেস কনস্ট্রাক্ট রয়েছে, যা আমাদের একের পর এক স্যুইচ করার সময় 350 এর মোটামুটি সাইক্লোমেটিক জটিলতা দেয়। প্রথম সুইচ আমাদের 10 টি পথ দেয়। দ্বিতীয় স্যুইচ আমাদের আর একটি স্বতন্ত্র 10 টি পাথ দেয়, যাতে আমাদের এখানে 10 · 10 টি পথ থাকে। তৃতীয় স্যুইচ সহ, আমরা 10 · 10 · 10 = 10 get পাথ পাই এবং আরও 10 টি পাথ পাওয়া পর্যন্ত ! এটি আপনার 1.6 · 10 28 পাথের ফলাফলের চেয়েও বেশি , এটি সম্ভবত কোনও ভিন্ন শাখা কারণের কারণে এবং নেস্টেড কন্ট্রোল ফ্লো স্টেটমেন্টের কারণে যা আপনার কোডের মাধ্যমে পাথের সংখ্যা হ্রাস করে।

প্রদত্ত চক্রবৃত্তীয় জটিলতা গ-এর জন্য সবচেয়ে খারাপ পরিস্থিতি হিসাবে , কোডের মাধ্যমে আমাদের সর্বোচ্চ 2 সি অ্যাসিক্লিক পাথ থাকতে পারে (এখানে: 2 351 = 4.6 · 10 105 )।

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


14
বিশ্লেষণের জন্য ধন্যবাদ। আমি এটি উল্লেখ করার প্রয়োজন বোধ করছি যে এটি আমার কোড নয় ... তবে যেমনটি প্রায়শই ঘটে থাকে তা আমার কাছে আমার সমস্যা হিসাবে উপস্থিত হয়।
জেজ

1
@ জিজ, এটি কোনও সান্ত্বনা থাকলে আপনি কোনও অনন্য অবস্থানে নেই in
ড্যানিয়েল হোলিনরেকে 20'15

5

এই বর্ণনা অনুসারে , এনপথ জটিলতা সাইক্লোমেটিক জটিলতায় ক্ষতিকারক।

স্টেটমেন্টগুলি সহজভাবে গ্রহণ করা, যদি আপনার কাছে এই দুটি বিবৃতি থাকে তবে দুটি কোডের শর্তের জন্য আপনার কোডের মাধ্যমে মূলত 4 টি সত্য / মিথ্যা এর সম্ভাব্য চারটি সংমিশ্রণের সাথে সম্পর্কিত routes টি রুট। বিবৃতি এবং অন্য আপনি 8 যোগ করুন।

অন্য কথায়, যদি আপনার সমস্ত সাইক্লোমেটিক এবং এনপাথ জটিলতা যদি বিবৃতিগুলির একটি দীর্ঘ তালিকা থেকে আসে তবে আপনার সমতা হবে NPath = 2^cyclomatic। আপনার সংখ্যার সাথে এর তুলনা করা, 2 ^ 351 = 4.6 * 10 ^ 105, আপনার রিপোর্ট করা এনপ্যাথ জটিলতার থেকে অনেক বেশি।

আমি জানি না যে পিএইচপিএমডি পাথগুলি গণনা এড়াতে কতটা উপকার করে যা আসলে অসম্ভব (যেমন দুটি পারস্পরিক এক্সক্লুসিভ কন্ডিশন উভয়ই সত্যকে মূল্যায়ন করে)। সম্ভবত একটি ম্যানুয়াল বিশ্লেষণ প্রকাশ করবে যে প্রচুর পথগুলি আসলে অসম্ভব, সুতরাং কোডটি এমনভাবে লেখা হয়েছিল যা এনপথ মেট্রিককে স্ফীত করে। উপরের দিকে চালিয়ে যাওয়ার জন্য, যদি বিবৃতি দেওয়া থাকে তবে আপনার যদি 351 এর একটি তালিকা থাকে তবে যাচাই করা যে কেবলমাত্র একজনই প্রকৃতপক্ষে প্রবেশ করেছে, আপনি এটিকে যদি একটি শৃঙ্খলে পরিণত করতে পারেন ... অন্য বিবৃতিগুলি, আপনার এনপিথ জটিলতা 4.6 * 10 থেকে নামিয়েছে ^ 105 থেকে 353।

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

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