DRY সম্পর্কিত নয়, তবে প্রায় অভিন্ন, কোড


34

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

মাইক্রোসফ্ট.কোডএ্যানালাইসিস.সিএসআরপি.সাইন্টাক্স.অ্যাট্রিবিউটসাইন্টাক্স

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

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


এটি কি আপনার নিজস্ব অ্যাট্রিবিউটসাইন্টাক্স ইন্টারফেস তৈরি করতে কাজ করবে যা বিদ্যমান ক্লাসগুলিকে আবৃত করে কিন্তু আপনাকে উত্তরাধিকার দেয় যা ধারণাগতভাবে সেখানে থাকতে হবে?
উইনস্টন ইওয়ার্ট

7
দুঃখিত, যদি এটি সুস্পষ্ট হয় তবে জেনেরিক্স বিদ্যমান তাই কোডের জন্য আপনাকে অভিন্ন হলেও টাইপের জন্য নিজেকে পুনরাবৃত্তি করতে হবে না। যদি আপনি যা বোঝাতে চেয়েছিলেন তা না হলে দয়া করে এড়িয়ে যান।
ডেভিস্লোর

@ লোরেহেড সাধারণত আমি এটি করতাম, তবে এটি একটি একক পদ্ধতি যা কোনও ধরণের পাস করা হচ্ছে যার অভ্যন্তরীণ পদ্ধতিতে আমার কোনও নিয়ন্ত্রণ নেই from
হোশেচ 250

@ উইনস্টনওয়েট আমি এটি সন্ধান করব। যদিও আমি নিশ্চিত নই যে আমি সমস্ত সি / ভিবি.এনইটি টাইপের জন্য এটি করতে চাই।
হোশেচ 250

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

উত্তর:


111

আপনি ডিআরওয়াই করবেন না কারণ এটি কোনও বইতে লিখেছেন যে এটি করা ভাল, আপনি DRY করেন কারণ এটি আসলে রয়েছে do সুস্পষ্ট সুবিধা রয়েছে।

বিশেষতঃ প্রশ্ন থেকে:

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

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

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


বলা হচ্ছে, এসআরপি দেওয়া এবং সাধারণত ছোট, নমনীয় শ্রেণিগুলি সাধারনত করার চেষ্টা করা, সেই কারণেই আপনার কোডটি বিশ্লেষণ করা বুদ্ধিমান হতে পারে , জেনেরিক ধরণের ব্যবহারের আচরণের বিটগুলি বিভক্ত করে (আপনি বলেছিলেন যে এগুলি টাইপ ব্যতীত অভিন্ন) ছোট ক্লাস। তারপরে আপনি জানতে পারবেন যে এই শ্রেণীর কয়েকটি আসলে সম্পূর্ণ অভিন্ন (কেবল বেশিরভাগই অভিন্ন) নয় এবং তারপরে আপনি যুক্ত করতে চাইলে আপনি একটি সরঞ্জামকিট তৈরি করতে পারেন Microsoft.CodeAnalysis.CPlusPlus.Syntax.AttributeSyntax


32
টিএল; ডিআর - ডিআরওয়াই একটি শেষ করার উপায়। উপায়টি নয়, শেষের দিকে মনোনিবেশ করুন। আমি যদি দুবার লেগো ম্যানকে উজ্জীবিত করতে পারতাম, আমি করতাম।

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