রিফ্যাক্টরের উচ্চতর এলওসি দিয়ে শেষ করা কি কখনও বোঝা যায় না? [বন্ধ]


25

আরও কিছু সংক্ষিপ্ত কোডের চেয়ে আরও ভার্বোজ কোড (আরও লজিক্যাল স্টেটমেন্টের মতো) আরও পরিষ্কার থাকার ক্ষেত্রে কি এমন ঘটনা রয়েছে?



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

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

1
আপনার প্রশ্নের শিরোনাম এবং আপনার প্রশ্ন নিজেই বিভিন্ন প্রশ্ন জিজ্ঞাসা করছে। উদাহরণস্বরূপ, যদি একটি বিবৃতিটি ত্রৈমাসিক অভিব্যক্তিতে রূপান্তর করা যায় যা একই যুক্তিযুক্ত তবে কেবল 1 লাইন।
ক্যাপ্টেন ম্যান

1
-1 *** আরও ভার্বোজ কোড (আরও লজিক্যাল স্টেটমেন্টের মতো) *** ভারবোসিটি এবং লজিক্যাল স্টেটমেন্টের সংখ্যা দুটি অপ্রাসঙ্গিক বিষয়। সংজ্ঞা পরিবর্তন করা এটি খারাপ ফর্ম।
পিটার বি

উত্তর:


70

এর উত্তর দিতে, আসুন একটি বাস্তব বিশ্বের উদাহরণ যা আমার ক্ষেত্রে হয়েছিল। সি # তে একটি লাইব্রেরি যা আমি রক্ষণ করি, আমার কাছে নিম্নলিখিত কোড ছিল:

TResult IConsFuncMatcher<T, TResult>.Result() =>
    TryCons(_enumerator) is var simpleMatchData && !simpleMatchData.head.HasValue
        ? _emptyValue.supplied
            ? _emptyValue.value
            : throw new NoMatchException("No empty clause supplied");
        : _recursiveConsTests.Any() 
            ? CalculateRecursiveResult() 
            : CalculateSimpleResult(simpleMatchData);

সহকর্মীদের সাথে এটি নিয়ে আলোচনা করে সর্বসম্মত রায়টি হয়েছিল যে নেস্টেড ত্রৈমাসিক অভিব্যক্তিগুলি, "চতুর" ব্যবহারের সাথে মিশ্রিত is varহয়েছে, তবে কোডটি পড়া কঠিন ছিল।

সুতরাং আমি এটিতে রিফ্যাক্টর:

TResult IConsFuncMatcher<T, TResult>.Result()
{
    var simpleMatchData = TryCons(_enumerator);

    if (!simpleMatchData.head.HasValue)
    {
        return _emptyValue.supplied
            ? _emptyValue.value
            : throw new NoMatchException("No empty clause supplied");
    }

    return _recursiveConsTests.Any() 
        ? CalculateRecursiveResult() 
        : CalculateSimpleResult(simpleMatchData);
}

মূল সংস্করণটিতে একটি অন্তর্নিহিত মাত্র একটি যৌগিক অভিব্যক্তি রয়েছে return। নতুন সংস্করণে এখন একটি স্পষ্ট পরিবর্তনশীল ঘোষণা, একটি ifবিবৃতি এবং দুটি স্বচ্ছ রয়েছে returns। এতে আরও বিবৃতি এবং কোডের আরও লাইন রয়েছে। তবুও আমি যাদের সাথে পরামর্শ করেছি তারা পড়া এবং যুক্তিগুলি সহজ করে বিবেচনা করেছে, এটি "ক্লিন কোড" এর মূল দিক।

সুতরাং আপনার প্রশ্নের উত্তর একটি জোরালো "হ্যাঁ", সংক্ষিপ্ত কোডের চেয়ে আরও ভার্বোজ পরিষ্কার হতে পারে এবং এটি একটি বৈধ রিফ্যাক্টরিং।


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

2
@ অ্যানাক্সিম্যান্ডার, একেবারে সম্মত। অন্যান্য লোকদের প্রথমে পড়ার জন্য কোড লিখুন এবং দ্বিতীয়টি সংকলকটি লিখুন। যে কারণেই আমি আমার কোডটি অন্যদের সাথে পর্যালোচনা করা দরকারী মনে করি, এমনকি যদি আমি কেবল এটির বিকাশ করি।
ডেভিড আরনো

