কোনও ক্রিয়াকলাপটি কতগুলি পরামিতি গ্রহণ করবে সে সম্পর্কে কি গাইডলাইন রয়েছে?


114

আমি functions বা তার বেশি পরামিতি নিয়ে কাজ করেছি এমন কয়েকটি ফাংশন আমি লক্ষ্য করেছি, যেখানে বেশিরভাগ লাইব্রেরিতে আমি এটি ব্যবহার করি যা 3 এর বেশি লাগে এমন কোনও ফাংশন সন্ধান করা বিরল।

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


4
@ ওমিনিস: ধারণাটি হল আপনি নিজের ক্লাসগুলিকে ফোকাস রাখতে চান। ফোকাসযুক্ত ক্লাসগুলিতে সাধারণত এতটা নির্ভরতা / বৈশিষ্ট্য থাকে না সুতরাং আপনার কনস্ট্রাক্টরের কাছে কম পরামিতি থাকতে হবে। কিছু buzz এই শব্দ মানুষ এই সময়ে মধ্যে নিক্ষেপ করা হয় উচ্চ সংযোগ এবং একক দায়িত্ব নীতি । আপনি যদি মনে করেন যে এগুলি লঙ্ঘিত হয়নি এবং এখনও প্রচুর পরম প্রয়োজন হয় তবে বিল্ডার প্যাটার্নটি ব্যবহার করে বিবেচনা করুন।
সি_মেকার 20

2
অবশ্যই MPI_Sendrecv () এর উদাহরণ অনুসরণ করবেন না , যা 12 টি প্যারামিটার নেয়!
খ্রিস্টিয়াকক

6
আমি বর্তমানে যে প্রকল্পে কাজ করছি তাতে একটি নির্দিষ্ট কাঠামো ব্যবহার করা হয়, যেখানে 10+ পরামিতি সহ পদ্ধতিগুলি সাধারণ। আমি কয়েকটি নির্দিষ্ট জায়গায় 27 পরামিতিগুলির সাথে একটি বিশেষ পদ্ধতি কল করছি। যতবারই এটি দেখি আমি একটু ভিতরেই মরে যাই।
perp

3
ফাংশন আচরণের পরিবর্তন করতে কখনই বুলিয়ান সুইচ যুক্ত করবেন না। পরিবর্তে ফাংশন বিভক্ত করুন। সাধারণ ক্রিয়াকলাপটিকে নতুন ফাংশনে ভাঙ্গা।
কেভিন cline

2
@ ওমিনিস কি? মাত্র 10 পরামিতি? এটি কিছুই নয়, আরও অনেক কিছু প্রয়োজন । : ডি
মার্টিনাস

উত্তর:


106

আমি কখনই কোনও গাইডলাইন দেখিনি, তবে আমার অভিজ্ঞতায় এমন একটি ফাংশন যা তিন বা চারটি পরামিতির বেশি লাগে দুটি সমস্যার মধ্যে একটিকে নির্দেশ করে:

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

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

এটি করে কিছু ভাল লাভ হতে পারে:

  • এটি আপনার কোডটি পড়া সহজ করে তোলে। আমি ব্যক্তিগতভাবে একটি ifকাঠামোর তৈরি একটি "বিধি তালিকা" পড়া খুব সহজ মনে করি যা একটি কাঠামোর চেয়ে বর্ণনামূলক নামের সাথে প্রচুর পদ্ধতি কল করে যা এটি একটি পদ্ধতিতে সমস্ত করে।
  • এটি আরও ইউনিট পরীক্ষামূলক। আপনি নিজের সমস্যাটি কয়েকটি ছোট ছোট কাজগুলিতে বিভক্ত করেছেন যা স্বতন্ত্রভাবে খুব সহজ। ইউনিট পরীক্ষা সংগ্রহটি এমন একটি আচরণগত পরীক্ষার স্যুট দিয়ে তৈরি করা হবে যা মাস্টার পদ্ধতির মাধ্যমে পাথগুলি পরীক্ষা করে এবং প্রতিটি পৃথক পদ্ধতির জন্য ছোট পরীক্ষার সংগ্রহ করে।

