নামযুক্ত প্যারামিটারগুলি কোড পড়তে আরও সহজ করে তোলে, আরও শক্ত লেখা
আমি যখন কোনও কোডের টুকরো পড়ছি, নামযুক্ত প্যারামিটারগুলি প্রসঙ্গটি প্রবর্তন করতে পারে যা কোডটি বুঝতে সহজ করে তোলে। উদাহরণস্বরূপ বিবেচনা করুন এই কন্সট্রাকটর: Color(1, 102, 205, 170)
। পৃথিবীতে এর অর্থ কী? সত্যিই, Color(alpha: 1, red: 102, green: 205, blue: 170)
পড়া আরও সহজ হবে। কিন্তু হায়, সংকলকটি "না" বলে - এটি চায় Color(a: 1, r: 102, g: 205, b: 170)
। নামযুক্ত প্যারামিটার ব্যবহার করে কোড লেখার সময়, আপনি সঠিক নামগুলি খুঁজতে অপ্রয়োজনীয় পরিমাণ সময় ব্যয় করেন - কিছু প্যারামিটারের সঠিক নামগুলি ভুলে যাওয়া তার ক্রমটি ভুলে যাওয়া সহজ easier
প্রায় একবারে DateTime
একই ইন্টারফেসের সাথে পয়েন্ট এবং সময়সীমার জন্য দুটি ভাইবোনের ক্লাস ছিল এমন একটি এপিআই ব্যবহার করার সময় এটি একবার আমাকে বিট করে । DateTime->new(...)
একটি second => 30
যুক্তি গ্রহণ করার সময় , অন্যান্য ইউনিটগুলির জন্য এটি DateTime::Duration->new(...)
চেয়েছিল seconds => 30
এবং অনুরূপ। হ্যাঁ, এটি পুরোপুরি অর্থপূর্ণ, তবে এটি আমাকে দেখিয়েছে যে নামকরণের পরামিতিগুলি use ব্যবহারের সহজ।
খারাপ নামগুলি পড়ার পক্ষে সহজ করে না
নামকরণের পরামিতিগুলি কীভাবে খারাপ হতে পারে তার অন্য একটি উদাহরণ সম্ভবত আর ভাষা R কোডের এই অংশটি একটি ডেটা প্লট তৈরি করে:
plot(plotdata$n, plotdata$mu, type="p", pch=17, lty=1, bty="n", ann=FALSE, axes=FALSE)
আপনি x এবং y ডেটা সারিগুলির জন্য দুটি স্থিতি যুক্তি এবং তারপরে নামকরণকৃত প্যারামিটারগুলির একটি তালিকা দেখতে পান। ডিফল্ট সহ আরও অনেক অপশন রয়েছে এবং কেবলমাত্র তাদের তালিকাভুক্ত করা হয়েছে যাদের ডিফল্টগুলি আমি পরিবর্তন করতে বা স্পষ্টভাবে নির্দিষ্ট করতে চেয়েছিলাম। একবার যদি আমরা উপেক্ষা করি যে এই কোডটি ম্যাজিক নম্বর ব্যবহার করে, এবং এনামগুলি ব্যবহার করে উপকার পেতে পারে (যদি আর কোনও থাকে!), সমস্যাটি হ'ল এই প্যারামিটারের অনেকগুলি নাম বরং অনিবার্য।
pch
আসলে প্লট চরিত্র, প্রতিটি ডাটা পয়েন্টের জন্য আঁকা হবে যে গ্লাইফ। 17
এটি একটি খালি বৃত্ত, বা এর মতো কিছু।
lty
লাইন টাইপ হয়। এখানে 1
একটি কঠিন লাইন।
bty
বক্স টাইপ হয়। "n"
প্লটটির চারপাশে একটি বাক্স আঁকানো এড়ানোতে এটি সেট করা ।
ann
অক্ষরের টীকাগুলির উপস্থিতি নিয়ন্ত্রণ করে।
প্রত্যেকের সংক্ষিপ্তসারটির অর্থ কী না এমন কারও জন্য, এই বিকল্পগুলি বিভ্রান্তিকর। আর আর এই লেবেলগুলি কেন ব্যবহার করে তাও প্রকাশ করে: স্ব-ডকুমেন্টিং কোড হিসাবে নয়, (সঠিকভাবে টাইপ করা ভাষা হওয়ায়) মানগুলি তাদের সঠিক ভেরিয়েবলগুলিতে মানচিত্রের কী হিসাবে ব্যবহার করে।
পরামিতি এবং স্বাক্ষরের বৈশিষ্ট্য
ফাংশন স্বাক্ষরগুলিতে নিম্নলিখিত বৈশিষ্ট্য থাকতে পারে:
- যুক্তিগুলি অর্ডার বা আনর্ডার করা যায়,
- নামযুক্ত বা নামবিহীন,
- প্রয়োজনীয় বা alচ্ছিক।
- স্বাক্ষরগুলি আকার বা প্রকারের মাধ্যমে ওভারলোডও করা যায়,
- এবং ভারারাগসের সাথে একটি অনির্দিষ্ট আকার থাকতে পারে।
এই সিস্টেমের বিভিন্ন স্থানাঙ্কে বিভিন্ন ভাষা অবতরণ করে। সি-তে যুক্তিগুলি অর্ডার করা হয়, নামবিহীন, সর্বদা প্রয়োজনীয় এবং ভারেগস হতে পারে। জাভাতে পরিস্থিতি একই রকম, স্বাক্ষরগুলি বাদ দিয়ে ওভারলোড করা যায়। উদ্দেশ্য সিতে, স্বাক্ষরগুলি অর্ডার করা হয়, নামকরণ করা হয়, প্রয়োজনীয় হয় এবং ওভারলোড করা যায় না কারণ এটি কেবল সি এর চারপাশে সিনট্যাকটিক চিনি sugar
ভারার্গস (কমান্ড লাইন ইন্টারফেস, পার্ল,…) সহ গতিময় টাইপ করা ভাষাগুলি namedচ্ছিক নামযুক্ত পরামিতিগুলি অনুকরণ করতে পারে। স্বাক্ষর আকারের ওভারলোডিং সহ ভাষাগুলিতে অবস্থানগত optionচ্ছিক পরামিতিগুলির মতো কিছু থাকে।
নামযুক্ত পরামিতিগুলি কীভাবে প্রয়োগ করা যায় না
নামযুক্ত পরামিতিগুলির কথা চিন্তা করার সময় আমরা সাধারণত নামযুক্ত, alচ্ছিক, আনর্ডারড প্যারামিটারগুলি ধরে নিই। এগুলি কার্যকর করা কঠিন।
.চ্ছিক পরামিতিগুলির ডিফল্ট মান থাকতে পারে। এগুলি অবশ্যই ডাকা ফাংশন দ্বারা নির্দিষ্ট করা উচিত এবং কলিং কোডে সংকলন করা উচিত নয়। অন্যথায়, সমস্ত নির্ভরশীল কোডটি পুনরায় কম্পাইল না করে ডিফল্টগুলি আপডেট করা যায় না।
এখন একটি গুরুত্বপূর্ণ প্রশ্ন হল যুক্তিগুলি আসলে ফাংশনে কীভাবে প্রেরণ করা হয়। অর্ডার করা প্যারামিটারের সাহায্যে আরগগুলি একটি রেজিস্টারে বা স্ট্যাকের সহজাত ক্রমে পাস করা যেতে পারে। আমরা যখন এক মুহুর্তের জন্য নিবন্ধগুলি বাদ দিই, তখন সমস্যাটি কীভাবে স্ট্যাকের মধ্যে আনর্ডারড optionচ্ছিক যুক্তিগুলি রাখা যায়।
তার জন্য, আমাদের orderচ্ছিক আর্গুমেন্টগুলির উপর কিছু ক্রম দরকার। ডিক্লারেশন কোড পরিবর্তন হলে কী হবে? আদেশটি অপ্রাসঙ্গিক হওয়ায়, ফাংশন ঘোষণায় একটি পুনর্নির্মাণের স্ট্যাকের মানগুলির অবস্থান পরিবর্তন করা উচিত নয়। নতুন optionচ্ছিক প্যারামিটার যুক্ত করা সম্ভব কিনা তাও আমাদের বিবেচনা করা উচিত। ব্যবহারকারীর দৃষ্টিকোণ থেকে এটি মনে হয়, কারণ কোডটি যে প্যারামিটারটি আগে ব্যবহার করে নি এখনও তাদের নতুন প্যারামিটারের সাথে কাজ করা উচিত। সুতরাং এটি ঘোষণায় অর্ডার ব্যবহার করা বা বর্ণমালা ক্রম ব্যবহার করার মতো আদেশগুলি বাদ দেয়।
এটি সাব-টাইপিংয়ের এবং লিসকভ সাবস্টিটিউশন নীতিমালার আলোকেও বিবেচনা করুন - সংকলিত আউটপুটে একই নির্দেশাবলীটি সম্ভবত নতুন নতুন প্যারামিটার সহ একটি সাব টাইপ পদ্ধতিতে এবং একটি সুপার টাইপটিতে অনুরোধ করতে সক্ষম হওয়া উচিত।
সম্ভাব্য বাস্তবায়ন
আমাদের যদি একটি নির্দিষ্ট আদেশ নাও থাকতে পারে, তাই আমাদের কিছু অ-রক্ষিত ডেটা কাঠামো দরকার।
সহজ প্রয়োগটি হ'ল মানগুলির সাথে পরামিতিগুলির নামটি সহজেই পাস করা। পার্ল বা কমান্ড লাইন সরঞ্জামগুলির সাথে নাম প্যারামগুলি এভাবেই অনুকরণ করা হয়। এটি উপরে বর্ণিত সমস্ত এক্সটেনশন সমস্যাগুলি সমাধান করে, তবে স্থানের বিশাল অপচয় হতে পারে - পারফরম্যান্স-সমালোচনামূলক কোডের বিকল্প নয়। এছাড়াও, এই নামযুক্ত প্যারামগুলি প্রসেসিং এখন কেবল একটি স্ট্যাকের থেকে মান পপিংয়ের চেয়ে আরও জটিল।
প্রকৃতপক্ষে, স্ট্রিং পুলিং ব্যবহার করে স্থানের প্রয়োজনীয়তাগুলি হ্রাস করা যেতে পারে, যা পরবর্তী পংক্তির তুলনাগুলি পয়েন্টার তুলনায় কমিয়ে আনতে পারে (যখন স্থির স্ট্রিংগুলি আসলে পুল করা হয় তখন গ্যারান্টি দেওয়া যায় না, সেই ক্ষেত্রে দুটি স্ট্রিংকে তুলনা করতে হবে বিস্তারিত)।
পরিবর্তে, আমরা একটি চতুর ডেটা স্ট্রাকচারও পাস করতে পারি যা নামযুক্ত আর্গুমেন্টের অভিধান হিসাবে কাজ করে। এটি কলারের পক্ষে সস্তা, কারণ কীগুলির সেটটি কল অবস্থানে স্থিরভাবে পরিচিত। এটি একটি নিখুঁত হ্যাশ ফাংশন তৈরি করতে বা একটি ট্রিকে প্রাক্কুলেট করার অনুমতি দেয়। কলিটিকে এখনও সম্ভাব্য সমস্ত পরামিতি নামগুলির অস্তিত্বের জন্য পরীক্ষা করতে হবে যা কিছুটা ব্যয়বহুল। এরকম কিছু ব্যবহার পাইথন ব্যবহার করে।
সুতরাং এটি বেশিরভাগ ক্ষেত্রে ব্যয়বহুল
যদি নামযুক্ত পরামিতিগুলির সাথে কোনও ফাংশনটি যথাযথভাবে প্রসারিত হয় তবে একটি নির্দিষ্ট আদেশটি ধরে নেওয়া যায় না। সুতরাং শুধুমাত্র দুটি সমাধান রয়েছে:
- নামকৃত প্যারামগুলির ক্রমটিকে স্বাক্ষরের অংশ করুন এবং পরে পরিবর্তনগুলি অস্বীকার করুন। এটি স্ব-ডকুমেন্টিং কোডের জন্য দরকারী তবে alচ্ছিক যুক্তিগুলির সাথে সহায়তা করে না।
- ক্যালিতে একটি মূল-মান ডেটা স্ট্রাকচার পাস করুন, এরপরে দরকারী তথ্য বের করতে হবে। এটি তুলনা করার ক্ষেত্রে খুব ব্যয়বহুল এবং সাধারণত স্ক্রিপ্টিং ভাষায় প্রদর্শিত হয় পারফরম্যান্সের উপর জোর না দিয়ে।
অন্যান্য ক্ষতি
একটি ফাংশন ঘোষণার মধ্যে পরিবর্তনশীল নামগুলির সাধারণত কিছু অভ্যন্তরীণ অর্থ থাকে এবং ইন্টারফেসের অংশ হয় না - এমনকি যদি অনেক ডকুমেন্টেশন সরঞ্জামগুলি সেগুলি প্রদর্শন করে। অনেক ক্ষেত্রে আপনি অভ্যন্তরীণ ভেরিয়েবলের জন্য আলাদা আলাদা নাম এবং সংশ্লিষ্ট নামযুক্ত যুক্তি চান। যে ভাষাগুলি নামকরণের প্যারামিটারের বাহ্যিকভাবে দৃশ্যমান নামগুলি বেছে নেওয়ার অনুমতি দেয় না সেগুলি যদি ভেরিয়েবল নামটি কলিং প্রসঙ্গে বিবেচনা না করে ব্যবহার করা হয় তবে সেগুলি তাদের বেশি লাভ করে না।
নামযুক্ত যুক্তিগুলির অনুকরণ সহ একটি সমস্যা হ'ল কলার পক্ষের স্থির চেকের অভাব। যুক্তিগুলির একটি অভিধান পাস করার সময় এটি ভুলে যাওয়া বিশেষত (আপনার দিকে, পাইথনের দিকে তাকানো) looking এটি গুরুত্বপূর্ণ কারণ একটি অভিধান ক্ষণস্থায়ী একটি সাধারণ কার্যসংক্রান্ত যেমন জাভাস্ক্রিপ্ট রয়েছে: foo({bar: "baz", qux: 42})
। এখানে, মানগুলির প্রকারভেদ বা নির্দিষ্ট নামের অস্তিত্ব বা অনুপস্থিতি উভয়ই স্থিরভাবে পরীক্ষা করা যায় না।
নামকরণের প্যারামিটারগুলি এমুলেটিং (স্ট্যাটিকালি টাইপড ভাষায়)
কেবল কী হিসাবে স্ট্রিংগুলি ব্যবহার করা, এবং কোনও মান হিসাবে কোনও বস্তু স্ট্যাটিক প্রকারের পরীক্ষকের উপস্থিতিতে খুব কার্যকর হয় না। যাইহোক, নামযুক্ত আর্গুমেন্টগুলি স্ট্রাক্টগুলি বা অবজেক্ট ল্যাটারালগুলি দিয়ে অনুকরণ করা যেতে পারে:
// Java
static abstract class Arguments {
public String bar = "default";
public int qux = 0;
}
void foo(Arguments args) {
...
}
/* using an initializer block */
foo(new Arguments(){{ bar = "baz"; qux = 42; }});