কোনও ফাংশন যখন আপনি কল করছেন তখন প্যারামিটারের নামগুলি না জানার সাথে সম্পর্কিত


13

এখানে একটি প্রোগ্রামিং / ভাষার সমস্যা যা আমি আপনার মতামত শুনতে চাই।

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

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

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

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

func DrawRectangleClipped (rectToDraw, fillColor, clippingRect) {}

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

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

DrawRectangleClipped(deserializedArray[0], deserializedArray[1], deserializedArray[2])

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

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

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

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

আমি এই সম্পর্কে নতুন দৃষ্টিভঙ্গি শুনতে সত্যিই পছন্দ করব। আমি নিশ্চিত যে আমি এই সমস্যাটি বিবেচনা করার মতো প্রথম ব্যক্তি নই, তবে এটি কীভাবে সমাধান করা হবে?


2
সঠিক সমস্যাটি কী তা নিয়ে আমি বিভ্রান্ত হয়ে পড়েছি ... এখানে বেশ কয়েকটি ধারণা রয়েছে বলে মনে হচ্ছে, কোনটি আপনার মূল বিষয় তা নিশ্চিত নয়।
হতাশ

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

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

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

4
আমি মনে করি উত্তরটি "আপনার ভেরিয়েবলগুলির নাম 'ডিসরিয়ালাইজড অ্যারে" রাখবেন না?
21:51

উত্তর:


10

আমি সম্মত হই যে ফাংশনগুলি প্রায়শই ব্যবহৃত হয় সেগুলি রাইটিং কোড এবং বিশেষত কোড পড়ার একটি বিভ্রান্তিকর অংশ হতে পারে।

এই সমস্যার উত্তর আংশিকভাবে ভাষার উপর নির্ভর করে। যেমনটি আপনি উল্লেখ করেছেন, সি # পরামিতিগুলির নাম দিয়েছে। এই সমস্যাটির উদ্দেশ্য-সি এর সমাধানে আরও বর্ণনামূলক পদ্ধতির নাম জড়িত। উদাহরণস্বরূপ, stringByReplacingOccurrencesOfString:withString:পরিষ্কার পরামিতি সহ একটি পদ্ধতি।

গ্রোভিতে কিছু ফাংশন নীচের মতো একটি সিনট্যাক্সের অনুমতি দিয়ে মানচিত্র নিয়ে থাকে:

restClient.post(path: 'path/to/somewhere',
            body: requestBody,
            requestContentType: 'application/json')

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

এমনকি অবজেক্টিভ-সি-এর মতো ভাষায় এটি পরামিতিগুলির সংখ্যা সীমাবদ্ধ করে তোলে। একটি কারণ হ'ল অনেক পরামিতি alচ্ছিক। একটি উদাহরণস্বরূপ, rangeOfString দেখতে পায়; আর তার বৈচিত্র NSString

আমি জাভাতে প্রায়শই ব্যবহার করি এমন একটি প্যাটার্ন হ'ল প্যারামিটার হিসাবে সাবলীল শৈলীর ক্লাস ব্যবহার করা। উদাহরণ স্বরূপ:

something.draw(new Box().withHeight(5).withWidth(20))

এটি প্যারামিটার হিসাবে একটি ক্লাস ব্যবহার করে এবং সাবলীল শৈলীর ক্লাস সহ সহজেই পঠনযোগ্য কোড তৈরি করে।

উপরের জাভা স্নিপেটটি যেখানে প্যারামিটারগুলির ক্রম এত স্পষ্ট নাও হতে পারে সেখানে সহায়তা করে। আমরা সাধারণতঃ স্থানাঙ্ক সঙ্গে অনুমান এক্স ওয়াই সামনে আসে এবং আমি সাধারণত একটি কনভেনশন যেমন প্রস্থ সামনে উচ্চতা দেখতে, কিন্তু যে এখনও খুব স্পষ্ট নয় ( something.draw(5, 20))।

আমি এর মতো কিছু ফাংশনও দেখেছি drawWithHeightAndWidth(5, 20)কিন্তু এগুলি খুব বেশি পরামিতি নিতে পারে না, বা আপনি পড়ার ক্ষমতা হারাতে শুরু করবেন।


2
অর্ডার, আপনি যদি জাভা উদাহরণটিতে চালিয়ে যান তবে তা খুব জটিল হতে পারে। উদাহরণস্বরূপ, নীচের নির্মাণকারীর তুল্যকারক থেকে তুলনা করুন: Dimension(int width, int height)এবং GridLayout(int rows, int cols)(সারিগুলির সংখ্যাটি উচ্চতা, যার অর্থ GridLayoutউচ্চতা প্রথম এবং Dimensionপ্রস্থ রয়েছে)।
পিয়ের আরলাড

1
এই জাতীয় অসঙ্গতিগুলি পিএইচপি ( eev.ee/blog/2012/04/09/php-a-fractal-of-bad-design ) এর সাথেও খুব সমালোচিত হয়েছিল , উদাহরণস্বরূপ: array_filter($input, $callback)বনাম array_map($callback, $input), strpos($haystack, $needle)বনামarray_search($needle, $haystack)
পিয়ের আরলাড

12

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

এটি কেবল বিশেষণগুলি ব্যবহার করে একটি বাক্য লেখার চেষ্টা করার মতো। সেখানে আরও ক্রিয়া (ফাংশন কল) রাখুন, আপনার বাক্যটির জন্য একটি বিষয় (অবজেক্ট) তৈরি করুন এবং এটি পড়া সহজ:

rect.clip(clipRect).fill(color)

এমনকি যদি clipRectএবং colorভয়ানক নাম আছে (এবং তারা উচিত নয়), আপনি কি এখনও প্রসঙ্গ থেকে ধরণ উপলব্ধি করতে পারেন।

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

