Refactoring
খারাপ code সারানোর নিরাপদ step-by-step পদ্ধতি।
61টা পাঠ · একটার পর একটা পড়ো, বা সরাসরি যেটা দরকার সেটায় যাও।
Extract Method: একটা বিশাল ফাংশনকে ছোট ছোট নামওয়ালা helper-এ ভাগ করো
Extract Method ধাপে ধাপে শিখে নাও। একটা লম্বা ফাংশন থেকে এলোমেলো block বের করে তাকে একটা পরিষ্কার নাম দাও, আর তোমার কোডকে একটা সহজ to-do লিস্টের মতো পড়ার যোগ্য করে তোলো।
Inline Method: যে Shortcut আসলে Shortcut ছিলই না
Inline Method শেখো ধাপে ধাপে। যখন একটা ছোট method-এর body তার নামের চেয়ে বেশি পরিষ্কার, তখন সেই body-টা সরাসরি caller-এ বসিয়ে দাও আর একটা বাড়তি hop সরিয়ে ফেলো।
Extract Variable: ছোট ছোট নামওয়ালা ধাপে বড় হিসাব সমাধান করো
Extract Variable শেখো ধাপে ধাপে। একটা বিশাল, জটিল expression কে ছোট ছোট নামওয়ালা অংশে ভাগ করো — ঠিক যেভাবে গণিতের খাতায় কাজ দেখাও।
Inline Temp: একবারই ব্যবহার করা রাফ নোটটা ছুঁড়ে ফেলো
Inline Temp রিফ্যাক্টরিং শেখো একটা মজার রাফ পেপারের গল্প দিয়ে — TypeScript আর C# উদাহরণ, নিরাপদ ধাপ, IDE shortcut, আর কখন variable inline করা উচিত না সেটাসহ।
Replace Temp with Query: তাজা জিজ্ঞেস করো, বাসি চিরকুটে ভরসা করো না
ক্যান্টিনের সিঙ্গারার গল্প দিয়ে Replace Temp with Query বোঝো — TypeScript আর C# উদাহরণ, নিরাপদ ধাপ, আর একটাই সত্যের উৎস।
Split Temporary Variable: একটা বালতি দুই কাজ করতে পারে না
দুই বালতির গল্প দিয়ে Split Temporary Variable শেখো — TypeScript ও C# উদাহরণ আর নিরাপদ ধাপ সহ। প্রতিটা variable-কে একটাই কাজ আর একটাই সৎ নাম দাও।
Remove Assignments to Parameters: ধার করা খাতায় কখনো লিখবে না
Remove Assignments to Parameters refactoring শিখো একটা ধার করা খাতার গল্পের মাধ্যমে — TypeScript আর C# উদাহরণ সহ, সহজ ধাপে ধাপে।
Replace Method with Method Object: বড় রান্নার জন্য আলাদা স্টেশন বানাও
Replace Method with Method Object শেখো বিয়ের রান্নাঘরের গল্প দিয়ে — TypeScript ও C# উদাহরণ আর নিরাপদ ধাপ-ধাপ পদ্ধতি দিয়ে, একদম শুরু থেকে।
Substitute Algorithm: স্কুলে যাওয়ার নতুন সোজা রাস্তা
Substitute Algorithm রিফ্যাক্টরিং শেখো সাইকেলের রুটের গল্প দিয়ে — TypeScript আর Python উদাহরণ সহ, আর টেস্ট-ফার্স্ট নিরাপত্তার নিয়ম যেটা সব শিক্ষার্থীর জানা দরকার।
Move Method: কাজটা সেই class-এ নিয়ে যাও যেখানে সে আসলে থাকে
একটা স্কুলের গল্পের মাধ্যমে Move Method রিফ্যাক্টরিং শেখো। যে class-এর data method-টা সবচেয়ে বেশি ব্যবহার করে, সেখানেই সরিয়ে নাও — যাতে behaviour আর data একসাথে থাকে।
Move Field: ডেটা রাখো যেখানে সে কাজে লাগে
Move Field শেখো একটা মজাদার স্কুলের গল্প দিয়ে। ডেটাকে সেই class-এ সরাও যেটা আসলে ওই ডেটা ব্যবহার করে, যাতে state আর behaviour একসাথে বাস করতে পারে।
Extract Class: অতিরিক্ত কাজে ডুবে যাওয়া class-কে একটু সাহায্য করো
Extract Class refactoring শেখো একটা মজার school office-এর গল্পের মাধ্যমে। একটা overloaded class-কে দুটো focused class-এ ভাগ করো — প্রতিটার একটাই কাজ।
Inline Class: যে Class কিছুই করে না, তাকে মিলিয়ে দাও
Inline Class refactoring শেখো একটা school committee-র গল্পের মাধ্যমে। যে class কিছুই করে না তাকে তার user-এর সাথে মিলিয়ে দাও আর অকারণ layer মুছে ফেলো।
Hide Delegate: মনিটরকে জিজ্ঞেস করো, মনিটর নিজেই দৌড়াবে
Hide Delegate রিফ্যাক্টরিং শেখো একটা মজার গল্পের মাধ্যমে। employee.department.manager-এর মতো chain লেখা বন্ধ করো — প্রথম object-কে একটা সহজ method দাও আর ভেতরের জার্নি লুকিয়ে রাখো। TypeScript আর C#-এ ধাপে ধাপে উদাহরণসহ।
Remove Middle Man: পিয়ন শুধু ফরওয়ার্ড করলে, সরাসরি হেড স্যারের কাছে যাও
Remove Middle Man রিফ্যাক্টরিং শেখো একটা স্কুলের পিয়নের গল্প দিয়ে — যে প্রতিটা প্রশ্ন হেডমাস্টারের কাছে ফরওয়ার্ড করে, নিজে কিছু যোগ না করেই। যখন একটা class শুধু delegate-কে call ফরওয়ার্ড করে, তখন সেই ফরওয়ার্ডিং মুছে দাও আর client-দের সরাসরি delegate-এর সাথে কথা বলতে দাও। TypeScript আর C#-এ ধাপে ধাপে walkthrough।
Introduce Foreign Method: নিজের ব্যাগে রাখা স্ট্যাপলার
স্কুলের ফটোকপি মেশিনে স্ট্যাপলার নেই — এই গল্প দিয়ে Introduce Foreign Method শেখো। যে class তুমি বদলাতে পারছ না সেখানে method নেই? সেই method নিজের class-এ লিখো, foreign object-কে parameter হিসেবে নাও। TypeScript আর C# extension method-এর উদাহরণসহ।
Introduce Local Extension: ভাড়ার দোকানের পাশে নিজের কেবিন বানাও
Introduce Local Extension রিফ্যাক্টরিং শেখো একটা গল্পের মাধ্যমে — যেখানে ভাড়া করা দোকানের পাশে নিজের কেবিন বানানো হয় যেটা পরিবর্তন করা যায় না। যখন একটা লক করা class-এ অনেক method নেই, সেগুলো একটা extension type-এ জড়ো করো — subclass, wrapper, বা আধুনিক C#/Kotlin extension class হিসেবে। TypeScript এবং C#-এ সম্পূর্ণ walkthrough।
Self Encapsulate Field: একজন দারোয়ান তোমার ডেটা পাহারা দিক
Self Encapsulate Field সহজভাবে বোঝানো — একটা class কেন তার নিজের field পড়া ও লেখার জন্য getter এবং setter ব্যবহার করে, নিরাপদ ধাপ, TypeScript ও C# উদাহরণসহ।
Replace Data Value with Object: তোমার Data-কে একটা নিজের ঘর দাও
Replace Data Value with Object সহজভাবে বোঝানো — কীভাবে একটা plain string বা number-কে validation আর behaviour সহ একটা ছোট class-এ রূপান্তর করতে হয়। TypeScript আর C# record-এর উদাহরণ দিয়ে।
Change Value to Reference: বিশটা ফটোকপি না, একটাই অফিস ফাইল
Change Value to Reference সহজ ভাষায় — একই entity-র ডুপ্লিকেট কপি কেন পুরনো হয়ে যায়, আর registry বা repository দিয়ে একটাই shared instance কীভাবে data consistent রাখে।
Change Reference to Value: যেকোনো ১০ টাকার নোটই সমান
Change Reference to Value সহজভাবে বোঝানো হয়েছে — একটা shared, mutable reference object-কে কীভাবে content-based equality সহ একটা ছোট immutable value object-এ রূপান্তর করতে হয়, TypeScript আর C# record-এর উদাহরণসহ।
Replace Array with Object: প্রতিটি জায়গাকে একটা নাম দাও
Replace Array with Object সহজ ভাষায় — কেন row[0], row[1], row[2]-এর মতো গোপন position-ওয়ালা array bug তৈরি করে, আর কীভাবে named field সহ একটা class কোডকে সৎ আর নিরাপদ করে তোলে।
Encapsulate Field: Object যেন নিজের ডেটা নিজে পাহারা দেয়
Encapsulate Field কী সেটা সহজ ভাষায় — কেন public field যেকোনো কোডকে object-এর ডেটা নষ্ট করতে দেয়, আর কীভাবে private field সাথে getter-setter দিয়ে object নিজেই সব নিয়ন্ত্রণ করে।
Encapsulate Collection: লাইভ লিস্ট বাইরে দেওয়া বন্ধ করো
Encapsulate Collection সহজ ভাষায় — কেন live array বা list return করলে যেকেউ তোমার object নষ্ট করে দিতে পারে, আর কীভাবে read-only view আর add/remove method দিয়ে নিয়ন্ত্রণ ফিরিয়ে আনা যায়।
Replace Type Code with Class: ম্যাজিক নম্বরকে একটা আসল পরিচয় দাও
Replace Type Code with Class রিফ্যাক্টরিং শেখো একটা স্কুলের গল্প দিয়ে — TypeScript আর C#-এ before/after দেখো, আর কখন Class, Subclasses বা State/Strategy বেছে নেবে সেটা একটা সহজ decision table দিয়ে বুঝে নাও।
Replace Type Code with Subclasses: যখন প্রতিটা ধরন সত্যিই আলাদা আচরণ করে
Replace Type Code with Subclasses refactoring শেখো ডে-স্কলার/বোর্ডার/হোস্টেলার গল্পের মাধ্যমে। TypeScript আর C#-এ switch কীভাবে মুছে যায়, আর Class vs Subclasses vs State/Strategy — কোনটা কখন নেবে সেটাও বুঝবে।
Replace Type Code with State/Strategy: যখন Type নিজেই বদলে যায়
Replace Type Code with State/Strategy refactoring শেখো prepaid থেকে postpaid SIM-এর গল্পের মাধ্যমে — TypeScript আর C#-এ swappable plan object, আর কখন Class vs Subclasses vs State/Strategy বেছে নেবে তার পুরো guide।
Decompose Conditional: জটিল if-কে সহজ নামে ভেঙে ফেলো
Decompose Conditional refactoring শেখো স্কুলের নোটিশের গল্প দিয়ে — সহজ TypeScript ও C# উদাহরণ, নিরাপদ ধাপ, আর IDE shortcut সহ।
Consolidate Conditional Expression: অনেক ছোট চেক, একটাই পরিষ্কার প্রশ্ন
স্কুল গেটের গল্প দিয়ে Consolidate Conditional Expression শেখো — TypeScript আর C# উদাহরণ, নিরাপদ ধাপ, আর side-effect-এর ফাঁদ যেটা না জানলেই নয়।
Consolidate Duplicate Conditional Fragments: মিষ্টির কাউন্টারটা বাইরে নিয়ে যাও
ক্যান্টিনের গল্প দিয়ে Consolidate Duplicate Conditional Fragments refactoring শেখো — TypeScript আর C# example, safety rules, আর সহজ step-by-step practice।
Remove Control Flag: পেয়ে গেলেই থেমে যাও
Remove Control Flag refactoring শেখো একজন দারোয়ানের গল্পের মাধ্যমে। TypeScript আর C# এর উদাহরণ দিয়ে বুঝবে break আর return কীভাবে control flag-এর জায়গা নেয়।
Guard Clause দিয়ে Nested Conditional সরাও: Arrow সমান করো
Guard clause কী, কীভাবে nested if-else-এর arrow shape ভেঙে code সমান করা যায় — মসজিদের গেটের গল্পের মাধ্যমে TypeScript আর C#-এ step-by-step শেখো।
Replace Conditional with Polymorphism: প্রতিটি ধরনকে তার নিজের ডেস্ক দাও
Replace Conditional with Polymorphism রিফ্যাক্টরিং শেখো স্কুল রিসেপশনের গল্প দিয়ে — বারবার আসা type switch কীভাবে subclass-এ পরিণত হয়, TypeScript ও C#-এ factory কীভাবে কাজ করে, আর কখন সাধারণ switch রেখে দেওয়াই ভালো সেটাও বুঝবে।
Introduce Null Object: 'কিছু নেই' কে একটা ভদ্র প্রতিনিধি দাও
Introduce Null Object refactoring শেখো একটা school guardian card-এর গল্পের মাধ্যমে — Tony Hoare-এর billion-dollar mistake, ছড়িয়ে-ছিটিয়ে থাকা null check গুলো, আর কীভাবে একটা ভদ্র default object সব সামলে নেয়। আর কখন null object আসলে bug লুকিয়ে ফেলতে পারে সেটাও জানবে।
Introduce Assertion: পরিবেশনের আগে ডাল চেখে দেখো
Introduce Assertion রিফ্যাক্টরিং শেখো একটা সতর্ক রাঁধুনির গল্প দিয়ে — লুকানো assumption গুলো executable check-এ বদলানো, C#-এ Debug.Assert আর TypeScript-এ asserts function, আর assertion আর input validation-এর মধ্যে আসল পার্থক্যটা।
Rename Method: দোকানের সাইনবোর্ড যেন সত্যি কথা বলে
Rename Method সহজভাবে বোঝানো — কেন method-এর নাম সত্যিটা বলতে হবে, কীভাবে নিরাপদে নাম বদলাতে হয় delegate পদ্ধতিতে, আর কীভাবে VS Code (F2) ও JetBrains (Shift+F6) দিয়ে এটা এক কীতেই সারা যায়।
Add Parameter: অর্ডার স্লিপে একটা নতুন কলাম
Add Parameter সহজ ভাষায় — কীভাবে method-কে নতুন একটা তথ্য দিতে হয় যেটা সে এখন চাইছে, কেন explicit parameter গ্লোবাল state লুকিয়ে রাখার চেয়ে ভালো, overload দিয়ে নিরাপদে কীভাবে করবে, আর কখন থামতে হবে যাতে parameter list বেশি বড় না হয়।
Remove Parameter: স্কুলের ফর্ম থেকে 'টেলিগ্রাম ঠিকানা' ঘরটা বাদ দাও
Remove Parameter সহজ ভাষায় — method আর যে parameter ব্যবহার করে না সেটা নিরাপদে কীভাবে মুছবে, মরা parameter গুলো পাঠককে কীভাবে বিভ্রান্ত করে আর প্রতিটা caller-কে বাড়তি কাজ করায়, আর মুছে ফেলার আগে কী কী চেক করতে হবে (interface, override, reflection)।
Separate Query from Modifier: জিজ্ঞেস করলেই বিল বাড়ে না তো?
Separate Query from Modifier সহজ ভাষায় — যে method একসাথে question করে আর state বদলায়, সেটাকে ভেঙে দুটো করো: একটা pure query আর একটা আলাদা command। Bertrand Meyer-এর Command-Query Separation (CQS) principle অনুযায়ী: question করলে answer বদলানো উচিত না।
Parameterize Method: একটাই জুসের রেসিপি, শুধু সাইজটা দিয়ে দাও
জুসের দোকানের গল্পের মাধ্যমে Parameterize Method রিফ্যাক্টরিং শেখো — TypeScript আর C# উদাহরণ সহ, নিরাপদ ধাপে ধাপে mechanics, আর সেই সিস্যার নিয়ম যেটা Replace Parameter with Explicit Methods-এর সাথে জুটি বাঁধে।
Replace Parameter with Explicit Methods: গোপন কোড নয়, নামের বোর্ড লাগাও
Replace Parameter with Explicit Methods refactoring শেখো একটা ব্যাংক কাউন্টারের গল্পের মাধ্যমে — TypeScript আর Python উদাহরণ, safe mechanics, আর seesaw rule যেটা Parameterize Method-এর সাথে এর সম্পর্ক বোঝায়।
Preserve Whole Object: পুরো ID Card দেখাও
Preserve Whole Object refactoring শেখো একটা school ID card-এর গল্প দিয়ে — TypeScript আর C# example সহ, safe step-by-step mechanics, আর object pass করলে coupling বাড়ে কিনা সেটার সৎ আলোচনা।
Replace Parameter with Method Call: দোকানদারকে তার নিজের দাম পড়ে শোনাতে যেও না
Replace Parameter with Method Call refactoring শেখো চায়ের দোকানের একটা মজার গল্পের মাধ্যমে — TypeScript আর C# উদাহরণসহ, নিরাপদ ধাপে ধাপে পদ্ধতি, আর testability-র সৎ হিসাব।
Introduce Parameter Object: পাঁচটা আলাদা উত্তর না দিয়ে একটা ঠিকানা কার্ড দাও
Introduce Parameter Object সহজ ভাষায় — একই parameter গ্রুপ বারবার বিভিন্ন method-এ ঘুরে বেড়ানো আসলে একটা লুকানো concept-এর চিহ্ন। সেগুলো একটা named object-এ bundle করলে signature ছোট হয়, order ভুল বন্ধ হয়, আর behaviour এসে জুটে যায়।
Remove Setting Method: কিছু জিনিস কলমে লেখা, পেন্সিলে না
Remove Setting Method সহজ ভাষায় — কেন এমন একটা field যেটা তৈরির পরে কখনো বদলানো উচিত না তার setter রাখা ঠিক না, আর কীভাবে read-only field, init-only property, আর record দিয়ে 'এটা বদলিও না' কথাটাকে compiler-এর গ্যারান্টিতে বদলানো যায়।
Hide Method: গোপন মশলা রান্নাঘরেই থাকে
Hide Method সহজ ভাষায় — যে method শুধু class নিজেই ব্যবহার করে সেটা public মেনুতে রাখা উচিত না কেন, আর visibility কমিয়ে private বা internal করলে API ছোট হয়, ভেতরের জিনিস সুরক্ষিত থাকে, আর ভয় ছাড়াই code বদলানো যায়।
Replace Constructor with Factory Method: নামে অর্ডার করো, রান্নাঘর ঠিক করুক
Replace Constructor with Factory Method রিফ্যাক্টরিং শেখো একটা ক্যান্টিনের গল্পের মাধ্যমে — before/after TypeScript ও C# কোড, নিরাপদ step-by-step migration, আর Factory Method ডিজাইন প্যাটার্নের সাথে পরিষ্কার তুলনা।
Replace Error Code with Exception: ব্যর্থতাকে চুপিচুপি নয়, সরাসরি জানাও
Replace Error Code with Exception রিফ্যাক্টরিং শেখো একটা সরকারি অফিসের গল্পের মাধ্যমে — before/after TypeScript আর C# উদাহরণ, নিরাপদ migration ধাপ, আর Result type-এর সাথে সৎ তুলনাসহ।
Replace Exception with Test: ভেতরে ঢোকার আগে বোর্ড দেখো
Replace Exception with Test (Replace Exception with Precheck) refactoring শেখো — চায়ের দোকানের গল্প দিয়ে, before/after TypeScript আর C# code দিয়ে, TryParse-style pattern দিয়ে, check-then-act race condition trap দিয়ে, আর modern তৃতীয় পথ হিসেবে Result type দিয়ে।
Pull Up Field: সবার জন্য একটাই নোটিশ বোর্ড
Pull Up Field refactoring শিখো একটা স্কুলের নোটিশ বোর্ডের গল্প দিয়ে — যে field প্রতিটা subclass-এ বারবার কপি হয়েছে সেটাকে superclass-এ তুলে দাও, TypeScript আর C#-এ নিরাপদ ধাপ, IDE সাপোর্ট, আর pull-up বনাম push-down কোনটা কখন করবে।
Pull Up Method: পুরো স্কুলের জন্য একটাই নির্দেশিকা
Pull Up Method refactoring শেখো স্কুলের ছুটির আবেদনের গল্পের মাধ্যমে — subclass-এ duplicate হয়ে যাওয়া method-গুলো superclass-এ তুলে আনো, TypeScript আর C#-এ safe steps সহ, IDE dialog আর কখন Form Template Method বেছে নেবে সেটাসহ।
Pull Up Constructor Body: একটাই সকালের রুটিন, তারপর নিজের কাজ
Pull Up Constructor Body refactoring শেখো school-এর সকালের রুটিনের গল্প দিয়ে — সব subclass constructor-এর শুরুতে যে duplicate initialization আছে, সেটা superclass constructor-এ তুলে নাও আর super/base দিয়ে call করো।
Push Down Field: সুইমিং পুলের সময়সূচি শুধু ৭সি-র বোর্ডেই লাগানো উচিত
Push Down Field refactoring শেখো একটা স্কুলের নোটিশ বোর্ডের গল্পের মাধ্যমে — superclass-এ থাকা কোনো field যদি শুধু কিছু subclass ব্যবহার করে, সেটাকে ঠিক সেই subclass-এ নামিয়ে দাও। TypeScript আর C#-এ নিরাপদ ধাপ, IDE dialog, আর pull-up বনাম push-down compass সহ।
Push Down Method: যে Method শুধু একটা Subclass ব্যবহার করে, সেটা সেখানে নামিয়ে দাও
Push Down Method শিখো একটা স্কুলের office গল্পের মাধ্যমে — superclass-এর সৎ contract, TypeScript আর C#-এ নিরাপদ ধাপে ধাপে move, আর কীভাবে এটা Refused Bequest smell ঠিক করে।
Extract Subclass: বিশেষ কেসটাকে তার নিজের class দাও
Extract Subclass শেখো একটা দর্জির দোকানের জরুরি অর্ডারের গল্পের মধ্যে দিয়ে — TypeScript আর C#-এ flag সরানোর পদ্ধতি, নিরাপদ ধাপে ধাপে কাজ, আর কখন subclassing ভুল সিদ্ধান্ত সেটাও বুঝবে।
Extract Superclass: দুটো যমজ class-এর জন্য একটাই সাধারণ নিয়মের বই
Extract Superclass refactoring শেখো সায়েন্স ল্যাব আর কম্পিউটার ল্যাবের গল্পের মাধ্যমে — TypeScript ও C#-এ pull-up move, superclass বনাম interface তুলনা টেবিল, এবং কীভাবে এটা Duplicate Code দূর করে।
Extract Interface: একটাই ফর্ম, কিন্তু হাজার রকমের কর্মী
Extract Interface রিফ্যাক্টরিং শেখো — রহিম ইলেকট্রিশিয়ান আর করিম প্লাম্বারের গেটের রেজিস্টারের গল্প দিয়ে। TypeScript আর C#-এ contract বের করা, test double বানানো, আর interface বনাম superclass কখন কোনটা বেছে নেবে সেই decision table।
Collapse Hierarchy: যখন Parent আর Child Class একই হয়ে যায়
একটা মহল্লার কমিটির গল্পের মাধ্যমে Collapse Hierarchy refactoring শেখো — TypeScript আর C#-এ superclass আর subclass মার্জ করার ধাপে ধাপে পদ্ধতি, আর কখন বুঝবে একটা hierarchy আর কাজে আসছে না।
Form Template Method: একটা রেসিপি কার্ড, অনেক রকম বিরিয়ানি
দুই চাচির বিরিয়ানির গল্প দিয়ে Form Template Method রিফ্যাক্টরিং শেখো — TypeScript আর Python-এ shared algorithm skeleton বের করার ধাপে ধাপে পদ্ধতি, আর কীভাবে এই রিফ্যাক্টরিং Template Method design pattern তৈরি করে।
Replace Inheritance with Delegation: কাউন্টার ভাড়া নাও, দোকান উত্তরাধিকারে নিও না
Replace Inheritance with Delegation রিফ্যাক্টরিং শেখো একটা মিষ্টির দোকানের গল্প দিয়ে — composition over inheritance-এর আসল মানে, fragile base class সমস্যা, আর TypeScript ও C#-এ ধাপে ধাপে রূপান্তর।
Replace Delegation with Inheritance: যখন সাহায্যকারীই হয়ে যায় শিক্ষানবিশ
Replace Delegation with Inheritance রিফ্যাক্টরিং শেখো একটা দর্জির দোকানের গল্পের মাধ্যমে — Middle Man smell কী, is-a শর্ত কীভাবে চেক করতে হয়, আর TypeScript ও C#-এ ধাপে ধাপে কীভাবে করতে হয় সব বিস্তারিত দেখো।