আপনি কীভাবে গতিশীল সুযোগ নিয়ে কোনও ভাষায় নিরাপদে রিফ্যাক্টর করবেন?


13

আপনারা যাদের ভাগ্যবান তাদের গতিশীল সুযোগ নিয়ে কোনও ভাষায় কাজ না করার জন্য, আমি কীভাবে এটি কাজ করে তা সম্পর্কে আপনাকে একটু রিফ্রেশার দেই। "রুবেলা" নামে একটি ছদ্ম-ভাষাটি কল্পনা করুন, এটি এরকম আচরণ করে:

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প্রিন্ট ।oopsqux


সিউডো-ভাষাগুলির ক্ষেত্র থেকে এটিকে ফিরিয়ে আনা, এমএমএমপিএস ঠিক একইভাবে আচরণ করে, যদিও বিভিন্ন সিনট্যাক্স সহ।

এমএমএমপিএসের আধুনিক ("আধুনিক") সংস্করণগুলিতে তথাকথিত NEWবিবৃতি অন্তর্ভুক্ত রয়েছে , যা আপনাকে কলার থেকে কলিতে ফাঁস হওয়া থেকে ভেরিয়েবলগুলি প্রতিরোধ করতে দেয়। সুতরাং উপরে প্রথম উদাহরণে, আমরা যদি করেছে NEW y = "tetanus"মধ্যে foo(), তারপর print(y)মধ্যে bar()কিছুই প্রিন্ট হবে (মাম্পস, সব নাম খালি স্ট্রিং নির্দেশ যদি না স্পষ্টভাবে অন্য কিছু সেট)। তবে কলার থেকে কলিতে যাওয়া থেকে ভেরিয়েবলগুলি আটকাতে পারে এমন কিছুই নেই: আমাদের কাছে যদি জানা থাকে তবে আমরা প্যারামিটার হিসাবে স্পষ্টভাবে না পেয়েও পরিবর্তন করতে function p() { NEW x = 3; q(); print(x); }পারি । এটি এখনও খারাপ পরিস্থিতি হিসাবে রয়েছে, তবে সম্ভবত এটি আগের মতো খারাপ নয় ।q()xx

এই বিপদগুলি মাথায় রেখে, আমরা কীভাবে নিরাপদে এমএমপিএস বা গতিশীল স্কোপিং সহ অন্য কোনও ভাষায় কোডটি রিফেক্টর করতে পারি?

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

এবং, অবশ্যই, ডেক্সটিক স্কোপ সহ ভাষাগুলিতে রিফ্যাক্টরিংয়ের জন্য সমস্ত ভাল অভ্যাসগুলি গতিশীল স্কোপ - রাইট টেস্ট, এবং আরও অনেক কিছু ভাষায় প্রযোজ্য। তাহলে, প্রশ্নটি হ'ল: কীভাবে আমরা পুনরায় চুল্লি করার সময় গতিশীল-স্কোপড কোডের বর্ধিত ভঙ্গুরতার সাথে বিশেষত যুক্ত ঝুঁকিগুলি হ্রাস করব?

(দ্রষ্টব্য যে আপনি কীভাবে গতিশীল ভাষায় লিখিত এবং রিফ্যাক্টর কোডটি ব্যবহার করবেন? এই প্রশ্নের একই শিরোনাম রয়েছে, এটি সম্পূর্ণ সম্পর্কিত নয়))



@gnat আমি দেখতে পাচ্ছি না যে প্রশ্ন / উত্তরগুলি এই প্রশ্নের সাথে কীভাবে প্রাসঙ্গিক।
সেনশিন

1
@gnat আপনি কি বলছেন যে উত্তরটি "বিভিন্ন প্রক্রিয়া এবং অন্যান্য হেভিওয়েট স্টাফ ব্যবহার করুন"? মানে, এটি সম্ভবত ভুল নয়, তবে এটি বিশেষভাবে কার্যকর না হওয়ার দিক থেকেও সাধারণ over
সেনশিন

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

4
কমপক্ষে আপনি এমএমএসপিএসকে একটি ন্যক্কারজনক রোগের নামানুসারে মিথ্যা বিজ্ঞাপন দেওয়ার জন্য অভিযোগ করতে পারবেন না।
কারসন 63000

উত্তর:


4

কি দারুন.