5
পরামিতি বিমূর্তি একটি ডিজাইনের প্যাটার্নে পরিণত হয়েছে? আপনার যদি 3 টি প্যারামিটার ক্লাস থাকে তবে কি হবে। পরামিতিগুলির বিভিন্ন সম্ভাব্য সংমিশ্রণগুলি পরিচালনা করতে আপনি আরও 9 টি পদ্ধতি ওভারলোড যুক্ত করেন? এটিকে অদ্ভুত হে (এন ^ 2) পরামিতি ঘোষণার সমস্যার মতো মনে হচ্ছে। ওহ অপেক্ষা করুন, আপনি কেবল জাভা / সি # তে 1 বর্গ উত্তরাধিকারী হতে পারেন যাতে এটি অনুশীলনে কাজ করতে আরও কিছু বায়োপ্লেরলেট (সম্ভবত আরও কিছু সাবক্লাসিং) প্রয়োজন হবে। দুঃখিত, আমি নিশ্চিত নই কোনও ভাষা আরও উদ্বেগজনক পদ্ধতির উপেক্ষা করা জটিলতার পক্ষে প্রস্তাব দিতে পারে কেবল ভুল বলে মনে করে।
ইভান প্লেস

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

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

@ মিশেলক যদি আপনি এগুলি কখনও ব্যবহার না করেন তবে 'অবজেক্ট ইনিশিয়ালাইজার' গুগল করার চেষ্টা করুন। এটি একটি সুন্দর অভিনব পদ্ধতির যা সংজ্ঞা বয়লারপ্লেট উল্লেখযোগ্যভাবে হ্রাস করে। তত্ত্ব অনুসারে, আপনি একটি শটে একটি ক্লাস নির্মাতা, পরামিতি এবং ওভারলোডগুলি সরিয়ে ফেলতে পারেন। যদিও অনুশীলনে, সাধারণ কন্সট্রাক্টরকে বজায় রাখা এবং বাকি অস্পষ্ট / কুলুঙ্গি বৈশিষ্ট্যের জন্য 'অবজেক্ট ইনিশিয়ালাইজার' সিনট্যাক্সের উপর নির্ভর করা ভাল good আইএমএইচও, আপনি স্থিতিশীলভাবে টাইপিত ভাষায় গতিশীল টাইপ করা ভাষার প্রকাশের নিকটতমতম স্থান।
ইভান প্লেস

@ এভাইন প্লেস: কখন থেকে ডায়নামিকভাবে টাইপ করা ভাষা প্রকাশিত হয়?
টমাসএক্স

41

"ক্লিন কোড: এ হ্যান্ডবুক অফ এগিল সফটওয়্যার ক্র্যাফটসম্যানশিপ" অনুসারে শূন্য আদর্শ, এক বা দু'টি গ্রহণযোগ্য, বিশেষ ক্ষেত্রে তিনটি এবং চার বা ততোধিক, কখনই নয়!

লেখকের কথা:

কোনও ক্রিয়াকলাপের জন্য আর্গুমেন্টের আদর্শ সংখ্যা শূন্য (নীলাদিক)। এরপরে আসে এক (একাকী), তার পরে দু'জনে (ডায়াডিক) closely তিনটি যুক্তি (ট্রায়ডিক) যেখানে সম্ভব সেখানে এড়ানো উচিত। তিনটিরও বেশি (পলিয়েডিক) খুব বিশেষ ন্যায্যতা প্রয়োজন — তারপরে যাইহোক এটি ব্যবহার করা উচিত নয়।

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

আমার ব্যক্তিগত মতামত হিসাবে, একটি পরামিতি কারও চেয়ে ভাল, কারণ আমি মনে করি যা চলছে তা আরও পরিষ্কার।

উদাহরণস্বরূপ, আমার মতে দ্বিতীয় পছন্দটি আরও ভাল কারণ পদ্ধতিটি কী প্রক্রিয়া করছে তা আরও স্পষ্ট:

LangDetector detector = new LangDetector(someText);
//lots of lines
String language = detector.detectLanguage();

বনাম

LangDetector detector = new LangDetector();
//lots of lines
String language = detector.detectLanguage(someText);

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


8
"বিশেষ ক্ষেত্রে তিনটি এবং চার বা তার বেশি, কখনই নয়!" বিএস। ম্যাট্রিক্স.ক্রিয়েট (এক্স 1, এক্স 2, এক্স 3, এক্স 4, এক্স 5, এক্স 6, এক্স 7, এক্স 8, এক্স 9) সম্পর্কে কীভাবে; ?
লুকাসজ ম্যাডন

