কীভাবে অনেকগুলি ভেরিয়েবল থাকা ডুপ্লিকেট কোডের দিকে নিয়ে যায়?


19

প্যাটার্নস রিফ্যাক্টরিং অনুযায়ী :

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

কীভাবে অনেকগুলি ভেরিয়েবল থাকা ডুপ্লিকেট কোডের দিকে নিয়ে যায়?


2
সহজ ভাষায়: nউদাহরণস্বরূপ বুলিয়ান ভেরিয়েবলগুলি একটি অভ্যন্তরীণ স্টেট স্পেস তৈরি করে 2^n। প্রায়শই না যদিও আপনার অবজেক্টে এমন অনেকগুলি পর্যবেক্ষণযোগ্য রাজ্য না থাকে তবে আপনি সমস্ত রাজ্যকে একক বস্তুতে ছড়িয়ে দিয়েছিলেন, অভ্যন্তরীণভাবে আপনাকে এখনও সেগুলি পরিচালনা করতে হবে।
বিজিকলপ

উত্তর:


23

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

কিন্তু আপনি যখন সত্যিকারের বিশ্ব লিগ্যাসি কোডটিতে অনেক বেশি দায়িত্বশীলতার সাথে একটি শ্রেণি খুঁজে পান, তখন প্রোগ্রামার যিনি এটি লিখেছিলেন সেগুলি পরিষ্কার কোড বা সোলিড নীতিগুলির জন্য কমপক্ষে নয় (কমপক্ষে, তিনি সেই কোডটি লেখার সময় নয়) এর সম্ভাবনা বেশি are আপনি সেখানে অন্যান্য সদৃশ কোডের মতো গন্ধ পাবেন বলে সম্ভাবনা নেই।

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


11

অনেকগুলি উদাহরণের ভেরিয়েবলগুলির অর্থ অনেক বেশি রাষ্ট্র। খুব বেশি রাজ্য ডুপ্লিকেট কোডের দিকে নিয়ে যায় যা প্রতিটি রাজ্যের জন্য কেবল সামান্য আলাদা।

এটি ক্লাসিক একক কংক্রিট শ্রেণি যা অনেকগুলি কাজ করে যা উপ-শ্রেণি বা রচনাগুলি হওয়া উচিত।

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

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


7

আপনি যে বিবৃতিটি উদ্ধৃত করেছেন তা বোঝানো হচ্ছে একটি নির্দিষ্ট প্রসঙ্গে।

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

http://c2.com/cgi/wiki?CodeSmell

কৌতুকজনকভাবে, আপনি "খুব অনেক উদাহরণ ভেরিয়েবল" হিসাবে খুব ভাল একটি কোড গন্ধ দেখতে পাবেন।

উদাহরণস্বরূপ ভেরিয়েবলগুলির ক্ষেত্রে সমস্যাগুলি রয়েছে, এটি খুব কম বা খুব বেশি হোন:

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

  2. প্রতিটি দৃষ্টান্তের ভেরিয়েবলের আপনার নজরদারি রাখা প্রয়োজন, কোন পদ্ধতিগুলি কীভাবে ভেরিয়েবলকে পরিবর্তন করে। সুতরাং, হঠাৎ করে, আপনি রান্না করা সমস্ত রান্না আর জানেন না। এর মধ্যে একটি, গভীর রাতে ক্লান্তভাবে প্রোগ্রাম করা, আপনার স্যুপ নষ্ট করে দেবে। আবার: এরকম অনেকগুলি ভেরিয়েবলের ফলে কোড প্রবেশ করা কঠিন হয়ে যায়।

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

  4. সর্বশেষে তবে সর্বনিম্ন নয়: যদি কোনও শ্রেণীর অনেক উদাহরণের ভেরিয়েবলগুলির সেটার এবং প্রতিটি প্রাপ্তি থাকে, তবে এটি ইঙ্গিত করতে পারে যে অন্যান্য শ্রেণিগুলি এই প্রথম শ্রেণিকে সঠিক উপায়ে ব্যবহার করে না। " কেন গেটার এবং সেটটাররা মন্দ কেন " তা নিয়ে একটি আলোচনা রয়েছে । সংক্ষেপে ধারণাটিটি হ'ল, যদি কোনও শ্রেণি Rectangleকিছু উপস্থাপন করে getX()এবং কয়েক ডজন অন্যান্য শ্রেণি ব্যবহার করে rectangle.getX(), তবে আপনি এমন কোড লিখছেন যা "রিপল এফেক্ট" এর বিরুদ্ধে শক্তিশালী নয় (অন্যান্য কোডকে প্রভাবিত করে একটি কোড পরিবর্তন কতদূর)। কেবলমাত্র যদি আপনার কাছ থেকে টাইপ পরিবর্তন সেখানে কি ঘটছে জিজ্ঞাসা intকরতে double? এই আলোচনা অনুসারে, অনেকগুলি rectangle.getX()কলকে অবশ্যই কলগুলির মতো আরও ভাল হওয়া উচিতrectanlge.calculateThisThingForMe()। সুতরাং, খুব অপ্রত্যক্ষভাবে ডুপ্লিকেট কোডটি অনেকগুলি উদাহরণের ভেরিয়েবল থেকে উদ্ভূত হতে পারে, কারণ প্রায় অনেক ক্লাস অনেক গেটার এবং সেটটার খুব একই রকম কাজ করে, যেমন অনুলিপিযুক্ত জিনিসগুলি ব্যবহার করে যা ক্লাসের ভিতরে আরও ভাল স্থানান্তরিত হওয়া উচিত।