আমি ভাষা হিসাবে এমএমপিএস জানি না, তাই আমার মন্তব্যটি এখানে প্রযোজ্য কিনা তা আমি জানি না। সাধারনত বলতে - আপনার অবশ্যই অভ্যন্তরীণ থেকে চুল্লি। গ্লোবাল স্টেটের (গ্লোবাল ভেরিয়েবল) consumers গ্রাহকদের (পাঠক) অবশ্যই পরামিতিগুলি ব্যবহার করে পদ্ধতি / ফাংশন / পদ্ধতিতে রিফ্যাক্ট করতে হবে। রিফ্যাক্টরিংয়ের পরে পদ্ধতিটি সিটির মতো দেখতে হবে:

function c(c_scope_x) {
   print c(c_scope_x);
}

গ এর সমস্ত ব্যবহার অবশ্যই পুনরায় লিখতে হবে (যা একটি যান্ত্রিক কাজ)

c(x)

এটি স্থানীয় রাজ্য ব্যবহার করে বৈশ্বিক রাষ্ট্র থেকে "অভ্যন্তরীণ" কোডটি বিচ্ছিন্ন করা। আপনি যখন এটি সম্পন্ন করবেন তখন আপনাকে বিতে আবার লিখতে হবে:

function b() {
   x="oops"
   print c(x);
}

পার্শ্ব প্রতিক্রিয়া রাখতে x = "ওফস" অ্যাসাইনমেন্ট রয়েছে। এখন আমাদের অবশ্যই খ-কে বৈশ্বিক রাষ্ট্রকে দূষক হিসাবে বিবেচনা করা উচিত যদি আপনার কাছে কেবল একটি দূষিত উপাদান থাকে তবে এই রিফ্যাক্টরিংটি বিবেচনা করুন:

function b() {
   x="oops"
   print c(x);
   return x;
}

শেষের সাথে বি এর প্রতিটি ব্যবহারকে x = b () দিয়ে লিখুন। ফাংশন বি এই রিফ্যাক্টরিং করার সময় অবশ্যই ইতিমধ্যে পরিষ্কার হওয়া পদ্ধতিগুলি ব্যবহার করতে হবে (আপনি চাইলে পুনরায় নামকরণ কো এটি পরিষ্কার করে দিতে পারেন)। এর পরে আপনার বৈশ্বিক পরিবেশকে দূষিত না করার জন্য রিফ্যাক্টর বি করা উচিত।

function b() {
   newvardefinition b_scoped_x="oops"
   print c_cleaned(b_scoped_x);
   return b_scoped_x;
}

b_Cananed নাম পরিবর্তন করুন। আমি অনুমান করি যে আপনাকে সেই রিফ্যাক্টরিংয়ের সাথে অভ্যস্ত হওয়ার জন্য কিছুটা খেলতে হবে। নিশ্চিত যে প্রতিটি পদ্ধতি এটি দ্বারা রিফ্যাক্ট করা যাবে না তবে আপনাকে অভ্যন্তরীণ অংশগুলি থেকে শুরু করতে হবে। একটি ধারণা পেতে Eclipse এবং java (এক্সট্র্যাক্ট পদ্ধতি) এবং "গ্লোবাল স্টেট" ওরফে শ্রেণীর সদস্যদের দিয়ে চেষ্টা করুন।

function x() {
  fifth_to_refactor();
  {
    forth_to_refactor()
    ....
    {
      second_to_refactor();
    }
    ...
    third_to_refactor();
  }
  first_to_refactor()
}

HTH।

প্রশ্ন: এই বিপদগুলি মাথায় রেখে আমরা কীভাবে নিরাপদে এমএমপিএসে কোডটি বা গতিশীল স্কোপিংয়ের সাথে অন্য কোনও ভাষায় রাখতে পারি?

  • অন্য কেউ ইঙ্গিত দিতে পারে।

প্রশ্ন: রিফ্যাক্টরিং করার সময় আমরা গতিশীল-স্কোপড কোডের বর্ধিত ভঙ্গুরতার সাথে বিশেষত যুক্ত ঝুঁকিগুলি কীভাবে কম করব?

  • একটি প্রোগ্রাম লিখুন, যা আপনার জন্য নিরাপদ রিফ্যাক্টরিংগুলি করে।
  • একটি প্রোগ্রাম লিখুন, যা নিরাপদ প্রার্থী / প্রথম প্রার্থীদের চিহ্নিত করে।

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