71
জিরো আদর্শ? হ্যাক ফাংশনগুলি কীভাবে তথ্য পায়? গ্লোবাল / দৃষ্টিকোণ / স্ট্যাটিক / যা কিছু ভেরিয়েবল? Yuck।
পিটার সি

9
এটি একটি খারাপ উদাহরণ। উত্তর স্পষ্টত হল: String language = detectLanguage(someText);। আপনার দুটি ক্ষেত্রেই আপনি ঠিক একই সংখ্যক তর্ক যুক্ত করেছেন, এমনটি ঘটেছিল যে আপনি একটি দুর্বল ভাষার কারণে ফাংশন সম্পাদনকে দুটি ভাগে ভাগ করেছেন।
ম্যাথিউ এম।

8
@ লিউকাস, অ্যারে বা (হাঁফ!) তালিকার মতো অভিনব কন্সট্রাক্টকে সমর্থনকারী ভাষাগুলিতে, Matrix.Create(input);কোথায় input, কী বলা যায়, একটি। নেট IEnumerable<SomeAppropriateType>? আপনি যখন 9 এর পরিবর্তে 10 টি উপাদান রেখে একটি ম্যাট্রিক্স তৈরি করতে চান তখন আপনার পৃথক ওভারলোডেরও প্রয়োজন হবে না
একটি সিএনএন

9
"আদর্শ" হিসাবে জিরো আর্গুমেন্টগুলি একটি ক্রক এবং আমার মনে হয় ক্লিন কোডটি ওভাররেটেড।
user949300

24

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

উদাহরণস্বরূপ, বলুন যে আপনার কাছে একটি ম্যানেজার ক্লাস রয়েছে যা তৃতীয় শ্রেণির ক্লাসকে অ্যাসাইনমেন্টগুলি সম্পূর্ণ করতে বলে।

আপনি যদি সঠিকভাবে মডেল করেন,

3rdGradeClass.finishHomework(int lessonId) {
    result = students.assignHomework(lessonId, dueDate);
    teacher.verifyHomeWork(result);
}

এটি সহজ।

আপনার যদি সঠিক মডেল না থাকে তবে পদ্ধতিটি এটির মতো হবে

Manager.finishHomework(grade, students, lessonId, teacher, ...) {
    // This is not good.
}

সঠিক মডেল সর্বদা পদ্ধতি কলগুলির মধ্যে ফাংশন পরামিতি হ্রাস করে কারণ সঠিক ফাংশনগুলি তাদের নিজস্ব শ্রেণিতে (একক দায়িত্ব) অর্পিত হয় এবং তাদের কাজ করার জন্য তাদের পর্যাপ্ত ডেটা থাকে।

আমি যখনই প্যারামিটারের সংখ্যা বাড়তে দেখছি, আমি আমার মডেলটি পরীক্ষা করে দেখি যে আমি আমার অ্যাপ্লিকেশন মডেলটি সঠিকভাবে ডিজাইন করেছি কিনা।

যদিও কিছু ব্যতিক্রম রয়েছে: যখন আমার কোনও ট্রান্সফার অবজেক্ট বা কনফিগার অবজেক্ট তৈরি করা দরকার তখন আমি একটি বড় কনফিগার অবজেক্ট তৈরির আগে প্রথমে ছোট বিল্ট অবজেক্ট তৈরি করতে একটি বিল্ডার প্যাটার্ন ব্যবহার করব।


16

অন্য দিকগুলি গ্রহণ না করে এমন একটি দিক হল কর্মক্ষমতা।

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

উদাহরণস্বরূপ যখন এআরএম এ একটি ফাংশন কল করা হয়, প্রথম চারটি আর্গুমেন্ট রেজিস্টারগুলিতে স্থাপন করা r0হয় r3এবং বাকী যুক্তিগুলি স্ট্যাকের দিকে ঠেলে দিতে হয়। পাঁচটির নিচে আর্গুমেন্টের সংখ্যা রাখা সমালোচনামূলক ফাংশনের জন্য বেশ পার্থক্য আনতে পারে।

