Optionচ্ছিক পরামিতিগুলি সহায়ক বা অ্যাপ্লিকেশন রক্ষণাবেক্ষণের ক্ষেত্রে অন্তরায়? [বন্ধ]


15

শিরোনামে বলা আছে, # চ্ছিক প্যারামিটারগুলি যেমন সি # তে ব্যবহৃত হয় বা তারা অ্যাপ্লিকেশন রক্ষণাবেক্ষণের ক্ষেত্রে বাধা হয়ে থাকে এবং কোডটি বোঝা আরও শক্ত করে তুলতে পারে তাই এড়ানো উচিত?


3
দাবি অস্বীকার: ভুল হাতে যে কোনও ভাষার বৈশিষ্ট্যই আপত্তিজনক হতে পারে। যদি কোনও ভাষা এটি স্মার্ট উপায়ে প্রয়োগ করে, এবং এই ভাষার বৈশিষ্ট্যটি কোনও নিস্তেজভাবে বিদ্যমান ভাষার বৈশিষ্ট্যটির সাথে খুব বেশি পরিমাণে ওভারল্যাপ করে না, তবে সেগুলি ঠিক আছে, বাস্তবে এটি বেশ কার্যকর। পাইথনের কিছু ঝরঝরে প্যারাম প্যাকিং / আনপ্যাকিং এবং অন্যান্য প্যারামিটার "ট্রিকস" রয়েছে (পার্ল ইন্দ্রিয় নয়, একটি ভাল কৌশল)।
কাজ

সি # তে এমন একটি অ্যাপ্লিকেশন লেখার চেষ্টা করুন যা Excelচ্ছিক পরামিতি ব্যবহার না করে এক্সেলের সাথে ইন্টারফেস করে। এটি কোনও যুক্তিসঙ্গত সন্দেহের বাইরে আপনার প্রশ্নের উত্তর দেওয়া উচিত।
ডাঙ্ক

উত্তর:


22

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

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


1
+1 করতে এবং এটি ওভারলোড পদ্ধতি মত একটি আর্গুমেন্ট যোগ দিয়ে মূল্যবান এর new Circle(size, color, filled, ellipseProportions)যেখানে sizeএবং colorপ্রয়োজন হয় এবং বাকি ডিফল্ট হয়।
মাইকেল কে

15

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

গোষ্ঠীভুক্ত করা যেতে পারে এমন পরামিতিগুলি অনুসন্ধান করুন, যেমন (x এবং y, একটি বিন্দু হয়ে উঠুন)।

এই optionচ্ছিক পরামিতিগুলি কি একটি ডিফল্ট সহ পতাকা রয়েছে? আপনি যদি পতাকা ব্যবহার করছেন তবে ফাংশনটি পৃথক করা উচিত।

এর অর্থ এটি নয় যে আপনার কখনই alচ্ছিক পরামিতি থাকা উচিত নয়, তবে সাধারণভাবে এক বা দুটি পরামিতি কোডের গন্ধের পরামর্শ দেয়।

এটি একটি ক্লুও হতে পারে যে ফাংশনটি আসলে একটি শ্রেণি হওয়া উচিত, alচ্ছিক পরামিতিগুলি বৈশিষ্ট্যগুলিতে পরিবর্তিত হয় এবং কনস্ট্রাক্টরের প্রয়োজনীয় পরামিতিগুলির অংশ থাকে।


1
সাবধান থাকার জন্য +1। যে কোনও বৈশিষ্ট্য, যত ভালই হোক না কেন, অপব্যবহার করা যায়।
মাইকেল কে

3
এটি আপনার ওষুধের ব্যবহারকারীদের কমপক্ষে classes শ্রেণি এবং ১৫ টি ফাংশন ব্যবহার করতে হবে এমনকি সবচেয়ে সহজ জিনিসটি তৈরি করতে ওভাররেঞ্জাইনার্ড রেভিওলি কোড তৈরির জন্য দুর্দান্ত পরামর্শ।
dsimcha

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

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

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

4

