ফাংশন আর্গুমেন্ট সংখ্যা কমানোর জন্য কৌশল


13

ক্লিন কোডে এটি লেখা আছে যে "কোনও ক্রমের জন্য আর্গুমেন্টের আদর্শ সংখ্যাটি শূন্য"। কারণ ব্যাখ্যা করা এবং বোধগম্য। আমি যা করছি তার পরে এই সমস্যাটি সমাধান করার জন্য 4 বা ততোধিক যুক্তিযুক্ত পদ্ধতিগুলি রিফ্যাক্টর করার কৌশলগুলি।

একটি উপায় হ'ল নতুন ক্লাসে যুক্তিগুলি বের করা, তবে এটি অবশ্যই ক্লাসগুলির বিস্ফোরণ ঘটায়? এবং এই ক্লাসগুলির নামগুলির কিছু শেষ হওয়ার সম্ভাবনা রয়েছে যা নামকরণের কিছু বিধি লঙ্ঘন করে ("ডেটা" বা "তথ্য" ইত্যাদি দিয়ে শেষ হয়)?

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

কার্যকারিতা যুক্তি হ্রাস করার উপায়গুলি সন্ধান করা, এটি করা ভাল ধারণা কেন কারণগুলি মেনে নিয়েছে।


21
টিবিএইচ আমি পরিষ্কার কোডের সাথে একমত নই। যদি কোনও ফাংশনে আর্গুমেন্টের সংখ্যা শূন্য হয় তবে এর থেকে বোঝা যায় যে ফাংশনটির পার্শ্ব প্রতিক্রিয়া রয়েছে এবং সম্ভবত এটি কোথাও স্থিতি পরিবর্তন করে। যদিও আমি স্বীকার করি যে 4 টিরও কম আর্গুমেন্ট আঙ্গুলের একটি ভাল নিয়ম হতে পারে - তবে আমি 8 টি যুক্তি দিয়ে স্থিতিশীল হয়ে ফাংশন করব যা স্থির এবং শূন্য আর্গুমেন্টের সাথে একটি স্থিতিশীল ফাংশন ছাড়া কোনও পার্শ্ব প্রতিক্রিয়া নেই যা রাষ্ট্র পরিবর্তন করে এবং এর পার্শ্ব প্রতিক্রিয়াগুলি রয়েছে ।
wasatz

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

2
ঠিক আছে বইটি পরে আরও উল্লেখ করেছে যে পার্শ্ব-প্রতিক্রিয়াগুলি কাম্য নয় ...
নীল বার্নওয়েল


উত্তর:


16

সবচেয়ে গুরুত্বপূর্ণ বিষয়টি মনে রাখতে হবে সেগুলি হ'ল নির্দেশিকাগুলি, বিধি নয়।

এমন কিছু ক্ষেত্রে রয়েছে যেখানে কোনও পদ্ধতিতে কেবল যুক্তি নিতে হবে+উদাহরণস্বরূপ সংখ্যাগুলির পদ্ধতি সম্পর্কে চিন্তা করুন । বা addসংগ্রহের জন্য পদ্ধতি।

প্রকৃতপক্ষে, কেউ যুক্তিও দিতে পারে যে দুটি সংখ্যার যোগ করার অর্থ যা প্রসঙ্গের উপর নির্ভরশীল, যেমন in in 3 + 3 == 6, তবে ℤ | 5 এ 3 + 3 == 2 , সুতরাং সত্যিই সংযোজন অপারেটরটি একটি প্রসঙ্গ অবজেক্টের একটি পদ্ধতি হওয়া উচিত যা একটি পরিবর্তে দুটি আর্গুমেন্ট গ্রহণ করে সংখ্যার উপর পদ্ধতি যা একটি যুক্তি নেয় method