ফাংশন যে অত্যন্ত প্রায়ই বলা হয়, এমনকি সত্য প্রোগ্রাম প্রতিটি কলের সামনে কর্মক্ষমতা প্রভাবিত করতে পারে (আর্গুমেন্ট সেট আপ করার জন্য যে জন্য r0করতে r3বলা ফাংশন দ্বারা ওভাররাইট করা হতে পারে এবং আগামী কল করার আগে প্রতিস্থাপিত করতে হবে) যাতে এ ব্যাপারে শূন্য আর্গুমেন্ট সেরা।

হালনাগাদ:

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

যদিও ইনলাইনিংয়ের সাথে কিছু সমস্যা রয়েছে।

  1. ইনলাইনিং সংকলিত বাইনারি বৃদ্ধির কারণ হিসাবে একই কোডটিকে বাইনারি আকারে নকল করা হয় যদি এটি একাধিক জায়গা থেকে কল করা হয়। আই-ক্যাশে ব্যবহারের বিষয়টি আসে এটি ক্ষতিকারক।
  2. সংকলকগণ কেবলমাত্র একটি নির্দিষ্ট স্তরের (3 টি পদক্ষেপ আইআইআরসি?) পর্যন্ত সন্নিবেশ করানোর অনুমতি দেন। অন্তর্ভুক্ত ফাংশন থেকে একটি অন্তর্নিহিত ফাংশন থেকে একটি অন্তর্নিহিত ফাংশনটি কল করার কল্পনা করুন। inlineসকল ক্ষেত্রে বাধ্যতামূলক হিসাবে বিবেচিত হলে বাইনারি বৃদ্ধি বিস্ফোরিত হবে।
  3. প্রচুর সংকলক রয়েছে যা তারা সম্পূর্ণরূপে উপেক্ষা করবে inlineবা প্রকৃতপক্ষে ত্রুটিগুলি দিবে যখন তারা এটির মুখোমুখি হয়।

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

ইনলাইনিং কি এই সমস্যার সমাধান করে না?
KjMag

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

7

যখন প্যারামিটার তালিকাটি পাঁচটিরও বেশি বেড়ে যায়, তখন একটি "প্রসঙ্গ" কাঠামো বা অবজেক্টের সংজ্ঞা দিতে বিবেচনা করুন।

এটি মূলত কেবল একটি কাঠামো যা কিছু বুদ্ধিমান ডিফল্ট সেট সহ সমস্ত alচ্ছিক পরামিতি ধারণ করে।

সি পদ্ধতিগত বিশ্বে একটি সরল কাঠামো করত। জাভাতে, সি ++ একটি সাধারণ অবজেক্ট যথেষ্ট। গেটার্স বা সেটটারদের সাথে গণ্ডগোল করবেন না কারণ অবজেক্টের একমাত্র উদ্দেশ্য হ'ল "পাবলিক" লাই সেটেবল মানগুলি রাখা hold


আমি সম্মত, ফাংশন প্যারামিটার স্ট্রাকচারগুলি জটিল হয়ে যাওয়া শুরু করলে একটি প্রসঙ্গ অবজেক্ট খুব কার্যকর হতে পারে। আমি সম্প্রতি দর্শকের মতো প্যাটার্ন সহ প্রসঙ্গের জিনিসগুলি
লুকাশ এদার

5

না, কোনও মানিক নির্দেশিকা নেই is

তবে এমন কিছু কৌশল রয়েছে যা প্রচুর পরিমাপের সাথে আরও বহনযোগ্য একটি ফাংশন তৈরি করতে পারে।

আপনি একটি তালিকা-যদি-আরগস প্যারামিটার (আরগস *) বা অভিধান-অফ-আরগ্স প্যারামিটার (কোয়ার্গস **) ব্যবহার করতে পারেন

উদাহরণস্বরূপ, পাইথনে:

// Example definition
def example_function(normalParam, args*, kwargs**):
  for i in args:
    print 'args' + i + ': ' + args[i] 
  for key in kwargs:
    print 'keyword: %s: %s' % (key, kwargs[key])
  somevar = kwargs.get('somevar','found')
  missingvar = kwargs.get('somevar','missing')
  print somevar
  print missingvar

// Example usage

    example_function('normal parameter', 'args1', args2, 
                      somevar='value', missingvar='novalue')

আউটপুট:

args1
args2
somevar:value
someothervar:novalue
value
missing

অথবা আপনি অবজেক্ট আক্ষরিক সংজ্ঞা সিনট্যাক্স ব্যবহার করতে পারেন