Ptionচ্ছিক পরামিতিগুলি ঠিক আছে

সাধারণত যৌক্তিকতাটি হ'ল ক) আপনি জানেন যে আপনার পদ্ধতির জন্য আপনার অনেক সম্ভাব্য যুক্তি রয়েছে তবে আপনি আপনার এপিআই ক্লাউটারিংয়ের ভয়ে ওভারলোড করতে চান না, বা খ) যখন আপনি সম্ভাব্য সমস্ত যুক্তি জানেন না তবে আপনি আপনার ব্যবহারকারীকে কোনও অ্যারে সরবরাহ করতে বাধ্য করতে চান না। প্রতিটি ক্ষেত্রে alচ্ছিক পরামিতিগুলি একটি ঝরঝরে এবং মার্জিত উপায়ে উদ্ধার করতে আসে।

এখানে কিছু উদাহরন:

1. আপনি ওভারলোডিং এড়াতে চান এবং কোনও অ্যারে নির্দিষ্ট করতে চান না

সি, পার্ল, জাভা ইত্যাদি থেকে প্রিন্টফ () দেখুন It'sচ্ছিক পরামিতিগুলির শক্তির এটি একটি দুর্দান্ত উদাহরণ।

উদাহরণ স্বরূপ:

printf("I want %d %s %s",1,"chocolate","biccies");

printf("I want %d banana",1);

কোনও ওভারলোডিং নেই, কোনও অ্যারে নেই, সহজ এবং স্বজ্ঞাত (একবার আপনি স্ট্যান্ডার্ড স্ট্রিং ফর্ম্যাট কোডগুলি উপলব্ধ করেছেন)। কিছু আইডিই এমনকি আপনাকে বলবে যে আপনার ফর্ম্যাট স্ট্রিংটি আপনার alচ্ছিক পরামিতিগুলির সাথে মেলে না।

২. আপনি ডিফল্ট ব্যবহারের অনুমতি দিতে চান এবং এটিকে পদ্ধতির ব্যবহারকারীর কাছ থেকে গোপন রাখতে চান

sendEmail ( "test@example.org");

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

অনেকগুলি পরামিতিগুলির একটি নোট

তবে অন্যরা যেমন বলেছে যে কোনও পদ্ধতিতে অনেক বেশি বাধ্যতামূলক পরামিতি থাকা ইঙ্গিত দেয় যে সম্ভবত আপনার নকশায় আপনার কিছু ভুল আছে। এটি বিশেষত সত্য যদি তারা একই ধরণের ভাগ করে নেয় কারণ এগুলি দুর্ঘটনার দ্বারা বিকাশকারী দ্বারা চালিত সময়ে অদ্ভুত ফলাফলের দিকে নিয়ে যেতে পারে:

String myMethod(String x, String y, String z, String a, int b, String c, int d) {}

তৈরি করার জন্য পরামিতি অবজেক্ট রিফ্যাক্টরিংয়ের জন্য পরিচিত একজন প্রার্থী

String myMethod(ParameterObject po) {}

class ParameterObject {
  // Left as public for clarity
  public String x;
  public String y;
  ... etc

}

প্যারামিটার অবজেক্ট হিসাবে প্রদত্ত স্পেসিফিকেশন সহ এটি কারখানার প্যাটার্নের উপর ভিত্তি করে এটি আরও ভাল নকশায় নিয়ে যেতে পারে।


1
প্রিন্টফের মতো স্ট্রিং ফর্ম্যাটিং ফাংশন নিয়মের ব্যতিক্রম, কেউ যুক্তি দিতে পারে যে তারা alচ্ছিক প্যারামিটারগুলির সীমাহীন তালিকা ব্যবহার করার সময় এটি যুক্তিযুক্ত প্যারামিটারগুলির চেয়ে আর্গুমেন্টের চেয়ে বেশি অ্যারে যেমন এটি প্রয়োগ করা হয় তবুও।
ক্যাফগিকে