তেমনি, দুটি বস্তুর তুলনা করার পদ্ধতিটি হ'ল একটি বস্তুর অন্যটিকে আর্গুমেন্ট হিসাবে গ্রহণের পদ্ধতি বা প্রসঙ্গের পদ্ধতি হতে হবে, দুটি বস্তুকে আর্গুমেন্ট হিসাবে গ্রহণ করে, সুতরাং এটির সাথে তুলনা পদ্ধতিটি কেবল বোধগম্য হয় না এক যুক্তির চেয়ে কম

এটি বলেছিল, একটি পদ্ধতির পক্ষে যুক্তি সংখ্যা কমাতে কয়েকটি জিনিস করা যেতে পারে:

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

একটি উপায় হ'ল নতুন ক্লাসে যুক্তিগুলি বের করা, তবে এটি অবশ্যই ক্লাসগুলির বিস্ফোরণ ঘটায়?

যদি আপনার ডোমেন মডেলটিতে বিভিন্ন ধরণের জিনিস থাকে তবে আপনার কোডটি বিভিন্ন ধরণের অবজেক্টের সাথে সমাপ্ত হবে। এতে কোনও ভুল নেই।

এবং এই ক্লাসগুলির নামগুলির কিছু শেষ হওয়ার সম্ভাবনা রয়েছে যা নামকরণের কিছু বিধি লঙ্ঘন করে ("ডেটা" বা "তথ্য" ইত্যাদি দিয়ে শেষ হয়)?

আপনি যদি সঠিক নামটি না খুঁজে পান তবে সম্ভবত আপনি অনেকগুলি যুক্তি এক সাথে তৈরি করেছেন বা খুব কম করেছেন। সুতরাং, আপনার হয় হয় কেবলমাত্র একটি ক্লাসের টুকরো বা আপনার একাধিক শ্রেণি রয়েছে।

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

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

নোট করুন আমি "সম্ভবত" শব্দটি কতবার ব্যবহার করেছি? সে কারণেই সেগুলি নির্দেশিকাগুলি, বিধি নয়। 4 পরামিতি সহ আপনার পদ্ধতিটি পুরোপুরি ঠিক আছে!


7
@ ব্রুনোস্কিপার: অবশ্যই: (১) " পদ্ধতিটি নিজেই ছোট করুন: সম্ভবত, যদি পদ্ধতিটির পক্ষে অনেক যুক্তি প্রয়োজন হয়, তবে এটি খুব বেশি কাজ করছে? "। প্যারামের সংখ্যা এটির একটি খারাপ পরীক্ষা। Ptionচ্ছিক / বুলিয়ান প্যারাম এবং কোডের প্রচুর লাইনগুলি কোনও পদ্ধতির খুব বেশি করার শক্তিশালী সূচক। অনেকগুলি প্যারাম সর্বোত্তমভাবে দুর্বল। (২) " অবজেক্টের স্থিতি: যদি একাধিক পদ্ধতিতে যুক্তির প্রয়োজন হয়, তবে এটি বস্তুর অবস্থার অংশ হওয়া উচিত "। না, না এবং তিনবার, না। বস্তুর স্থিতি হ্রাস করুন; ফাংশন পরামিতি না। যদি সম্ভব হয় তবে অবজেক্টের অবস্থা এড়ানোর জন্য প্যারামিটারগুলির মাধ্যমে সমস্ত পদ্ধতিতে একটি মান দিন।
ডেভিড আরনো

আপনি সংযোজনের জন্য যে উদাহরণটি দিয়েছেন তা হ'ল ফ্ল্যাট-আউট ভুল। addপ্রাকৃতিক সংখ্যার জন্য ফাংশন এবং addপূর্ণসংখ্যার রিং জন্য ফাংশন mod এন দুটি ভিন্ন ধরনের দুটি ভিন্ন ফাংশন ক্রিয়া হয়। "প্রসঙ্গ" দ্বারা আপনি কী বোঝেন তা আমি বুঝতে পারি না।
উদ্যানের মাঠ

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

6

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