উদাহরণস্বরূপ, একটি এজেএক্স GET অনুরোধ চালু করার জন্য এখানে একটি জাভাস্ক্রিপ্ট jQuery কল রয়েছে:

$.ajax({
  type: 'GET',
  url: 'http://someurl.com/feed',
  data: data,
  success: success(),
  error: error(),
  complete: complete(),
  dataType: 'jsonp'
});

আপনি যদি jQuery এর এজাক্স ক্লাসটি একবার দেখুন তবে অনেকগুলি (আনুমানিক 30) আরও বৈশিষ্ট্য সেট করা যেতে পারে; বেশিরভাগ কারণ এজ্যাক যোগাযোগ খুব জটিল। ভাগ্যক্রমে, অবজেক্ট আক্ষরিক বাক্য গঠন জীবনকে সহজ করে তোলে।


সি # ইন্টিলিসেন্স প্যারামিটারগুলির সক্রিয় ডকুমেন্টেশন সরবরাহ করে যাতে ওভারলোডেড পদ্ধতির খুব জটিল ব্যবস্থা দেখতে অস্বাভাবিক নয়।

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

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

আইএমএইচও, ওভারলোডেড পদ্ধতিগুলি অত্যধিক ওভাররেটেড।

দ্রষ্টব্য: যদি আমি মনে করি সঠিক পঠনযোগ্য অ্যাক্সেস নিয়ন্ত্রণে সি # তে অবজেক্ট লিটারাল কনস্ট্রাক্টরের কাজ করা উচিত। তারা মূলত কন্সট্রাক্টরের বৈশিষ্ট্য নির্ধারণের মতো একই কাজ করে।


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

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

হালনাগাদ:

স্থিতিশীলভাবে টাইপ করা ভাষায় ব্যবহারের প্রদর্শন করার জন্য সম্ভবত আমার উদাহরণ দেওয়া উচিত ছিল তবে আমি বর্তমানে কোনও স্ট্যাটিকালি টাইপ করা প্রসঙ্গে ভাবছি না। মূলত, হঠাৎ ফিরে যেতে আমি গতিশীল টাইপ করা প্রসঙ্গে খুব বেশি কাজ করছি doing

আমি যা জানি তা হ'ল অবজেক্ট আক্ষরিক সংজ্ঞা বাক্য গঠন স্থিরভাবে টাইপ করা ভাষায় (কমপক্ষে সি # এবং জাভাতে) সম্পূর্ণভাবে সম্ভব কারণ আমি এগুলি আগে ব্যবহার করেছি। স্ট্যাটিকালি টাইপ করা ভাষায় তাদের বলা হয় 'অবজেক্ট ইনিশিয়ালাইজার'। জাভা এবং সি # তে তাদের ব্যবহার দেখানোর জন্য এখানে কয়েকটি লিঙ্ক রয়েছে ।


3
আমি নিশ্চিত না যে আমি এই পদ্ধতিটি পছন্দ করি, মূলত কারণ আপনি পৃথক পরামিতিগুলির স্ব নথিভুক্তি হারান lose পছন্দসই আইটেমের তালিকাগুলির জন্য এটি সঠিক ধারণা তৈরি করে (উদাহরণস্বরূপ এমন একটি পদ্ধতি যা স্ট্রিংগুলির একটি তালিকা নেয় এবং সেগুলি বোঝায়) তবে একটি স্বেচ্ছাসেবী পরামিতি সেটের জন্য এটি দীর্ঘ পদ্ধতি কলের চেয়ে খারাপ।
মাইকেল কে

@ মিশেলকে অবজেক্ট ইনিশিয়ালাইজারগুলিতে আরেকবার নজর দিন। Youতিহ্যগত পদ্ধতি / ফাংশন প্যারামিটারগুলিতে কীভাবে তারা স্পষ্টভাবে সংজ্ঞায়িত করা হয় তার বিপরীতে তারা আপনাকে স্পষ্টভাবে সংজ্ঞা দিতে দেয় properties আমার অর্থ কী তা বোঝার জন্য এটি পড়ুন, এমএসডিএন.মাইক্রোসফটকম /en-us/library/bb397680.aspx
ইভান প্লেস