4
যদি আমি এটি পর্যালোচনা করছিলাম তবে আমি রিটার্নের বিবৃতিগুলির ক্রমটিকে বিপরীত করা এবং !শর্তটি থেকে সরিয়ে ফেলার পরামর্শ দেব । আমি দ্বিতীয় রিটার্নটি একটিতে রাখার পরামর্শ দেব else। এটি যেমন দাঁড়িয়েছে তেমনি এটি একটি বিশাল উন্নতি।
মার্টিন বোনার

2
@ ডেভিড আর্নো আমি সেই যুক্তিটি দেখতে পাচ্ছি এবং যদি if (!foo.HasValue)আপনার কোডটিতে একটি মূর্খতা থাকে তবে আরও দৃ strongly়তার সাথে । তবে এটি সত্যিই প্রস্থান ifনয় - এটি একটি "এটি বা এটি নির্ভর করে।"
মার্টিন বোনার

2
@ ফ্যাব্রিক বুলিয়ান মানগুলির তুলনা বিপজ্জনক। আমি যতটা পারি এড়িয়ে চলি।
মার্টিন বোনার

30

1. এলওসি এবং কোডের মানের মধ্যে পারস্পরিক সম্পর্কের অভাব।

রিফ্যাক্টরিংয়ের লক্ষ্য হ'ল এক টুকরো কোডের মান উন্নত করা।

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

২. কিছু রিফ্যাক্টরিং কৌশলগুলিতে এলওসি যুক্ত করা থাকে।

আপনি নিতে পারেন refactoring কৌশলের একটি তালিকার , আপনি সহজেই যার intentionnally মধ্যে গঠিত স্পট করতে পারেন যোগ LOCs। উদাহরণ:

উভয়ই খুব দরকারী রিফ্যাক্টরিং কৌশল এবং এগুলি ব্যবহার করতে হবে কিনা তা বিবেচনা করার সময় এলওসি-তে তাদের প্রভাব সম্পূর্ণ অপ্রাসঙ্গিক।

এলওসি ব্যবহার করা এড়িয়ে চলুন।

এলওসি একটি বিপজ্জনক মেট্রিক। এটি পরিমাপ করা খুব সহজ এবং সঠিকভাবে ব্যাখ্যা করা খুব কঠিন।

আপনি কোডের মান পরিমাপের কৌশলগুলির সাথে পরিচিত না হওয়া পর্যন্ত প্রথম স্থানে এলওসি পরিমাপ করা এড়ানো বিবেচনা করুন। বেশিরভাগ সময়, আপনি প্রাসঙ্গিক কোনও কিছু পাবেন না এবং এমন কিছু ঘটনাও ঘটবে যেখানে এটি আপনাকে আপনার কোডের মান হ্রাস করতে বিভ্রান্ত করবে।


আপনি আপনার উত্তরটি রিফ্যাক্ট করেছেন এবং আরও অনেকগুলি (পাঠ্যের লাইনগুলি) যুক্ত করে গুণমানের উন্নতি করেছেন: পি
গ্রিন্চ

12

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

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

কোডটি এমনভাবে লেখা উচিত যাতে আপনার দলের কোনও সদস্য এটি দেখতে পারে এবং সরাসরি এটি কী করছে তা বুঝতে পারে।


হতে পারে অপ্রয়োজনীয়, তবে কেবল এটি বানান করতে; আপনি যদি পাঠযোগ্যতার জন্য গল্ফড কোডটি রিফ্যাক্টর করেন তবে আপনি সবসময় আরও এলওসি দিয়ে শেষ করেন
জলি জোকার

1

হ্যাঁ রিফ্যাক্টরিং অবশ্যই কোডের আরও লাইন তৈরি করতে পারে।

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

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