ঠিক আছে আমার উত্তর যথেষ্ট হিসাবে বিবেচনা। ইউটিউব ভিডিও আমি মনে করি @ গুগল স্কেলে রিফ্যাক্টরিং খুব অনন্য পদ্ধতির কাজ করেছে। তারা একটি এএসটি পার্স করার জন্য ঝাঁকুনি ব্যবহার করেছিল এবং তারপরে তাদের কোডটি রিফ্যাক্টর করার জন্য কোনও অনুসন্ধান (এমনকি লুকানো ব্যবহার) সন্ধান করতে তাদের নিজস্ব অনুসন্ধান ইঞ্জিন ব্যবহার করেছিল। এটি প্রতিটি ব্যবহার সন্ধান করার উপায় হতে পারে। আমার অর্থ মাম্পস কোডে পার্স এবং অনুসন্ধানের পদ্ধতির।
thepacker

2

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

অন্ততপক্ষে আপনার কাছে বিশ্বব্যাপী অনুসন্ধান করার একটি সুযোগ রয়েছে এবং সিস্টেমের যে অংশগুলিতে আপনি কোনও কোড পরিবর্তনের মাধ্যমে প্রভাবের প্রত্যাশা করেন সেগুলির জন্য রিগ্রেশন টেস্ট যুক্ত করার সুযোগ রয়েছে।

আপনি যদি প্রথমটি সম্পাদন করার সুযোগ না দেখেন তবে আমার সেরা পরামর্শটি হ'ল: অন্য মডিউলগুলি পুনরায় ব্যবহার করা মডিউলগুলি রিফেক্টর করবেন না বা যার জন্য আপনি জানেন না যে অন্যরা তাদের উপর নির্ভর করে । যুক্তিসঙ্গত আকারের যে কোনও কোডবেসে সম্ভাবনা বেশি থাকে আপনি এমন কোনও মডিউল খুঁজে পেতে পারেন যার উপর নির্ভর করে অন্য কোনও মডিউল নির্ভর করে না। সুতরাং আপনার যদি বি এর উপর নির্ভর করে একটি মোড এ থাকে তবে তদ্বিপরীত নয় এবং অন্য কোনও মডিউল এ-এর উপর নির্ভর করে না, এমনকি গতিশীলভাবে স্কোপড ভাষায়, আপনি বি বা অন্য কোনও মডিউল ভঙ্গ না করে এ এ পরিবর্তন করতে পারেন।

এটি আপনাকে A থেকে B এর নির্ভরতা A থেকে B2 এর নির্ভরতার সাথে প্রতিস্থাপন করার সুযোগ দেয়, যেখানে B2 একটি স্যানিটাইজড, বি-র পুনরায় লিখিত সংস্করণ, কোডটি তৈরি করার জন্য আপনি উপরে উল্লিখিত বিধিগুলি সহ নতুন লিখিত হওয়া উচিত আরও বিকশিত এবং রিফ্যাক্টর সহজ।


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

এই নিবন্ধটি পড়ার পরে , আমি নিশ্চিত যে আমি আপনাকে আপনার কাজের জন্য enর্ষা করব না।
ডক ব্রাউন

0

: সুস্পষ্ট রাষ্ট্র এখানে refactoring কিভাবে করবেন? খুব সাবধানে এগিয়ে যান।

(যেমনটি আপনি বর্ণনা করেছেন, বিদ্যমান কোড বেসটি বিকাশ করা এবং বজায় রাখা যথেষ্ট কঠিন হওয়া উচিত, এটি পুনরায় চুল্লী করার চেষ্টা করা যাক))

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

তারপরে আপনি অন্য রিফ্যাক্টরিংয়ের সাথে এগিয়ে যেতে পারেন এবং পরীক্ষা করে যাচ্ছেন যে আপনি যাওয়ার সময় কোনও পরীক্ষা ভাঙ্গেন নি।

শেষ অবধি, আপনি পরীক্ষাগুলি লিখতে শুরু করতে পারেন যা নতুন কার্যকারিতা আশা করে এবং তারপরে সেই পরীক্ষাগুলি কার্যকর করার জন্য কোডটি লিখতে পারেন।

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