(rect, clipRect, color) = deserializeClippedRect()
rect.clip(clipRect).fill(color)

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


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

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

3

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

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


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


2

ইন জাভাস্ক্রিপ্ট (অথবা নাম ECMAScript ), উদাহরণস্বরূপ, অনেক প্রোগ্রামার অভ্যস্ত বৃদ্ধি

একক বেনামে অবজেক্টে নামযুক্ত অবজেক্ট বৈশিষ্ট্যের সেট হিসাবে প্যারামিটারগুলি পাস করা।

এবং প্রোগ্রামিং অনুশীলন হিসাবে এটি প্রোগ্রামারদের কাছ থেকে তাদের লাইব্রেরিতে এবং সেখান থেকে অন্যান্য প্রোগ্রামারদের কাছে এসেছিল যারা এটি পছন্দ করে এবং এটি ব্যবহার করে এবং আরও কিছু লাইব্রেরি লিখেন ইত্যাদি grew

উদাহরণ

কল করার পরিবর্তে

function drawRectangleClipped (rectToDraw, fillColor, clippingRect)

এটার মত:

drawRectangleClipped(deserializedArray[0], deserializedArray[1], deserializedArray[2])

, যা একটি বৈধ এবং সঠিক শৈলী, আপনি কল

function drawRectangleClipped (params)

এটার মত:

drawRectangleClipped({
    rectToDraw: deserializedArray[0], 
    fillColor: deserializedArray[1], 
    clippingRect: deserializedArray[2]
})

, যা কার্যকর এবং সঠিক এবং আপনার প্রশ্নের সাথে সম্মত।

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


সিনট্যাক্স যাচাই করতে আমি সেই ভাষা সম্পর্কে যথেষ্ট জানি না তবে, সামগ্রিকভাবে আমি এই পোস্টটি পছন্দ করি। বেশ মার্জিত মনে হচ্ছে। +1
আইটি অ্যালেক্স

বেশিরভাগ ক্ষেত্রে, এটি সাধারণ আর্গুমেন্টের সাথে মিলিত হয়, অর্থাত্‍, এখানে 1-3 টি যুক্তি রয়েছে params(প্রায়শই alচ্ছিক আর্গুমেন্ট এবং প্রায়শই optionচ্ছিকভাবে থাকে) যেমন এই ফাংশন । এটি উপলব্ধি করার পক্ষে অনেকগুলি আর্গুমেন্টের সাথে ফাংশন তৈরি করে (আমার উদাহরণে 2 টি বাধ্যতামূলক এবং 6 টি বিকল্প যুক্তি রয়েছে)।
মার্টিনাস

0

আপনার তখন উদ্দেশ্য-সি ব্যবহার করা উচিত, এখানে একটি ফাংশন সংজ্ঞা রয়েছে:

- (id)performSelector:(SEL)aSelector withObject:(id)anObject withObject:(id)anotherObject

এবং এখানে এটি ব্যবহৃত হয়:

[someObject performSelector:someSelector withObject:someObject2 withObject:someObject3];

আমি মনে করি রুবির একই রকম গঠন রয়েছে এবং আপনি কী-মান-তালিকাগুলি সহ অন্যান্য ভাষায় সেগুলি অনুকরণ করতে পারেন।

জাভাতে জটিল ফাংশনগুলির জন্য আমি ফাংশন শব্দের ক্ষেত্রে ডামি ভেরিয়েবলগুলি সংজ্ঞায়িত করতে চাই। আপনার বাম-ডান-উদাহরণের জন্য:

Rectangle referenceRectangle = leftRectangle;
Rectangle targetRectangle = rightRectangle;
doSomeWeirdStuffWithRectangles(referenceRectangle, targetRectangle);

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


সেই জাভা উদাহরণটি সম্পর্কে, আমি কেন প্রশ্নটি লিখলাম কেন আমি মনে করি এটি ভাল সমাধান নয়। তুমি এটা সম্পর্কে কী ভাব?
ডারউইন

0

আমার পদ্ধতির অস্থায়ী স্থানীয় ভেরিয়েবলগুলি তৈরি করা - তবে কেবল তাদের কল করুন না LeftRectangeএবং RightRectangle। বরং আমি আরও অর্থ বোঝাতে কিছুটা দীর্ঘ নাম ব্যবহার করি। আমি প্রায়শই নামগুলিকে যতটা সম্ভব পার্থক্য করার চেষ্টা করি, উদাহরণস্বরূপ, তাদের উভয়কেই কল করবেন না something_rectangle, যদি তাদের ভূমিকা খুব প্রতিসাম্পূর্ণ না হয়।

উদাহরণ (সি ++):

auto& connector_source = deserializedArray[0]; 
auto& connector_target = deserializedArray[1]; 
auto& bounding_box = deserializedArray[2]; 
DoWeirdThing(connector_source, connector_target, bounding_box)

এবং আমি এমনকি একটি ওয়ানলাইনারের মোড়ক ফাংশন বা টেম্পলেট লিখতে পারি:

template <typename T1, typename T2, typename T3>
draw_bounded_connector(
    T1& connector_source, T2& connector_target,const T3& bounding_box) 
{
    DoWeirdThing(connector_source, connector_target, bounding_box)
}

(যদি আপনি সি ++ না জানেন তবে এম্পারস্যান্ডগুলি উপেক্ষা করুন)।

যদি ফাংশনটি কোনও ভাল বিবরণ না দিয়ে বেশ কয়েকটি অদ্ভুত কাজ করে - তবে সম্ভবত এটি রিফেক্টর করা দরকার!

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