উদাহরণস্বরূপ, এখানে একটি খুব সাধারণ দৃশ্য যা প্রতিটি সফ্টওয়্যার বিকাশকারীদের জন্য ঘটে:

  • আপনার পণ্যটির জরুরি-উচ্চ-অগ্রাধিকারের নতুন বৈশিষ্ট্য বা বাগ-ফিক্স বা উন্নতি প্রয়োজন দুই সপ্তাহের মধ্যে (বা যে কোনও সময়সীমা আপনার প্রকল্পের আকার / সংস্থার আকার / ইত্যাদি জন্য জরুরি হিসাবে বিবেচিত হবে)
  • আপনি কঠোর পরিশ্রম করেন এবং সময়মতো XYZ সরবরাহ করুন এবং এটি কাজ করে। অভিনন্দন! দারূন কাজ!
  • আপনি যখন এক্সওয়াইজেড বিকাশ করছিলেন তখন আপনার বিদ্যমান কোড ডিজাইন / বাস্তবায়ন XYZ সমর্থন করে না তবে আপনি কোডওয়াসে এক্সওয়াইজেডকে ঝিমিয়ে রাখতে সক্ষম হয়েছিলেন
  • সমস্যাটি হ'ল শিমটি কুরুচিপূর্ণ এবং ভয়াবহ কোড-গন্ধ রয়েছে কারণ আপনি কিছু ছদ্মবেশী / চতুর / কুৎসিত / খারাপ-অনুশীলন-তবে-কিন্ডা-ওয়ার্ক কাজ করেছেন
  • পরে যখন আপনি সময় পাবেন তখন আপনি কোডটি রিফ্যাক্টর করুন যা অনেক ক্লাস পরিবর্তন করতে পারে বা ক্লাসগুলির একটি নতুন স্তর যুক্ত করতে পারে এবং আপনার নতুন সমাধানটি "সঠিকভাবে" করা হয় এবং এতে খারাপ কোড-গন্ধ থাকে না ... তবে এটি করছেন "সঠিক পথে" এখন কোডের আরও লাইন গ্রহণ করে।

কিছু দৃ concrete় উদাহরণ যা আমার কাছে আমার মাথার উপরে উঠে আসে:

  • কমান্ড লাইন ইন্টারফেসের জন্য আপনার / 5000-কোড কোডের 5000 টি লাইন থাকতে পারে বা আপনি কলব্যাক ব্যবহার করতে পারবেন ... প্রতিটি কলব্যাক পড়া / পরীক্ষা / যাচাই / ডিবাগ / ইত্যাদি পড়তে অনেক ছোট এবং সহজ হবে তবে আপনি যদি লাইন গণনা করেন কুৎসিত 5000 টি লাইনের কোডটি / অন্যথায় যদি কোডটি আরও ছোট হয়
  • প্রক্রিয়াকরণের এন পদ্ধতিগুলিকে সমর্থন করে এমন কোডের প্রক্রিয়াকরণ অংশের জন্য , আপনি যদি আবার / অন্যথায় যে বিবৃতিগুলি সবচেয়ে কুৎসিত দেখায় তা ব্যবহার করতে পারেন ...
    • অথবা আপনি কলব্যাকগুলিতে স্যুইচ করতে পারেন যা উত্তম / ভাল হবে তবে কলব্যাকগুলি কোডের আরও লাইন নেয় (এখনও সময় নির্ধারণ করে)
    • অথবা আপনি আরও বিমূর্ত করতে পারেন এবং রানটাইম সময়ে পরিবর্তন করা যেতে পারে এমন প্লাগইনগুলি করতে পারেন। প্লাগইনগুলি দুর্দান্ত কারণ আপনাকে প্রতিটি নতুন প্লাগইন বা বিদ্যমান প্লাগইনটিতে পরিবর্তন করার জন্য প্রধান পণ্যটি পুনরায় সংকলন করতে হবে না। এবং আপনি API টি প্রকাশ করতে পারেন যাতে অন্যরা পণ্যটি প্রসারিত করতে পারে। কিন্তু আবার একটি প্লাগইন-পদ্ধতির কোডের আরও লাইন ব্যবহার করা হয়।
  • একটি জিইউআইয়ের জন্য আপনি একটি দুর্দান্ত নতুন উইজেট তৈরি করেন
    • আপনি বা সহকর্মী নোট করেছেন যে নতুন উইজেটটি এক্সওয়াইজেড এবং এবিসি-র জন্য দুর্দান্ত হবে তবে এখন উইজেটটি কেবল এক্সওয়াইজেডের জন্য কাজ করার জন্য দৃly়ভাবে সংহত হয়েছে
    • আপনি উভয় জন্য কাজ করতে উইজেট রিফ্যাক্টর কিন্তু এখন কোডের মোট লাইন বৃদ্ধি পায়
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.