@ চ্যাড আমি আমার উত্তরটি paraচ্ছিক পরামিতিগুলির মধ্যে আরও ভাল পার্থক্যের জন্য সামঞ্জস্য করেছি এবং যখন তারা কোনও কোডের গন্ধে রূপান্তরিত হয় (যেমন আপনি নিজের উত্তরে উল্লেখ করেছেন)।
গ্যারি রোয়ে

@ গ্যারি রো, বেশিরভাগ ক্ষেত্রে tooচ্ছিক পরামিতিগুলি খুব খারাপ।
CaffGeek

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

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

2

সি # এর ডিফল্ট প্যারামিটারগুলির মধ্যে একটি সমস্যা (আমি শূন্যতাযুক্ত ডোসোমিংথিংয়ের কথা ভাবছি (int x = 1)) সেগুলি ধ্রুবক। এর অর্থ আপনি যদি ডিফল্ট পরিবর্তন করেন তবে আপনাকে সেই পদ্ধতি কলের যে কোনও গ্রাহককে পুনরায় কম্পাইল করতে হবে। যদিও এটি করার পক্ষে যথেষ্ট সহজ কিছু অনুষ্ঠানগুলি যেখানে এটি বিপজ্জনক।


1

এটি আপনার কোড কী করছে তার উপর নির্ভর করে। যদি বুদ্ধিমান ডিফল্ট থাকে তবে আপনার optionচ্ছিক পরামিতিগুলি ব্যবহার করা উচিত তবে যদি কোনও বুদ্ধিমান ডিফল্ট না থাকে তবে alচ্ছিক পরামিতিগুলি যুক্ত করা আপনার কোডটিকে আরও জটিল করে তুলবে। অনেক ক্ষেত্রে alচ্ছিক প্যারামিটারগুলি হ'ল নীল চেকগুলি পাশ কাটাতে এবং ব্রাঞ্চিংয়ের যুক্তিকে কাটাতে একটি ঝরঝরে উপায়। জাভাস্ক্রিপ্টে alচ্ছিক পরামিতি নেই তবে তাদের সাথে নকল করার একটি উপায় রয়েছে || (যৌক্তিক বা) এবং আমি এটি ডেটাবেস সম্পর্কিত স্টাফ করার সময় সর্বদা ব্যবহার করি কারণ যদি ব্যবহারকারী কিছু মান না দেয় তবে আমি আমার নিজস্ব মানগুলি বিকল্পের সাহায্যে || যা আমাকে পুরো বিবরণ লিখলে ঝামেলা বাঁচায় যদি বিবৃতি দেয়।


1

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

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


1

Alচ্ছিক আর্গুমেন্টগুলির সমস্যাটি হ'ল লোকেরা কোনও নতুন ফাংশনে প্রাসঙ্গিক কোডটি বের না করে কেবলমাত্র বেশি এবং বেশি (এবং আরও) যুক্তি সন্ধান করতে ঝোঁক। এটি পিএইচপি মধ্যে চরম নেওয়া হয় । এই ক্ষেত্রে:

bool array_multisort ( array &$arr [, mixed $arg = SORT_ASC
                      [, mixed $arg = SORT_REGULAR [, mixed $... ]]] )

1

Alচ্ছিক প্যারামিটারগুলি মূলত কোনও ফাংশন ওভারলোড করার একটি ভিন্ন উপায়। সুতরাং এটি মূলত নীচে নেমে আসে: "একটি ফাংশন খারাপ কি ওভারলোডিং"?


1

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


0

আমি মনে করি .চ্ছিক পরামিতি ব্যবহারের চেয়ে বিভিন্ন স্বাক্ষর (অর্থাত্ পরামিতি) সহ কোনও ফাংশন ওভারলোড করা ভাল।


কেন? আমি মনে করি এটি আরও ক্লিনার যদি আপনি একটি পদ্ধতিতে ডিফল্ট প্যারাম ব্যবহার করে একাধিক ওভারলোডেড পদ্ধতি একত্রিত করতে পারেন তবে যদি সমস্ত পদ্ধতির একই প্রাথমিক কার্যকারিতা থাকে
অমিত ওয়াধওয়া

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