کاپی پیسٹ (کاپی پیسٹ) کوڈ کے ٹکڑوں کو ایک جگہ سے دوسری جگہ نئے سیاق و سباق میں ڈھالے بغیر کاپی کرنے کی مشق ہے۔ اکثر اوقات، ڈویلپر موجودہ ماڈیول سے ایک بلاک کاپی کرتا ہے، کم سے کم ترمیم کرتا ہے اور اسے نئے میں پیسٹ کرتا ہے — بگز، پرانے کمنٹس اور غیر ضروری ڈیپنڈنسیز کے ساتھ۔ TIOBE Code Quality Survey (2025) کے مطابق، کاپی پیسٹ کی اعلی سطح والے پروجیکٹس میں متحد ایبسٹریکشن والے پروجیکٹس کے مقابلے میں فی ہزار لائن کوڈ میں تین گنا زیادہ نقائص پائے جاتے ہیں۔ کوڈ ڈپلیکیشن تکنیکی قرض کا بنیادی ذریعہ ہے: ہر کاپی کو علیحدہ دیکھ بھال کی ضرورت ہوتی ہے، اور ایک جگہ بگ ٹھیک کرنا دوسری جگہوں پر ٹھیک ہونے کی ضمانت نہیں دیتا۔
اہم نکات
کاپی پیسٹ (کاپی پیسٹ پروگرامنگ) موجودہ کوڈ کو معمولی یا بغیر تبدیلی کے نئی جگہ منتقل کرنا ہے۔ یہ اصطلاح تضحیک آمیز معنی میں استعمال ہوتی ہے: اس کا مطلب ہے کہ ڈویلپر کوئی حل ڈیزائن نہیں کر رہا بلکہ مشینی طور پر ایک تیار بلاک کاپی کر رہا ہے، اکثر یہ پوری طرح سمجھے بغیر کہ یہ کیسے کام کرتا ہے۔
کاپی پیسٹ دو قسم کا ہوتا ہے: جان بوجھ کر (intentional) اور اتفاقی (accidental)۔ جان بوجھ کر — جب ڈویلپر بعد میں ری فیکٹرنگ کے منصوبے کے ساتھ جان بوجھ کر کوڈ کاپی کرتا ہے (لیکن منصوبہ اکثر ترک کر دیا جاتا ہے)۔ اتفاقی — جب ڈپلیکیشن بغیر توجہ کے پیدا ہوتی ہے، مثال کے طور پر، دو ڈویلپر مختلف اسکرینوں کے لیے آزادانہ طور پر ایک ہی منطق لکھتے ہیں۔
SonarQube State of Clean Code (2025) رپورٹ کے مطابق، تجارتی پروجیکٹس میں ڈپلیکیٹڈ کوڈ کل کوڈ والیوم کا اوسطاً 12-18 فیصد ہوتا ہے۔ اسی وقت، ڈپلیکیٹڈ کوڈ میں بگ ٹھیک کرنے کی لاگت واحد نفاذ والے کوڈ کے مقابلے میں 2.5 گنا زیادہ ہوتی ہے، کیونکہ ڈویلپر کو تمام کاپیاں تلاش کرکے ٹھیک کرنی پڑتی ہیں۔
کاپی پیسٹ کے خلاف بنیادی ہتھیار DRY (Don't Repeat Yourself) اصول ہے۔ تاہم، DRY کو مطلق بنانا بھی خطرناک ہے: کبھی کبھار کاپی کرنا جائز ہے جب دو کاپیوں کو ایک دوسرے سے آزادانہ طور پر تیار ہونا چاہیے۔ “اتفاقی ڈپلیکیشن” (جسے ختم کیا جانا چاہیے) اور “ضروری ڈپلیکیشن” (جسے دستاویز کیا جانا چاہیے) کے درمیان فرق کرنا ضروری ہے۔
پہلا اور سب سے اہم خطرہ بگز کا پھیلاؤ ہے۔ اگر اصل کوڈ میں کوئی نقص ہے، تو یہ کوڈ کے ساتھ تمام نئی جگہوں پر کاپی ہو جاتا ہے۔ جب نقص دریافت ہوتا ہے اور اصل ماڈیول میں ٹھیک کیا جاتا ہے، کاپیاں غیر ٹھیک رہتی ہیں۔ ڈویلپر کو یہ بھی معلوم نہیں ہو سکتا کہ بگ پانچ مختلف فائلوں میں موجود ہے۔
دوسرا خطرہ غیر مساوی ارتقاء ہے۔ ایک ہی الگورتھم کی دو کاپیاں وقت کے ساتھ مختلف تبدیلیاں جمع کرتی ہیں۔ ایک کاپی باؤنڈری ویلیو توثیق شامل کرتی ہے، دوسری آؤٹ پٹ فارمیٹ تبدیل کرتی ہے۔ کچھ مہینوں کے بعد، یہ بتانا ناممکن ہو جاتا ہے کہ کون سا ورژن “صحیح” ہے، اور پروجیکٹ رویوں کی مستقل مزاجی کھو دیتا ہے۔
تیسرا خطرہ بڑھتا ہوا ٹیسٹ والیوم ہے۔ ہر کاپی پیسٹ انسٹینس کو اپنے ٹیسٹ کی ضرورت ہوتی ہے۔ اگر مشترکہ منطق کو ایک فنکشن میں نکال لیا جائے، تو اسے ٹیسٹ کے ایک سیٹ سے کور کیا جا سکتا ہے اور دوبارہ استعمال کیا جا سکتا ہے۔ ڈپلیکیشن کے ساتھ، ہر کاپی کو الگ سے ٹیسٹ کرنا پڑتا ہے — یہ CI رن ٹائم اور برقرار رکھنے والے ٹیسٹ بیس کے سائز کو کئی گنا بڑھا دیتا ہے۔
چوتھا خطرہ پیداواریت کا وہم ہے۔ کاپی پیسٹ رفتار کا جھوٹا احساس پیدا کرتا ہے: ڈویلپر جلدی سے کوڈ پیسٹ کرتا ہے اور دیکھتا ہے کہ اسکرین کام کر رہی ہے۔ لیکن یہ “رفتار” تکنیکی قرض میں بدل جاتی ہے جسے سود سمیت ادا کرنا پڑے گا جب ڈپلیکیٹڈ بلاک میں بگ ملے گا یا کاروباری منطق میں تبدیلی کی ضرورت ہوگی۔
کاپی پیسٹ کی وجوہات کو سمجھنا مناسب روک تھام قائم کرنے میں مدد کرتا ہے۔ اکثر، ڈویلپر سستی کی وجہ سے نہیں بلکہ ڈیڈ لائن کے دباؤ، علم کی کمی یا نامناسب آرکیٹیکچر کی وجہ سے کوڈ کاپی کرتے ہیں۔
پہلی وجہ ڈیڈ لائنز ہیں۔ جب دو دن میں ایک اسکرین بنانی ہوتی ہے اور ملتی جلتی اسکرین پہلے سے موجود ہے، ڈویلپر اسے مکمل کاپی کرتا ہے اور صرف وہی تبدیل کرتا ہے جو صارف دیکھتا ہے۔ مشترکہ کمپوننٹ نکالنے اور ری فیکٹر کرنے کا وقت نہیں ہے — کلائنٹ نتائج چاہتا ہے۔ نتیجے کے طور پر، 80 فیصد مشترکہ کوڈ لیکن تبدیلیوں کی آزاد تاریخ کے ساتھ دوسری اسکرین ظاہر ہوتی ہے۔
دوسری وجہ متحد ایبسٹریکشن کا فقدان ہے۔ اگر پروجیکٹ میں کسی عام کام کے لیے (جیسے پل ٹو رفریش والی لسٹ اسکرین) کوئی مشترکہ کمپوننٹ نہیں ہے، تو ہر ڈویلپر اپنا نفاذ لکھے گا یا پڑوسی کا کاپی کرے گا۔ پروجیکٹ کے شروع میں لیے گئے آرکیٹیکچرل فیصلے مستقبل کے کاپی پیسٹ کی مقدار کو براہ راست متاثر کرتے ہیں۔
تیسری وجہ کام کرنے والے کوڈ کو توڑنے کا خوف ہے۔ ڈویلپر جانتا ہے کہ موجودہ ماڈیول کام کرتا ہے۔ مشترکہ کوڈ نکالنے کے لیے ری فیکٹرنگ موجودہ فعالیت کو متاثر کر سکتی ہے۔ اگر ٹیسٹ کوریج کم ہے، تو توڑنے کا خطرہ ری فیکٹرنگ کے سمجھے جانے والے فائدے سے زیادہ ہوتا ہے، اور ڈویلپر محفوظ راستہ چنتا ہے — کاپی کرنا۔
علامات کے بجائے وجوہات کو حل کریں۔ ڈیڈ لائن کم کرنا اور کوڈ ریویو متعارف کرانا مسئلہ حل نہیں کرے گا اگر پروجیکٹ میں ٹھوس آرکیٹیکچرل بنیاد نہیں ہے۔ ابتدائی مراحل میں دوبارہ استعمال کے قابل کمپوننٹ بنانے میں وقت لگائیں — مستقبل میں کاپی پیسٹ کے لالچ کو کم کرنے کا یہی واحد طریقہ ہے۔
کاپی پیسٹ کا پتہ لگانے کا کام خودکار تجزیہ کار کرتے ہیں جو کوڈ کے ٹکڑوں کا موازنہ کرتے ہیں اور ایک مخصوص حد سے اوپر مماثلت کی نشاندہی کرتے ہیں۔ بہترین ٹولز AST (ایبسٹریکٹ سنٹیکس ٹری) کی سطح پر کام کرتے ہیں اور فارمیٹنگ، متغیر ناموں اور کمنٹس کو نظر انداز کرتے ہیں۔
PMD CPD (کاپی پیسٹ ڈیٹیکٹر) Java, Kotlin, Swift, JavaScript, Python اور C++ کے لیے سب سے عام ٹول ہے۔ CPD سورس کوڈ ٹوکنز کا تجزیہ کرتا ہے اور ایک مخصوص کم از کم ٹوکن نمبر (ڈیفالٹ 100) سے لمبے ڈپلیکیٹ ڈھونڈتا ہے۔ معیاری نتائج کے لیے حد کو ترتیب دینا کلیدی ہے: بہت کم حد بہت سے جھوٹے مثبت (عام پیٹرن جیسے امپورٹ) دیتی ہے، بہت زیادہ حد حقیقی ڈپلیکیٹ چھوڑ دیتی ہے۔
plugins {
id 'pmd'
}
pmd {
toolVersion = '7.0.0'
ruleSetFiles = files("pmd-rules.xml")
}
tasks.register('cpd') {
doLast {
exec {
workingDir = projectDir
commandLine 'cpd',
'--minimum-tokens', '75',
'--language', 'kotlin',
'--files', 'src/main/kotlin',
'--format', 'xml',
'--failOnViolation', 'true'
}
}
}
SonarQube براہ راست Quality Gate میں ڈپلیکیٹ ڈیٹیکٹر ایمبیڈ کرتا ہے۔ Duplicated Blocks (%) اصول ڈپلیکیٹڈ کوڈ کا فیصد دکھاتا ہے۔ تجارتی پروجیکٹس کے لیے 5 فیصد کی حد صحت مند سمجھی جاتی ہے۔ اس سے تجاوز کرنا ریلیز برانچ میں پروموشن کو روکتا ہے۔ SonarQube اضافی طور پر ڈپلیکیٹ کو قسم کے مطابق گروپ کرتا ہے: صحیح مماثلت اور ساختی کاپیاں (دوبارہ نامزد کردہ شناخت کاروں کے ساتھ)۔
JavaScript اور TypeScript کے لیے، ESLint میں eslint-plugin-sonarjs پلگ ان (no-duplicate-string اصول) اور jscpd یوٹیلیٹی کا استعمال کرتے ہوئے ڈپلیکیٹ کا پتہ لگایا جاتا ہے۔ jscpd 150+ زبانوں کو سپورٹ کرتی ہے۔ jscpd خاص طور پر مونوریپو کے لیے آسان ہے: یہ صرف ایک ماڈیول کے اندر نہیں بلکہ پیکیجز کے درمیان بھی ڈپلیکیٹ ڈھونڈتا ہے۔
کاپی پیسٹ ری فیکٹرنگ ایک اصول پر مبنی ہے: مشترکہ حصہ نکالیں اور فرق کو پیرامیٹرائز کریں۔ مخصوص تکنیک ڈپلیکیشن کے دائرہ کار اور سیاق و سباق پر منحصر ہے۔
سب سے آسان صورت ایک کلاس میں ڈپلیکیشن ہے (مثال کے طور پر، ایک ہی منطق لیکن مختلف اقسام والے دو طریقے)۔ حل یہ ہے کہ جنرکس کے ساتھ عام کیا جائے یا ٹائپ پیرامیٹر کے ساتھ طریقہ کو دوبارہ استعمال کیا جائے۔ اگر ڈپلیکیشن متعدد کلاسوں پر پھیلی ہوئی ہے — مشترکہ کوڈ کو یوٹیلیٹی کلاس یا ایکسٹینشن فنکشن میں نکالیں۔
زیادہ پیچیدہ صورت اسکرین یا ماڈیول کی سطح پر ڈپلیکیشن ہے۔ یہاں، صرف ایک فنکشن نکالنے سے مدد نہیں ملتی، کیونکہ UI ساخت، لائف سائیکل منطق اور ڈیٹا بائنڈنگ سب ڈپلیکیٹ ہیں۔ حل یہ ہے کہ ایک مشترکہ بیس اسکرین کلاس یا ایک کمپوزٹ ویو کمپوننٹ بنایا جائے، اور فرق کو پیرامیٹرز یا پروٹوکول کے ذریعے پاس کیا جائے۔
// before - two copies of the same UITableViewController
class UserListController: UITableViewController {
private let viewModel = UserListViewModel()
// 40 lines of code
}
class ProductListController: UITableViewController {
private let viewModel = ProductListViewModel()
// same 40 lines but with Product instead of User
}
// after - generic base class shared
class ListViewController<T: ListViewModel>: UITableViewController {
let viewModel: T
// 40 lines of code - once only
init(viewModel: T) {
self.viewModel = viewModel
super.init(style: .plain)
}
}
سب سے پیچیدہ صورت مائیکرو سروسز یا لائبریریوں کے درمیان ڈپلیکیشن ہے۔ مشترکہ کوڈ نکالنے سے چکری انحصار یا ناجائز جوڑ پیدا ہو سکتا ہے۔ ایسی صورتوں میں، کاپی پیسٹ ایک شعوری فیصلہ ہو سکتا ہے: دو ٹیمیں آزاد خدمات کو برقرار رکھتی ہیں، اور ایک مشترکہ لائبریری حل کرنے سے زیادہ مسائل پیدا کرتی ہے۔ اہم بات یہ ہے کہ اس طرح کے فیصلے کو دستاویز کیا جائے اور باقاعدگی سے چیک کیا جائے کہ کیا کاپیاں اتحاد کو جائز قرار دینے کے لیے کافی مختلف ہو گئی ہیں۔
کاپی پیسٹ کو روکنا پہلے سے ڈپلیکیٹڈ کوڈ کو ری فیکٹر کرنے سے زیادہ مؤثر ہے۔ اہم حفاظتی اقدامات ٹیکنالوجی میں نہیں بلکہ ڈویلپمنٹ کے عمل کو منظم کرنے میں ہیں۔
پہلا اقدام ڈپلیکیشن پر توجہ دینے والا کوڈ ریویو ہے۔ ریویو چیک لسٹ میں یہ آئٹم شامل ہونا چاہیے: “کیا اس PR میں وہ کوڈ ہے جو پہلے سے پروجیکٹ میں موجود ہے؟” اگر ریویور کاپی پیسٹ دیکھتا ہے — تو وہ مشترکہ کمپوننٹ نکالنے تک انضمام کو روکتا ہے۔ یہ ضرورت ٹیم کی Definition of Done کا حصہ ہونی چاہیے۔
دوسرا اقدام مشترکہ کمپوننٹ لائبریری ہے۔ ہر UI پیٹرن جو دو یا زیادہ اسکرینوں پر ظاہر ہوتا ہے، اسے ایک مشترکہ ماڈیول میں نکالا جانا چاہیے۔ پروجیکٹ میں ایک مشترکہ ماڈیول بنائیں اور اسے تمام UI کمپوننٹس کے لیے لازمی انٹری پوائنٹ بنائیں۔ اگر کوئی کمپوننٹ موجود نہیں ہے — اسے پہلے بنایا جاتا ہے، پھر اسکرین پر استعمال کیا جاتا ہے۔
تیسرا اقدام CI/CD میں آٹومیشن ہے۔ پائپ لائن میں ڈپلیکیٹڈ کوڈ چیک مرحلہ شامل کریں (PMD CPD, jscpd, SonarQube)۔ حد سے تجاوز کرنا بلڈ کی ناکامی کا باعث بنتا ہے۔ ڈویلپر PR کو ضم نہیں کر سکتا جو کاپی پیسٹ کے تناسب کو اجازت شدہ سطح سے اوپر بڑھاتا ہے۔ یہ ذمہ داری کوڈ ریویو سے آٹومیشن کی طرف منتقل کرتا ہے اور اس بات کو یقینی بناتا ہے کہ کوئی بھی ڈپلیکیٹ نظر انداز نہ ہو۔
“ایک نفاذ — ایک جگہ” کی ثقافت کو فروغ دیں۔ اگر آپ کو دوبارہ استعمال کا موقع نظر آتا ہے — تو ری فیکٹرنگ کو بعد کے لیے نہ چھوڑیں۔ ہر کاپی پیسٹ جو “بعد میں” چھوڑا جاتا ہے، کئی گنا بڑھ جاتا ہے اور بے قابو تکنیکی قرض میں بدل جاتا ہے۔
اکثر پوچھے گئے سوالات
نہیں، شعوری ڈپلیکیشن کے منظرنامے ہیں: مختلف مائیکرو سروسز جنہیں آزادانہ طور پر تیار ہونا چاہیے؛ حذف کرنے کے منصوبے کے ساتھ تجربے کے لیے کاپی کیا گیا کوڈ؛ مختلف API ورژن کے لیے ٹیمپلیٹ DTO۔ اہم بات یہ ہے کہ وجہ کو دستاویز کیا جائے اور ری فیکٹرنگ کے لیے چیک ڈیڈ لائن مقرر کی جائے۔
کاپی پیسٹ اس وقت ہوتا ہے جب کوڈ کے دو حصے ایک ہی کام کرتے ہیں لیکن ان میں کوئی مشترکہ ایبسٹریکشن نہیں ہوتی۔ صحت مند دوبارہ استعمال اس وقت ہوتا ہے جب مشترکہ کوڈ کو فنکشن، کلاس یا ماڈیول میں نکالا جاتا ہے اور فرق کو پیرامیٹرائز کیا جاتا ہے۔ اگر منطق تبدیل کرنے کے لیے تین یا زیادہ جگہوں پر ترمیم درکار ہو — وہ کاپی پیسٹ ہے۔
PMD CPD Swift اور Objective-C کو سپورٹ کرتا ہے۔ Xcode کے لیے SwiftCop جیسے پلگ انز اور AppCode میں ایک بلٹ ان ڈپلیکیٹ ڈیٹیکٹر ہے۔ SonarQube بھی Swift پروجیکٹس کا تجزیہ کرتا ہے، پل ریکویسٹ میں براہ راست ڈپلیکیٹڈ بلاک دکھاتا ہے۔
ہر بڑی کاپی کی ری فیکٹرنگ کے لیے ایک تکنیکی ٹکٹ بنائیں۔ ترجیحات مقرر کریں: جو اسکرینیں بار بار تبدیل ہوتی ہیں پہلے، مستحکم والی بعد میں۔ ڈپلیکیٹڈ کوڈ کو چھونے والے ہر نئے PR کے لیے، بتدریج انضمام کے لیے 15-20 فیصد وقت مختص کریں۔
ہاں، جدید AI اسسٹنٹس (GitHub Copilot, Codeium) سیاق و سباق کا تجزیہ کر سکتے ہیں اور دہرائے جانے والے پیٹرن کا پتہ چلنے پر مشترکہ کوڈ نکالنے کا مشورہ دے سکتے ہیں۔ تاہم، وہ خودکار تجزیہ کاروں کا متبادل نہیں ہیں — Copilot کو روک تھام کے لیے اور CPD / SonarQube کو پتہ لگانے کے لیے استعمال کریں۔
خلاصہ
ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے
IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں