পদ্ধতির পরামিতিগুলির পুনরায় ব্যবহার করা কি খারাপ অভ্যাস?


12

এমন সময় আছে যখন আমাকে পদ্ধতির মধ্যে থেকেই কোনও পদ্ধতিতে পাস করা কোনও মান পরিবর্তন করতে হবে। একটি উদাহরণ এখানে যেমন এই স্ট্রিং যেমন একটি স্ট্রিং স্যানিটাইজেশন করা হবে:

void SanitizeName(string Name)
{
    Name = Name.ToUpper();

    //now do something here with name
}

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

অতএব, যুক্তিটি নিজেই আবার জমা দেওয়ার পরিবর্তে আমি সর্বদা এর মতো একটি স্থানীয় অনুলিপি তৈরি করি:

void SanitizeName(string Name)
{
    var SanitizedName = Name.ToUpper();

    //now do something here with name
}

এটি নিশ্চিত করে যে মানটি পাস করার পরিবর্তনের ফলে পদ্ধতির বাইরে যাওয়া কখনই প্রভাবিত করবে না, তবে আমি ভাবছি যে আমি এই সম্পর্কে অত্যধিক ভ্রান্ত হই।


1
হ্যাঁ, এটা খারাপ অভ্যাস; এবং না এটি নিরীহ নয়। লাইনটি Name = Name.ToUpper();কোডটিকে Nameপরিবর্তনের মান হিসাবে অনুসরণ করতে শক্ত করে তোলে । আপনার দ্বিতীয় উদাহরণটি কেবল ভবিষ্যতের প্রমাণ নয়, এটি কী করছে তা যুক্তিযুক্ত করা আরও সহজ।
ডেভিড আরনো

2
তবে কি if (param == NULL) param = default_value;?
আরগায়ার

আমি মনে করি এটি হ্যাঁ / না হিসাবে সহজ নয়।
মিঃ স্মিথ 42

3
যদি "ভবিষ্যতে কোনও বিকাশকারী সমস্ত মানকে রেফ দিয়ে পাস করার সিদ্ধান্ত নিয়েছে" , আমি সম্ভবত সেই ডেভ, প্যারামিটারের পুনরায় ব্যবহারের সাথে জড়িত বা নেই ;-) সত্যই, যখন কেউ কোনও মান পাস করার সিদ্ধান্ত নেয় by refযা উত্তীর্ণ হয়নি probably আগেই উপায়, এবং কোনও কারণে স্থানীয় অ্যাক্সেসকে কোনও অ-স্থানীয় অ্যাক্সেসে রূপান্তর করার কারণে, তিনি সর্বদা সতর্কতার সাথে ফলাফলগুলি পরীক্ষা করে দেখতে পারেন।
ডক ব্রাউন

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

উত্তর:


10

আমি মনে করি এটি আপনার প্রকল্পের কোডিং কনভেনশনগুলির উপর নির্ভর করে।

আমি ব্যক্তিগতভাবে গ্রীকটিকে finalপ্রতিটি ভেরিয়েবল এবং প্যারামিটারে কীওয়ার্ডটি স্বয়ংক্রিয়ভাবে যুক্ত করতে দিয়েছি । কোনও প্যারামিটার পুনরায় ব্যবহার করা হলে আপনি প্রথম নজরে দেখুন।

আমার কাজের প্রকল্পে আমরা প্যারামিটারগুলি পুনরায় ব্যবহার করার পরামর্শ দিই না, তবে আপনি যদি কেবল কল করতে চান .trim()বা কোনও nullক্ষেত্রে একটি ডিফল্ট সেট করতে চান তবে আমরা প্যারামিটারটি বেশিরভাগ সময় পুনরায় ব্যবহার করি কারণ একটি নতুন ভেরিয়েবল প্রবর্তন যেমন ক্ষেত্রে কম পঠনযোগ্য হয় প্যারামিটারের পুনঃব্যবহারের চেয়ে।

খুব আলাদা বিষয়বস্তু সঞ্চয় করার জন্য আপনার প্যারামিটারটি সত্যই পুনরায় ব্যবহার করা উচিত নয় কারণ নামটি আর এর সামগ্রীতে উল্লেখ করে না। তবে এটি ভেরিয়েবলের প্রতিটি পুনর্নির্মাণের ক্ষেত্রে সত্য এবং পরামিতিগুলিতে সীমাবদ্ধ নয়।

সুতরাং আপনার দলের সাথে একত্রিত হন এবং কোডিং কনভেনশনগুলি প্রস্তুত করুন যা এই বিষয়টিকে আচ্ছাদন করে।


0

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


আপনি বেশিরভাগ ক্ষেত্রে কোড বিশ্লেষককে বোঝাতে কোনও ধরণের টিকা বা বিশেষ মন্তব্য ব্যবহার করতে পারেন যে এটি লক্ষ্যযুক্ত ঝুঁকি নয়।
মিঃ স্মিথ 42

0

এর উত্তরটি আপনার কোডটি কে পড়বে তার উপর 100% নির্ভর করে। তারা কোন স্টাইলগুলি সবচেয়ে সহায়ক বলে মনে করে?

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

বলা হচ্ছে, মানসিক মডেল বদলে যায়। আপনার নির্দিষ্ট বিকাশের পরিবেশে name"সময়ের এই সময়ে নামটির সেরা উপস্থাপনা" হওয়া বাঞ্ছনীয় হতে পারে । আপনি চলাকালীন তাদের মানগুলিতে কিছু পরিবর্তন করেছেন তবুও আপনি তাদের যুক্তিগুলির সাথে সুস্পষ্টভাবে যে ভেরিয়েবলগুলি নিয়ে কাজ করছেন তা লিঙ্ক করা বাঞ্ছনীয়। এমনকি আরও বেশি বড় আকারের বস্তু তৈরির পরিবর্তে কিছু নির্দিষ্ট ভেরিয়েবল পুনরায় ব্যবহার করার জন্য যথেষ্ট রানটাইম সুবিধাও থাকতে পারে। সর্বোপরি, আপনি যখন 4 গিগাবাইট স্ট্রিং নিয়ে কাজ করছেন তখন আপনার যে অতিরিক্ত অনুলিপিগুলি তৈরি করতে হবে তা হ্রাস করতে খুব ভাল লাগছে!


-1

আপনার কোড উদাহরণের সাথে আমার সম্পূর্ণ ভিন্ন সমস্যা আছে:

আপনার পদ্ধতির নাম SanitizeName। এই ক্ষেত্রে, আমি এটি একটি নাম স্যানিটাইজ করা আশা করি ; কারণ এটি, আপনি আপনার ফাংশনটির পাঠককে কী বলবেন।

আপনার কেবলমাত্র কাজটি করা উচিত , একটি প্রদত্ত নামকে স্যানিটাইজ করা । আপনার কোডটি না পড়ে, আমি নিম্নলিখিতটি আশা করব:

string SanitizeName(string Name)
{
    //somehow sanitize the name
    return Result;
}

তবে আপনি বোঝাচ্ছেন যে আপনার পদ্ধতিটি কেবল স্যানিটাইজংয়ের চেয়ে কিছুটা বেশি করে । এটি একটি কোড গন্ধ এবং এড়ানো উচিত।

আপনার প্রশ্নটি সম্পর্কে নয়: পদ্ধতির পরামিতিগুলির পুনরায় ব্যবহার করা কি খারাপ অভ্যাস? এটি আরও: পার্শ্ব প্রতিক্রিয়া এবং অনির্দিষ্ট আচরণ খারাপ অভ্যাস?

তার উত্তর পরিষ্কার: হ্যাঁ!

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

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

পার্শ্ব প্রতিক্রিয়াগুলির তুলনায় সমস্যাটির পুনঃব্যবহার কম । পার্শ্ব প্রতিক্রিয়া রোধ করতে কোনও ভেরিয়েবল পুনরায় ব্যবহার করবেন না । আপনার কোনও পার্শ্ব প্রতিক্রিয়া না থাকলে কোনও সমস্যা নেই।


4
-1 এটি মূল প্রশ্নের উত্তর দেয় না। প্রদত্ত কোডটি হ'ল প্রশ্নটি দেখানোর জন্য একটি নমুনা কোড। প্রদত্ত নমুনা কোডটিকে "আক্রমণ করা" / পর্যালোচনা করার পরিবর্তে প্রশ্নের উত্তর দিন।
নিক্লাস এইচ

1
@ নিক্ল্যাশ এই প্রশ্নের সঠিকভাবে উত্তর দেয়: আপনি যদি ফাংশনের অভ্যন্তরে প্যারামিটারটি পরিচালনা করেন এবং যেমন উল্লেখ করেছেন যে আপনি দুর্ঘটনাক্রমে কোনও অনুলিপি পরিবর্তে একটি রেফারেন্স সহ কাজ করেন, এটি পার্শ্ব প্রতিক্রিয়া সৃষ্টি করে (যেমন আমি বলেছি) এবং এটি খারাপ। এটি রোধ করার জন্য আপনি পদ্ধতির নামটি সাবধানতার সাথে (রুবির '!' ভাবেন) বা / অথবা কোনও রিটার্নের ধরন চয়ন করে পরিবর্তনশীল পরিবর্তন করতে চলেছেন। আপনি যদি ভেরিয়েবল পরিবর্তন না করেন তবে শুধুমাত্র অনুলিপি সহ কাজ করুন।
থমাস জাঙ্ক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.