3
প্যারামিটারের তালিকাটি পরিচালনা করতে একটি নতুন ধরণের তৈরি করা ঠিক অহেতুক জটিলতার সংজ্ঞার মতো মনে হচ্ছে ... অবশ্যই, গতিশীল ভাষা আপনাকে এড়াতে দেয় তবে তারপরে আপনি গু প্যারামিটারের একটি বল পান। নির্বিশেষে, এটি জিজ্ঞাসিত প্রশ্নের উত্তর দেয় না।
তেলস্তিন

@ টেলাস্টিন আপনি কী সম্পর্কে কথা বলছেন? কোনও নতুন ধরণের তৈরি করা হয়নি, আপনি অবজেক্ট আক্ষরিক সিনট্যাক্স ব্যবহার করে সরাসরি বৈশিষ্ট্য ঘোষণা করেন। এটি কোনও বেনামি অবজেক্টকে সংজ্ঞায়িত করার মতো তবে পদ্ধতিটি এটিকে কী = মান পরামিতি গোষ্ঠীকরণ হিসাবে ব্যাখ্যা করে। আপনি যা দেখছেন তা হল একটি পদ্ধতি ইনস্ট্যান্টেশন (কোনও প্যারামিটার এনক্যাপসুলেটিং অবজেক্ট নয়)। যদি আপনার গরুর মাংস প্যারামিটার প্যাকেজিংয়ের সাথে থাকে তবে অন্য যে কোনও একটি প্রশ্নে উল্লিখিত প্যারামিটার অবজেক্ট প্যাটার্নটি একবার দেখুন কারণ এটি ঠিক তাই।
ইভান প্লেস

@ ইভানপ্লাইস - প্যারামিটার অবজেক্ট প্যাটার্নটিকে অনুমোদনের জন্য স্থির প্রোগ্রামিং ভাষাগুলি ব্যতীত ও বড়দের একটি (প্রায়শই নতুন) ঘোষিত প্রকারের প্রয়োজন হয়।
তেলস্তিন

3

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

কিন্তু আবার, এটি একটি নিয়মের চেয়ে গাইডলাইন। আমার প্রায়শই এমন ফাংশন থাকে যা অস্বাভাবিক পরিস্থিতি বা ব্যবহারের স্বাচ্ছন্দ্যের কারণে দুটি পরামিতির বেশি লাগে take


2

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

সুতরাং, এর পরিবর্তে (উদাহরণস্বরূপ) এটি:

<?php

createBlogPost('the title', 'the summary', 'the author', 'the date of publication, 'the keywords', 'the category', 'etc');

?>

যান:

<?php

// create a hash of post data
$post_data = array(
  'title'    => 'the title',
  'summary'  => 'the summary',
  'author'   => 'the author',
  'pubdate'  => 'the publication date',
  'keywords' => 'the keywords',
  'category' => 'the category',
  'etc'      => 'etc',
);

// and pass it to the appropriate function
createBlogPost($post_data);

?>

ওয়ার্ডপ্রেস এইভাবে প্রচুর স্টাফ করে এবং আমার ধারণা এটি ভালভাবে কাজ করে। (যদিও উপরে আমার উদাহরণ কোডটি কাল্পনিক, এবং এটি নিজেই ওয়ার্ডপ্রেসের উদাহরণ নয়))

এই কৌশলটি আপনাকে সহজেই আপনার ফাংশনগুলিতে প্রচুর ডেটা পাস করার অনুমতি দেয়, তবুও আপনাকে প্রতিটি ক্রমটি পাস করার ক্রমটি মনে রাখতে বাধা দেয়।

রিফ্যাক্টরের সময় আসার সময় আপনি এই কৌশলটিরও প্রশংসা করবেন - কোনও ফাংশনের যুক্তির ক্রমটি সম্ভবত পরিবর্তন করার পরিবর্তে (যেমন আপনি যখন বুঝতে পারেন যে আপনাকে আর একটি যুক্তি পাস করার দরকার আছে), আপনাকে আপনার ফাংশনগুলির প্যারামিটারটি পরিবর্তন করার দরকার নেই সব তালিকা।

এটি কেবল আপনার ফাংশন সংজ্ঞাটি পুনরায় লেখার হাত থেকে বাঁচায় তা নয় - এটি প্রতিবার ফাংশনটি শুরু করার সময় আর্গুমেন্টের ক্রম পরিবর্তন করতে আপনাকে বাঁচায়। এটা বিশাল জয়