অনেক বা কয়েকটি উদাহরণ ভেরিয়েবলগুলি স্থায়ী বাণিজ্য বন্ধ রয়েছে, সফ্টওয়্যারটি বৃদ্ধির সময় উভয় উপায়ে পরিবর্তন করে।


আর-টু-পি উদ্ধৃতিটি খুব সাধারণ, এজন্যই আমি এই উত্তরটি পছন্দ করি। আমার গ্রহণযোগ্যতাটি হ'ল: যদি আমরা কোনও ক্লায়েন্টের পক্ষে পর্যাপ্ত বৈশিষ্ট্য প্রকাশ করা হয় এবং এটি করা হয় তবে সেগুলি গ্রহণ করে এবং এটি একটি প্রদত্ত কার্যকারিতার নিজস্ব সংস্করণ লিখি - উপরের # 4। সমস্যাটি অবজেক্টের সংমিশ্রণের মতো গভীরতর হতে পারে - দেখুন # 2: আমি আমাদের কোডে এটি প্রায়শই দেখি। (ক) "কেন তারা <সব কিছু" শ্রেণিটি ব্যবহার করেননি (এই কিছু সংগঠিত রাষ্ট্রকে কলুষিত করার জন্য)? " বা (খ) "কেন তারা একটি নতুন শ্রেণি তৈরি করেনি? আমি এগুলির সব কিছু জানতে পারি না।" এবং নিশ্চিত যে আমাদের কাছে সুসংগত শ্রেণীর অভাবের জন্য কার্যত কার্যকারিতাটির বেশ কয়েকটি ক্লাস রয়েছে ally
রাডারবব

6

সহজ ভাষায় বলা যায়: কোডের মধ্যে উদ্বেগের দুর্বল পৃথকীকরণ, এমন কোডের দিকে নিয়ে যায় যা মডুলার নয়, দুর্বল পুনরায় ব্যবহারের দিকে পরিচালিত করে, নকল কোডে নিয়ে যায়।

আপনি যদি কখনও কার্যকারিতা পুনরাবৃত্তি করার চেষ্টা না করেন তবে আপনি সদৃশ কোড পাবেন না এবং অনেকগুলি উদাহরণ ভেরিয়েবল কোনও সমস্যা হবেনা।

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

সুতরাং অনেকগুলি পরিবর্তনশীল নিজেই সমস্যার মূল কারণ নয় এটি একটি শক্তিশালী "গন্ধ" যা সমস্যাটি আসছে।

"অবশ্যই অবশ্যই অনুসরণ করা উচিত" বলার চেয়ে ভাষা "খুব বেশি পিছনে থাকতে পারে না" তাই লেখক দাবি করছেন না যে এটি অবশ্যই ঘটবে তবে শেষ পর্যন্ত ঘটবে; আপনার যদি কার্যকারিতা পুনরায় ব্যবহার করতে হবে তবে কোডটি মডিউল হিসাবে নয় cannot

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