আপনারা যাদের ভাগ্যবান তাদের গতিশীল সুযোগ নিয়ে কোনও ভাষায় কাজ না করার জন্য, আমি কীভাবে এটি কাজ করে তা সম্পর্কে আপনাকে একটু রিফ্রেশার দেই। "রুবেলা" নামে একটি ছদ্ম-ভাষাটি কল্পনা করুন, এটি এরকম আচরণ করে:
function foo() {
print(x); // not defined locally => uses whatever value `x` has in the calling context
y = "tetanus";
}
function bar() {
x = "measles";
foo();
print(y); // not defined locally, but set by the call to `foo()`
}
bar(); // prints "measles" followed by "tetanus"
এটি হল, ভেরিয়েবলগুলি কল স্ট্যাকটি অবাধে উপরে এবং নীচে প্রচার করে - সংজ্ঞায়িত সমস্ত ভেরিয়েবলগুলি foo
তার কলারের কাছে (এবং পরিবর্তনের মাধ্যমে) দৃশ্যমান এবং বিপরীতটিও bar
সত্য। কোড রিফ্যাক্টোরেবিলিটির জন্য এটির গুরুতর জরুরী বিষয় রয়েছে। কল্পনা করুন যে আপনার নিম্নলিখিত কোড রয়েছে:
function a() { // defined in file A
x = "qux";
b();
}
function b() { // defined in file B
c();
}
function c() { // defined in file C
print(x);
}
এখন, কলগুলি a()
প্রিন্ট হবে qux
। তবে, b
কোনও দিন , আপনি সিদ্ধান্ত নিয়েছেন যে আপনাকে কিছুটা পরিবর্তন করা দরকার । আপনি সমস্ত কলিং কনটেক্সটগুলি জানেন না (যার মধ্যে কিছু আসলে আপনার কোডবেজের বাইরেও থাকতে পারে) তবে এটি ঠিক হওয়া উচিত - আপনার পরিবর্তনগুলি পুরোপুরি অভ্যন্তরীণ হতে চলেছে b
, তাই না? সুতরাং আপনি এটি আবার লিখুন:
function b() {
x = "oops";
c();
}
আপনি মনে করতে পারেন যে আপনি কোনও স্থানীয় পরিবর্তনশীল সংজ্ঞায়িত করার কারণে আপনি কোনও পরিবর্তন করেননি। কিন্তু, আসলে, আপনি ভেঙে দিয়েছেন a
! এখন, পরিবর্তে a
প্রিন্ট ।oops
qux
সিউডো-ভাষাগুলির ক্ষেত্র থেকে এটিকে ফিরিয়ে আনা, এমএমএমপিএস ঠিক একইভাবে আচরণ করে, যদিও বিভিন্ন সিনট্যাক্স সহ।
এমএমএমপিএসের আধুনিক ("আধুনিক") সংস্করণগুলিতে তথাকথিত NEW
বিবৃতি অন্তর্ভুক্ত রয়েছে , যা আপনাকে কলার থেকে কলিতে ফাঁস হওয়া থেকে ভেরিয়েবলগুলি প্রতিরোধ করতে দেয়। সুতরাং উপরে প্রথম উদাহরণে, আমরা যদি করেছে NEW y = "tetanus"
মধ্যে foo()
, তারপর print(y)
মধ্যে bar()
কিছুই প্রিন্ট হবে (মাম্পস, সব নাম খালি স্ট্রিং নির্দেশ যদি না স্পষ্টভাবে অন্য কিছু সেট)। তবে কলার থেকে কলিতে যাওয়া থেকে ভেরিয়েবলগুলি আটকাতে পারে এমন কিছুই নেই: আমাদের কাছে যদি জানা থাকে তবে আমরা প্যারামিটার হিসাবে স্পষ্টভাবে না পেয়েও পরিবর্তন করতে function p() { NEW x = 3; q(); print(x); }
পারি । এটি এখনও খারাপ পরিস্থিতি হিসাবে রয়েছে, তবে সম্ভবত এটি আগের মতো খারাপ নয় ।q()
x
x
এই বিপদগুলি মাথায় রেখে, আমরা কীভাবে নিরাপদে এমএমপিএস বা গতিশীল স্কোপিং সহ অন্য কোনও ভাষায় কোডটি রিফেক্টর করতে পারি?
সেখানে আরও সহজ refactoring উপার্জন, কখনও আপনি যাদের আরম্ভ (ছাড়া অন্য কোনো ফাংশনে ভেরিয়েবল ব্যবহার করার মত কিছু সুস্পষ্ট ভাল অনুশীলন হয় NEW
) নিজের বা কোনো স্পষ্ট প্যারামিটার হিসাবে গৃহীত হয়, এবং স্পষ্টভাবে কোনো প্যারামিটার দলিল হয় পরোক্ষভাবে একটি ফাংশন এর কলারের থেকে গৃহীত। তবে দশক-পুরাতন, 10 ডলার 8- কোড কোডবেসে, এগুলি বিলাসবহুল যা প্রায়শই হয় না।
এবং, অবশ্যই, ডেক্সটিক স্কোপ সহ ভাষাগুলিতে রিফ্যাক্টরিংয়ের জন্য সমস্ত ভাল অভ্যাসগুলি গতিশীল স্কোপ - রাইট টেস্ট, এবং আরও অনেক কিছু ভাষায় প্রযোজ্য। তাহলে, প্রশ্নটি হ'ল: কীভাবে আমরা পুনরায় চুল্লি করার সময় গতিশীল-স্কোপড কোডের বর্ধিত ভঙ্গুরতার সাথে বিশেষত যুক্ত ঝুঁকিগুলি হ্রাস করব?
(দ্রষ্টব্য যে আপনি কীভাবে গতিশীল ভাষায় লিখিত এবং রিফ্যাক্টর কোডটি ব্যবহার করবেন? এই প্রশ্নের একই শিরোনাম রয়েছে, এটি সম্পূর্ণ সম্পর্কিত নয়))