একটি দরকারী কৌশল আমি "লেন্স ফোকাসিং" কৌশল কল করি। আপনি যখন কোনও ক্যামেরার লেন্স ফোকাস করেন, সত্য ফোকাস পয়েন্টটি যদি আপনি এটি খুব বেশি দূরে নিয়ে যান, তবে এটি আবার সঠিক পয়েন্টে ফিরে যান। সফ্টওয়্যার রিফ্যাক্টরিংয়ের ক্ষেত্রেও একই কথা।

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

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

নোট করুন যে লেখক পরীক্ষা চালিত বিকাশেরও এক বিশাল প্রবক্তা, যা শুরুতে কম-আধ্যাত্মিক ফাংশন উত্পাদন করতে ঝোঁক দেয় কারণ আপনি আপনার তুচ্ছ পরীক্ষার কেস দিয়ে শুরু করেন।


1
আপনার "লেন্সকে কেন্দ্র করে" সাদৃশ্যটির মতো - বিশেষত রিফ্যাক্টর করার সময় ক্লোজ-আপের পরিবর্তে প্রশস্ত-কোণ লেন্স ব্যবহার করা গুরুত্বপূর্ণ। এবং # টি প্যারামিটারগুলি অনুসন্ধান করা কেবল খুব নিকটতম
টফ্রো

0

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

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

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

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


5
অন্ধভাবে যুক্তির সংখ্যা হ্রাস করা অবশ্যই ভুল wrong তবে আমি "এক বিশাল সংখ্যক যুক্তিযুক্ত ফাংশনগুলির সাথে কোনও ভুল নেই wrong" এর সাথে আমি একমত নই " । আমার মতে, আপনি যখন বিশাল সংখ্যক যুক্তি দিয়ে কোনও ফাংশনটি হিট করেন, তখন সমস্ত ক্ষেত্রে 99,9% তে কোডের কাঠামোটিকে ইচ্ছাকৃতভাবে উন্নত করার উপায় রয়েছে যা (এছাড়াও) ফাংশনের আর্গুমেন্টের সংখ্যা হ্রাস করে।
ডক ব্রাউন

@ ডকব্রাউন এ কারণেই এখানে এই শেষ অনুচ্ছেদ এবং সেখানে শুরু করার প্রস্তাব দেওয়া হচ্ছে .... এবং অন্যটি: আপনি সম্ভবত কোনও এমএস উইন্ডোজ এপিআইয়ের বিরুদ্ধে প্রোগ্রাম করার চেষ্টা করেন নি;)
tofro

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

1
@ নীলবার্নওয়েল আদর্শ ক্ষেত্রে (রিফ্যাক্টরিংয়ের জন্য মূল্যবান) আপনি এমন একটি ফাংশনকে বিভক্ত করতে সক্ষম হতে পারেন যার জন্য 10 টি যুক্তি তিনটিতে বিভক্ত করা দরকার যার প্রতিটিতে 3-4 টি যুক্তি প্রয়োজন। আদর্শ নয় এমন ক্ষেত্রে, আপনি তিনটি ফাংশন দিয়ে শেষ করেন যার প্রতিটিতে 10 টি যুক্তি প্রয়োজন (আরও ভালভাবে এটি একা রেখে দিন)। আপনার উচ্চতর স্ট্যাক আর্গুমেন্টের সাথে: সম্মত হন - এটি হতে পারে তবে অগত্যা নয় - যুক্তি কোথাও থেকে আসে এবং পুনরুদ্ধারটি স্ট্যাকের ভিতরেও কোথাও হতে পারে এবং কেবল সেখানে যথাযথ জায়গায় রাখা দরকার - মাইলেজ বিভিন্ন হতে থাকে।
tofro

সফ্টওয়্যার লজিকের জন্য কখনই চারটি পরামিতির বেশি প্রয়োজন হয় না। কেবল একটি সংকলক হতে পারে।
ডক্টর

0

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

একমাত্র ব্যতিক্রমগুলি সংকলক (রূপকর্ম) এবং সিমুলেশনগুলি রয়েছে, যেখানে সীমা তাত্ত্বিকভাবে 8, তবে সম্ভবত কেবল 5।

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