এই পোস্টটি দেখে পাস-হ্যাশ পদ্ধতির আরেকটি সুবিধা হাইলাইট করা হয়েছে: লক্ষ্য করুন যে আমার প্রথম কোড উদাহরণটি এত দীর্ঘ যে এটি একটি স্ক্রোলবার তৈরি করে, দ্বিতীয়টি পৃষ্ঠায় পরিষ্কারভাবে ফিট করে। আপনার কোড সম্পাদকের ক্ষেত্রেও সম্ভবত এটি সত্য।
ক্রিস অ্যালেন লেন

0

পূর্ববর্তী উত্তরে একটি নির্ভরযোগ্য লেখকের কথা উল্লেখ করা হয়েছিল যিনি বলেছিলেন যে আপনার ফাংশনগুলির যত কম পরামিতি রয়েছে, আপনি তত ভাল করছেন। উত্তরগুলি কেন ব্যাখ্যা করে না তবে বইগুলি এটি ব্যাখ্যা করে এবং আপনার কেন এই দর্শনটি গ্রহণ করা প্রয়োজন এবং এটির সাথে আমি ব্যক্তিগতভাবে সম্মত যাচ্ছি তার দুটি দৃ conv়প্রত্যয়ী কারণ:

  • প্যারামিটারগুলি বিমূর্ততার একটি স্তরের অন্তর্ভুক্ত যা ফাংশনের চেয়ে পৃথক। এর অর্থ আপনার কোডের পাঠককে আপনার কার্যকারণের প্যারামিটারগুলির প্রকৃতি এবং উদ্দেশ্য সম্পর্কে চিন্তা করতে হবে: এই চিন্তাভাবনা নামের তুলনায় "নিম্ন স্তরের" এবং তাদের সম্পর্কিত কার্যকারিতাটির উদ্দেশ্য।

  • কোনও ফাংশনে যতটা সম্ভব কম প্যারামিটার থাকার দ্বিতীয় কারণটি হচ্ছে পরীক্ষা করা: উদাহরণস্বরূপ, যদি আপনার 10 টি প্যারামিটার সহ একটি ফাংশন থাকে তবে সমস্ত পরীক্ষার কেসগুলি আপনাকে কীভাবে পরামিতিগুলির সংমিশ্রণ করতে হবে তা সম্পর্কে চিন্তা করুন, উদাহরণস্বরূপ, একটি ইউনিট পরীক্ষা। কম প্যারামিটার = কম পরীক্ষা।


0

রবার্ট মার্টিনের "ক্লিন কোড: অ্যাগ্রিল সফটওয়্যার ক্র্যাফটসম্যানশিপের একটি হ্যান্ডবুক" - এ শূন্য হওয়ার জন্য ফাংশন আর্গুমেন্টের আদর্শ সংখ্যার জন্য পরামর্শের আরও কয়েকটি প্রসঙ্গ সরবরাহ করার জন্য, লেখক তার পয়েন্টগুলির মধ্যে একটি হিসাবে নিম্নলিখিতটি বলেছেন:

যুক্তিগুলি শক্ত। তারা ধারণামূলক শক্তি অনেক গ্রহণ। সে কারণেই আমি উদাহরণটি থেকে তাদের প্রায় সকলকে মুক্তি দিয়েছি। উদাহরণস্বরূপ, বিবেচনা করুন StringBuffer। আমরা এটিকে দৃষ্টান্ত হিসাবে পরিবর্তনশীল করার পরিবর্তে একটি যুক্তি হিসাবে ঘুরিয়ে দিতে পারতাম, তবে আমাদের পাঠকরা যখনই এটি দেখতেন ততবার এটি ব্যাখ্যা করতে হত। আপনি যখন মডিউল দ্বারা বর্ণিত গল্পটি পড়ছেন, তখন includeSetupPage() তার চেয়ে বোঝা সহজ includeSetupPageInto(newPageContent)। আর্গুমেন্ট বিমূর্তির ভিন্ন স্তরে যা ফাংশনটির নাম এবং আপনাকে একটি বিবরণ (অন্য কথায়, StringBuffer) জানার জন্য বাধ্য করে যা সেই সময়ে বিশেষভাবে গুরুত্বপূর্ণ নয়।

includeSetupPage()উপরে তার উদাহরণের জন্য, অধ্যায়টির শেষে তার রিফ্যাক্টর "ক্লিন কোড" এর একটি ছোট স্নিপেট এখানে রয়েছে:

// *** NOTE: Commments are mine, not the author's ***
//
// Java example
public class SetupTeardownIncluder {
    private StringBuffer newPageContent;

    // [...] (skipped over 4 other instance variables and many very small functions)

    // this is the zero-argument function in the example,
    // which calls a method that eventually uses the StringBuffer instance variable
    private void includeSetupPage() throws Exception {
        include("SetUp", "-setup");
    }

    private void include(String pageName, String arg) throws Exception {
        WikiPage inheritedPage = findInheritedPage(pageName);
        if (inheritedPage != null) {
            String pagePathName = getPathNameForPage(inheritedPage);
            buildIncludeDirective(pagePathName, arg);
        }
    }

    private void buildIncludeDirective(String pagePathName, String arg) {
        newPageContent
            .append("\n!include ")
            .append(arg)
            .append(" .")
            .append(pagePathName)
            .append("\n");
    }
}

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

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


-2

আদর্শভাবে শূন্য। এক বা দুটি ঠিক আছে, নির্দিষ্ট ক্ষেত্রে তিনটি।
চার বা তার বেশি সাধারণত একটি খারাপ অভ্যাস হয়।

পাশাপাশি একক প্রতিক্রিয়াশীলতার নীতিগুলি যা অন্যরা লক্ষ করেছে যে আপনি এটি পরীক্ষা করে এবং ডিবাগিং দৃষ্টিকোণগুলি থেকেও ভাবতে পারেন।

যদি একটি প্যারামিটার থাকে তবে এর মানগুলি জানা, সেগুলি পরীক্ষা করা এবং তাদের সাথে ত্রুটি সন্ধান করা 'তুলনামূলকভাবে সহজ কারণ কেবলমাত্র একটি কারণ রয়েছে। কারণগুলি বাড়ানোর সাথে সাথে মোট জটিলতা দ্রুত বৃদ্ধি পায়। বিমূর্ত উদাহরণের জন্য:

'এই আবহাওয়াতে কী পরবেন' প্রোগ্রামটি বিবেচনা করুন। এটি একটি ইনপুট - তাপমাত্রা দিয়ে কী করতে পারে তা বিবেচনা করুন। আপনি যেমন কল্পনা করতে পারেন, কী পরবেন তার ফলাফলগুলি সেই এক উপাদানটির উপর ভিত্তি করে বেশ সহজ। এখন বিবেচনা করুন প্রোগ্রামটি যদি তাপমাত্রা, আর্দ্রতা, শিশির, বৃষ্টিপাত ইত্যাদিকে অতিবাহিত করে তবে কী করতে পারে / করতে পারে তা এখন ভাবুন যে এটি কোনও কিছুর 'ভুল' উত্তর দিলে ডিবাগ করা কতটা কঠিন।


12
যদি কোনও ফাংশনে শূন্য প্যারামিটার থাকে, তবে তা হয় ধ্রুবক মানটি (কিছু পরিস্থিতিতে কার্যকর, তবে সীমাবদ্ধ করে) ফেরত দেয় বা এটি এমন কিছু গোপনীয় অবস্থা ব্যবহার করে যা সুস্পষ্টভাবে বন্ধ করে দেওয়া ভাল। (ওও পদ্ধতি কলগুলিতে, প্রসঙ্গের অবজেক্টটি যথেষ্ট পরিমাণে স্পষ্ট যে এটি সমস্যার কারণ নয়
problems

4
উত্সটি উদ্ধৃত না করার জন্য -1
জোশুয়া ড্রাক

আপনি কি গুরুত্ব সহকারে বলছেন যে আদর্শভাবে সমস্ত কার্য কোনও প্যারামিটার নেবে না? নাকি এই হাইপারবোল?
গ্রিনএজজেড

1
চাচা বব এর যুক্তি এখানে দেখুন: informit.com/articles/article.aspx?p=1375308 এবং নোট করুন যে নীচে তিনি বলেছেন "ফাংশনগুলিতে অল্প সংখ্যক তর্ক থাকতে হবে। কোনও যুক্তি সেরা নয়, তার পরে একটি, দু'এক এবং তিনটি রয়েছে "তিনজনেরও বেশি প্রশ্নবিদ্ধ এবং কুসংস্কার এড়ানো উচিত" "
মাইকেল ডুরান্ট

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