ডায়নামিকালি টাইপ করা ভাষায় একটি ফাংশন থেকে বিভিন্ন ডেটা ধরণের ফিরিয়ে দেওয়া কি খারাপ ধারণা?


65

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

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

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


সম্পাদনা : আমি আমার উদাহরণটি সরিয়ে ফেলছি (যতক্ষণ না আমি এর চেয়ে ভালটির কথা ভাবতে পারি)। আমি মনে করি এটি লোকেদের এমন এক পয়েন্টে জবাব দেওয়ার জন্য পরিচালিত করছে যা আমি করার চেষ্টা করছি না।


ত্রুটি মামলায় কেন ব্যতিক্রম নিক্ষেপ করবেন না?
ট্রুউইল

1
@ ট্রুইউইল আমি পরবর্তী বাক্যে এটিকে সম্বোধন করব।
ড্যানিয়েল ক্যাপলান

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

3
উল্লেখ করা হয়নি, তবে ফাংশনগুলির অনেকগুলি উদাহরণ (এমনকি জাভা জেনেরিক্সে) রয়েছে যা পরামিতি হিসাবে একটি রিটার্ন-টাইপ নেয়; যেমন কমন লিস্পে আমরা (coerce var 'string)একটি stringবা (concatenate 'string this that the-other-thing)তেমনি ফলন পেয়েছি । আমি ThingLoader.getThingById (Class<extends FindableThing> klass, long id)পাশাপাশি জিনিস লিখেছি । এবং সেখানে আমি কেবল এমন কিছু প্রত্যাবর্তন করতে পারি যা আপনি যা চেয়েছিলেন তা সাবক্লাসগুলি: যা loader.getThingById (SubclassA.class, 14)হয়ত SubclassBপ্রসারিত হবে তা ফিরে আসতে পারে SubclassA...
বিআরপোক্ক

1
গতিশীলভাবে টাইপ করা ভাষাগুলি দ্য ম্যাট্রিক্স মুভিতে চামচের মতো । সংজ্ঞায়িত করার চেষ্টা করবেন না চামচ হিসেবে স্ট্রিং বা সংখ্যা । এটা অসম্ভব হবে। পরিবর্তে ... শুধুমাত্র সত্য বোঝার চেষ্টা করুন। যে কোন চামচ আছে
প্রতিক্রিয়া

উত্তর:


42

অন্যান্য উত্তরের বিপরীতে, এমন কিছু ক্ষেত্রে রয়েছে যেখানে বিভিন্ন ধরণের প্রত্যাবর্তন গ্রহণযোগ্য।

উদাহরণ 1

sum(2, 3)  int
sum(2.1, 3.7)  float

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

var sum = function (a, b) {
    return a + b;
};

একই ফাংশন, বিভিন্ন ধরণের রিটার্ন মান।

উদাহরণ 2

কল্পনা করুন যে আপনি একটি ওপেনআইডি / ওএউথ উপাদান থেকে প্রতিক্রিয়া পেয়েছেন। কিছু ওপেনআইডি / ওআউথ সরবরাহকারীতে আরও বেশি তথ্য থাকতে পারে যেমন ব্যক্তির বয়স।

var user = authProvider.findCurrent();
// user is now:
// {
//     provider: 'Facebook',
//     name: {
//         firstName: 'Hello',
//         secondName: 'World',
//     },
//     email: 'hello.world@example.com',
//     age: 27
// }

অন্যের ন্যূনতম থাকবে, এটি কোনও ইমেল ঠিকানা বা ছদ্মনাম হবে।

var user = authProvider.findCurrent();
// user is now:
// {
//     provider: 'Google',
//     email: 'hello.world@example.com'
// }

আবার, একই ফাংশন, বিভিন্ন ফলাফল।

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

var user = authProvider.findCurrent();
if (user.age || 0 >= 16) {
    // The person can stand mature language.
    allowShowingContent();
} else if (user.age) {
    // OpenID/OAuth gave the age, but the person appears too young to see the content.
    showParentalAdvisoryRequestedMessage();
} else {
    // OpenID/OAuth won't tell the age of the person. Ask the user himself.
    askForAge();
}

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

var age;
if (['Facebook', 'Yahoo', 'Blogger', 'LiveJournal'].contains(user.provider)) {
    age = user.age;
}

5
"স্ট্যাটিকালি টাইপ করা ভাষাগুলিতে, এটি " কিছু স্ট্যাটিকালি টাইপ করা ভাষায় " আপনি বোঝাতে চেয়েছিলেন " আমি ওভারলোডগুলি জড়িত ":) ভাল স্ট্যাটিকালি টাইপ করা ভাষাগুলিকে আপনার sumউদাহরণের মতো কোনও কিছুর জন্য ওভারলোডিং প্রয়োজন হয় না ।
আন্দ্রেস এফ।

17
আপনার নির্দিষ্ট উদাহরণস্বরূপ, Haskell, বিবেচনা করুন: sum :: Num a => [a] -> a। আপনি যে কোনও সংখ্যার যে কোনও একটি তালিকা যোগ করতে পারেন। জাভাস্ক্রিপ্টের বিপরীতে, যদি আপনি এমন কিছু সংখ্যার যোগফলের চেষ্টা করেন যা একটি সংখ্যা নয় তবে সংকলনের সময় ত্রুটিটি ধরা পড়বে।
অ্যান্ড্রেস এফ।

3
স্ক্যান ইন মাইনমা, Iterator[A]এর পদ্ধতি রয়েছে def sum[B >: A](implicit num: Numeric[B]): Bযা আবার কোনও ধরণের সংখ্যার যোগ করতে দেয় এবং সংকলনের সময় পরীক্ষা করা হয়।
পেটর পুদলেক

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

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

31

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

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

তবে মনে রাখবেন যে কোনও নির্দিষ্ট ফাংশনটি খারাপভাবে ডিজাইনের অন্যান্য কারণও থাকতে পারে: উদাহরণস্বরূপ, একটি sumফাংশন অবৈধ ইনপুটগুলিতে প্রত্যাবর্তন করা একটি খারাপ ধারণা মূলত কারণ সেই রিটার্ন মানটি অকেজো এবং ত্রুটি-প্রবণ (0 <-> মিথ্যা বিভ্রান্তি)।


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

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

5
@ অ্যারোনট অন্যদিকে NaN, নাল বস্তুর মতো, ত্রুটিগুলি ঘটলে কেবল লুকিয়ে থাকে, কেবল তাদের পরে পপ আপ করার জন্য। উদাহরণস্বরূপ, NaNলুপ শর্তসাপেক্ষে পিছলে গেলে আপনার প্রোগ্রামটি ফুরিয়ে যাওয়ার সম্ভাবনা রয়েছে ।
ইজকাটা

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

4
আমি জানি না কেন এটি "নাল বনাম অন্যান্য সবকিছু" যুক্তিতে রূপান্তরিত হয়েছিল। আমি কেবল উল্লেখ করছিলাম যে NaNমানটি (ক) আসলে কোনও ভিন্ন রিটার্নের ধরণের নয় এবং (খ) ভাসমান-পয়েন্ট শব্দার্থের সঠিকভাবে সংজ্ঞা দেওয়া হয়েছে, এবং তাই প্রকৃতপক্ষে ভেরিয়েবল-টাইপযুক্ত রিটার্ন মানটির অ্যানালগ হিসাবে যোগ্যতা অর্জন করে না। এটি পূর্ণসংখ্যার গাণিতিকের তুলনায় শূন্যের থেকে আলাদা নয় ; যদি কোনও শূন্য "দুর্ঘটনাক্রমে" আপনার গণনাগুলিতে চলে যায় তবে আপনি প্রায়শই শূন্যের ফলস্বরূপ পরিণতিতে শূন্য বা বিভাজন দ্বারা শূন্যের ত্রুটিযুক্ত হতে পারেন। আইইইই ভাসমান পয়েন্ট দ্বারা সংজ্ঞায়িত "অনন্ত" মানগুলি কি মন্দ?
অ্যারোনআউট

26

গতিশীল ভাষাগুলিতে, আপনাকে জিজ্ঞাসা করা উচিত নয় যে বিভিন্ন ধরণের ফিরে আসে তবে বিভিন্ন API সহ বস্তুগুলি । যেহেতু বেশিরভাগ গতিশীল ভাষা প্রকৃতপক্ষে প্রকারের বিষয়ে চিন্তা করে না, তবে হাঁসের টাইপের বিভিন্ন সংস্করণ ব্যবহার করে

ফেরত দেওয়ার সময় বিভিন্ন ধরণের অর্থটি তৈরি করা উচিত

উদাহরণস্বরূপ এই পদ্ধতিটি বোঝায়:

def load_file(file): 
    if something: 
       return ['a ', 'list', 'of', 'strings'] 
    return open(file, 'r')

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

আপনি শর্তসাপেক্ষে ফিরে আসতে পারেন listবা tuple( tupleঅজগরটিতে একটি অপরিবর্তনীয় তালিকা)।

সাধারণভাবে এমনকি:

def do_something():
    if ...: 
        return None
    return something_else

বা:

function do_something(){
   if (...) return null; 
   return sth;
}

পাইথন Noneএবং জাভাস্ক্রিপ্ট উভয়ই nullতাদের ডানদিকে টাইপ হওয়ায় বিভিন্ন ধরণের ফেরত দেয় ।

এই সমস্ত ব্যবহারের ক্ষেত্রে স্থির ভাষায় তাদের প্রতিরূপ থাকবে, ফাংশনটি একটি সঠিক ইন্টারফেসটি ফিরিয়ে দেবে।

শর্তসাপেক্ষে বিভিন্ন এপিআই দিয়ে জিনিসগুলি ফেরত দেওয়া একটি ভাল ধারণা

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


4
ভাল উত্তর. জাভা / স্ট্যাটিকালি টাইপ করা সমতুল্য একটি নির্দিষ্ট কংক্রিটের পরিবর্তে একটি ইন্টারফেস ফিরিয়ে আনা, ইন্টারফেসটি API / বিমূর্ততা উপস্থাপনের সাথে উল্লেখযোগ্য।
মাইকরা

1
আমি মনে করি আপনি পাইপনি করছেন, পাইথনে একটি তালিকা এবং একটি টিপল বিভিন্ন "প্রকারের" হতে পারে তবে সেগুলি একই "হাঁসের ধরণের", অর্থাৎ তারা একই অপারেশনের সেটকে সমর্থন করে। এবং এর মতো ক্ষেত্রে হ'ল হাঁসের টাইপিংয়ের পরিচয় কেন দেওয়া হয়েছে। আপনি জাভাতে দীর্ঘ x = getInt () করতে পারেন।
কেরবার

"বিভিন্ন ধরণের প্রত্যাবর্তন" এর অর্থ হ'ল "বিভিন্ন এপিআই দিয়ে জিনিস ফেরত দেওয়া"। (কিছু ভাষাগুলি এপিআই-র একটি মৌলিক অংশটি তৈরির উপায়ে তৈরি করে, কিছু করে না; এটি টাইপ সিস্টেমটি কতটা do_fileউদ্বেগজনক বিষয়।) আপনার তালিকা / ফাইলের উদাহরণে, কোনওভাবেই স্ট্রিংগুলির পুনরাবৃত্তিযোগ্য ফেরত দেয়।
গিলস

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

1
None or somethingপিপি, নুম্বা, পাইস্টন এবং অন্যদের মতো সরঞ্জাম দ্বারা সম্পাদিত পারফরম্যান্স অপ্টিমাইজেশনের জন্য ফিরে আসা হত্যাকারী। এটি পাইথন-ইসমগুলির মধ্যে একটি যা পাইথনকে এত তাড়াতাড়ি করে না।
ম্যাট

9

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

ত্রুটি শর্তের ব্যবহারের ক্ষেত্রে ধরণের ব্যবহারটি বোধগম্য হয় এবং স্ট্যাটিকভাবে টাইপ করা ভাষায় নাল প্যাটার্ন (সবকিছুই একটি প্যাটার্ন হতে হবে) একই ধরণের জিনিসটি করে। আপনার ফাংশন কলটি ফেরত দেয় objectবা এটি ফিরে আসে null

কিন্তু এটা বলার অপেক্ষা রাখে না "আমি এই ব্যবহার করার জন্য একটি তৈরি করতে যাচ্ছি একটি সংক্ষিপ্ত পদক্ষেপ কারখানা প্যাটার্ন এবং রিটার্ন" হয় fooবা barবা bazফাংশনের মেজাজ উপর নির্ভর করে। কলর প্রত্যাশিত fooহলেও দেওয়া হয়েছিল যখন এটি ডিবাগ করা একটি দুঃস্বপ্ন হয়ে উঠবে bar

সুতরাং আমি মনে করি না আপনি বদ্ধ মনের মত হয়ে যাচ্ছেন। ভাষার বৈশিষ্ট্যগুলি কীভাবে ব্যবহার করবেন সে সম্পর্কে আপনি যথাযথভাবে সতর্ক হন।

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


6

জাভাতে জেনেরিক্স ব্যবহার আপনাকে স্ট্যাটিক ধরণের সুরক্ষা বজায় রেখে অন্য ধরণের ফিরিয়ে আনতে দেয়। ফাংশন কলের জেনেরিক টাইপ প্যারামিটারে আপনি যে প্রকারটি ফিরে আসতে চান তা কেবল আপনি নির্দিষ্ট করে দিন।

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

আপনি যদি জানতে চান যে স্ট্যাটিস্টিকাল-টাইপ করা ভাষায় আপনি যখন কাজ করতে অভ্যস্ত তখন ডায়নামিক রিটার্নের দৃশ্যপট কোথায় কাজ করতে পারে তবে dynamicসি # তে কীওয়ার্ডটি দেখুন। রব কনারি কীওয়ার্ডটি ব্যবহার করে 400 লাইন কোডে একটি অবজেক্ট-রিলেশনাল ম্যাপার সফলভাবে লিখতে সক্ষম হয়েছিল dynamic

অবশ্যই, সবগুলিই কিছু রানটাইম টাইপ সুরক্ষা সহ dynamicএকটি objectভেরিয়েবল মোড়ানো ।


4

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


4

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

আপনি যা প্রস্তাব করেন তার আপত্তিজনক অংশটি এখানে। যদি আমি না জানি কী প্রকারটি ফিরে আসে তবে আমি তাৎক্ষণিকভাবে ফেরতের মানটি ব্যবহার করতে পারি না। আমাকে এ সম্পর্কে কিছু "আবিষ্কার" করতে হবে।

total = sum_of_array([20, 30, 'q', 50])
if (type_of(total) == Boolean) {
  display_error(...)
} else {
  record_number(total)
}

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

total = sum_of_array([20, 30, 'q', 50])
display_number(total)

প্রথম লাইনটি সাফল্যের সাথে ফিরে আসায়, আমি ধরে নিই যে totalআসলে অ্যারের যোগফল রয়েছে। যদি এটি সফলভাবে না ফিরে আসে, আমরা আমার প্রোগ্রামের অন্য কোনও পৃষ্ঠায় ঝাঁপিয়ে পড়ি।

আসুন অন্য উদাহরণ ব্যবহার করুন যা কেবল ত্রুটি প্রচারের পক্ষে নয়। হয়তো যোগ_আফ_আরে স্মার্ট হতে চেষ্টা করে এবং কিছু ক্ষেত্রে একটি মানব-পঠনযোগ্য স্ট্রিং ফিরিয়ে দেওয়ার চেষ্টা করে, যেমন "এটি আমার লকার সংমিশ্রণ!" যদি এবং কেবলমাত্র অ্যারে হয় [11,7,19]। আমি একটি ভাল উদাহরণ চিন্তা করতে সমস্যা হচ্ছে। যাইহোক, একই সমস্যা প্রযোজ্য। আপনি এটির সাথে কিছু করার আগে আপনাকে ফেরতের মানটি পরীক্ষা করতে হবে:

total = sum_of_array([20, 30, 40, 50])
if (type_of(total) == String) {
  write_message(total)
} else {
  record_number(total)
}

আপনার পক্ষে যুক্তি হতে পারে যে ফাংশনটির জন্য কোনও পূর্ণসংখ্যা বা ফ্লোট ফেরত দেওয়া কার্যকর হবে যেমন:

sum_of_array(20, 30, 40) -> int
sum_of_array(23.45, 45.67, 67.789044) -> float

তবে আপনার ফলাফল হিসাবে এই ফলাফলগুলি বিভিন্ন ধরণের নয়। আপনি উভয়কে সংখ্যার হিসাবে বিবেচনা করতে যাচ্ছেন এবং এটিই আপনার যত্নশীল। সুতরাং sum_of_array সংখ্যা টাইপ করে। পলিমারফিজম সম্পর্কে এটিই।

সুতরাং আপনার ফাংশনটি একাধিক ধরণের ফিরিয়ে দিতে পারে এমন কিছু অনুশীলন রয়েছে যা আপনি লঙ্ঘন করছেন। তাদের নির্দিষ্ট করে জানলে আপনাকে নির্ধারণ করতে সহায়তা করবে যে আপনার নির্দিষ্ট ফাংশনটি যাইহোক একাধিক ধরণের ফিরে আসা উচিত কিনা।


দুঃখিত, আমি আমার খারাপ উদাহরণ দিয়ে আপনাকে বিপথগামী করেছিলাম। ভুলে যাও আমি এটি প্রথম স্থানে উল্লেখ করেছি। আপনার প্রথম অনুচ্ছেদটি পয়েন্টে রয়েছে। আমি আপনার দ্বিতীয় উদাহরণটিও পছন্দ করি।
ড্যানিয়েল ক্যাপলান

4

প্রকৃতপক্ষে, এমনকি স্ট্যাটিক্যালি টাইপ করা ভাষায় বিভিন্ন ধরণের ফিরিয়ে দেওয়া মোটেই অস্বাভাবিক নয়। এই কারণেই আমাদের ইউনিয়নের ধরণ রয়েছে।

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

অনেক ভাষায়, ত্রুটির শর্তগুলি ফলাফল ফলাফল বা ত্রুটির ধরণের প্রত্যাবর্তনকে সাবরুটাইন হিসাবে মডেল করা হয়। উদাহরণস্বরূপ, স্কালায়:

def transferMoney(amount: Decimal): Either[String, Decimal]

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

এটি ব্যতিক্রমগুলির মতোই, ব্যতিক্রমগুলিও নিয়ন্ত্রণ প্রবাহের গঠন except তারা প্রকৃতপক্ষে অভিব্যক্তির ক্ষমতার সমান GOTO


জাভা ফিরতি পদ্ধতিতে অদ্ভুত শোনায়। " ফিরে যাও একটি ব্যতিক্রম " ... হুম
মশা

3
একটি ব্যতিক্রম জাভাতে কোনও পদ্ধতির সম্ভাব্য ফলাফল। আসলে, আমি একটি চতুর্থ প্রকারটি ভুলে গেছি: Unit(কোনও পদ্ধতিতে মোটেও ফেরার প্রয়োজন হয় না)। সত্য, আপনি আসলে returnকীওয়ার্ডটি ব্যবহার করেন না , তবে এটি ফলাফলের পরে পদ্ধতি থেকে ফিরে আসে। চেক করা ব্যতিক্রমগুলি সহ, এটি স্বাক্ষর টাইপের স্বাক্ষরেও স্পষ্টভাবে উল্লেখ করা হয়েছে।
Jörg W Mittag

আমি দেখি. আপনার বক্তব্যটি কিছুটা যোগ্যতা বলে মনে হচ্ছে, তবে এটি উপস্থাপিত উপায়ে এটি বাধ্যতামূলক দেখাচ্ছে না ... বরং বিপরীত
জান্নাত

4
অনেক ভাষায়, ত্রুটি শর্তগুলি একটি ফলাফল বা কোনও ত্রুটির প্রকার ফেরত সাবরুটিন হিসাবে মডেল করা হয়। ব্যতিক্রমগুলি হ'ল একই ধারণা, ব্যতীত এগুলিও নিয়ন্ত্রণ প্রবাহের নির্মাণ ( GOTOপ্রকৃত পক্ষে অভিব্যক্তিগত শক্তিতে সমান )।
Jörg ডব্লু মিটাগ

4

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

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

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

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


3

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

function ensure_fields($consideration)
{
        $args = func_get_args();
        foreach ( $args as $a ) {
                if ( !is_string($a) ) {
                        return NULL;
                }
                if ( !isset($consideration[$a]) || $consideration[$a]=='' ) {
                        return FALSE;
                }
        }

        return TRUE;
}

ফাংশনটি নামমাত্র একটি বুলিয়ান দেয়, তবে এটি অবৈধ ইনপুটটিতে নুল ফেরত দেয়। নোট করুন যে পিএইচপি 5.3 থেকে সমস্ত অভ্যন্তরীণ পিএইচপি ফাংশনগুলিও এইভাবে আচরণ করে । অতিরিক্তভাবে, কিছু অভ্যন্তরীণ পিএইচপি ফাংশন নামমাত্র ইনপুটটিতে মিথ্যা বা INT প্রদান করে, দেখুন:

strpos('Hello', 'e');  // Returns INT(1)
strpos('Hello', 'q');  // Returns BOOL(FALSE)

4
এবং এই কারণেই আমি পিএইচপি ঘৃণা করি। ঠিক আছে, যাইহোক, এর একটি কারণ of
অ্যারোনআউট

1
ডাউনটোট কারন আমি পেশাগতভাবে যে ভাষাটি বিকাশ করি তা কেউ পছন্দ করে না?!? যতক্ষণ না তারা খুঁজে পায় যে আমি ইহুদি! :)
dotancohen

3
সবসময় ধরে নিবেন না যে মন্তব্য করা লোক এবং লোকে যারা ভোট দিয়েছেন তারা একই লোক।
অ্যারোনআউট

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

1
এছাড়াও, আপনি যদি nullত্রুটিতে ফিরে যান, দয়া করে দয়া করে কোনও ডকব্লক (উদাঃ @return boolean|null) এ এটি পরিষ্কার করুন , সুতরাং যদি আমি কোনও দিন আপনার কোডটি উপস্থিত করি তবে আমাকে ফাংশন / পদ্ধতি বডি পরীক্ষা করতে হবে না।
স্ক্রিপ্টিন

3

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

জাভা 1.4

public static Boolean getBoolean(String property){
    return (Boolean) properties.getProperty(property);
}
public static Integer getInt(String property){
    return (Integer) properties.getProperty(property);
}

জাভা 1.5+

public static <T> getValue(String property, Class<T> clazz) throws WhateverCheckedException{
    return clazz.getConstructor(String.class).newInstance(properties.getProperty(property));
}
//the call will be
Boolean b = getValue("useProxy",Boolean.class);
Integer b = getValue("proxyPort",Integer.class);

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


ব্যাখ্যা ছাড়াই আরেকটি ডাউনভোট! ধন্যবাদ এসই সম্প্রদায়!
থার্মজ

2
সহানুভূতি +1 করুন। আপনার উত্তরটি আরও স্পষ্ট এবং প্রত্যক্ষ উত্তরের মাধ্যমে খোলার চেষ্টা করা উচিত এবং বিভিন্ন উত্তরের বিষয়ে মন্তব্য করা থেকে বিরত থাকুন। (আমি আপনাকে আরও একটি +1 দেব, যেহেতু আমি আপনার সাথে একমত, তবে আমার কাছে কেবল একটি দিতে হবে))
ডগএম

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

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

1
খারাপ লাগবেন না, ডাউনভোটরা প্রায়শই লেখকের চেয়ে পাঠককে বেশি বলে।
কার্ল বিলেফেল্ড 18

2

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


1

পার্ল এটি প্রচুর ব্যবহার করে কারণ কোনও ফাংশন যা করে তা তার প্রসঙ্গে নির্ভর করে । উদাহরণস্বরূপ, কোনও ফাংশন তালিকা প্রসঙ্গে ব্যবহৃত হলে একটি অ্যারে বা স্কেলারের মান আশা করা যায় এমন জায়গায় ব্যবহৃত হলে অ্যারের দৈর্ঘ্য দিতে পারে। টিউটোরিয়াল থেকে যে "পারল প্রসঙ্গ" জন্য প্রথম হিট , যদি আপনি তা করেন:

my @now = localtime();

তারপরে @ এখন একটি অ্যারে ভেরিয়েবল (এটিই @ এর অর্থ কী) এবং এতে (40, 51, 20, 9, 0, 109, 5, 8, 0) এর মতো অ্যারে থাকবে।

পরিবর্তে আপনি যদি ফাংশনটিকে এমনভাবে কল করেন যেখানে এর ফলাফলটি স্কেলার হতে হবে, ($ ভেরিয়েবলগুলি স্কেলারগুলি সহ):

my $now = localtime();

তারপরে এটি সম্পূর্ণ আলাদা কিছু করে: $ এখন "শুক্র জানুয়ারী 20:51:40 ২০০৯" এর মতো কিছু হবে।

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


পার্ল - ওয়ানরেএ ... এবং এটির ভাল বা খারাপ যদি কিছু আলোচনার লিঙ্ক হতে পারে তবে আপনি যে নির্দিষ্ট উপায়ে তা উল্লেখ করতে চাইতে পারেন - পার্লমনসকে উইনারির ব্যবহার ক্ষতিকারক হিসাবে বিবেচনা করা হয়েছে

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

কঠোরভাবে, এটি ওভারলোডিংয়ের একটি ফর্মের পরিমাণ। অন্য কথায়, একাধিক ফেডারেটেড ফাংশন রয়েছে এবং কলটির বিবরণগুলির উপর নির্ভর করে একটি বা অন্য সংস্করণটি বেছে নেওয়া হয়েছে।
আয়ান

1

গতিশীল-জমিতে এগুলি সবই হাঁসের টাইপিংয়ের। সর্বাধিক দায়িত্বশীল উন্মুক্ত / জনসাধারণের মুখোমুখি জিনিস হ'ল সম্ভাব্য বিভিন্ন ধরণের একটি মোড়কে মোড়ানো যা তাদের একই ইন্টারফেস দেয়।

function ThingyWrapper(thingy){ //a function constructor (class-like thingy)

    //thingy is effectively private and persistent for ThingyWrapper instances

    if(typeof thingy === 'array'){
        this.alertItems = function(){
            thingy.forEach(function(el){ alert(el); });
        }
    }
    else {
        this.alertItems = function(){
            for(var x in thingy){ alert(thingy[x]); }
        }
    }
}

function gimmeThingy(){
    var
        coinToss = Math.round( Math.random() ),//gives me 0 or 1
        arrayThingy = [1,2,3],
        objectThingy = { item1:1, item2:2, item3:3 }
    ;

    //0 dynamically evaluates to false in JS
    return new ThingyWrapper( coinToss ? arrayThingy : objectThingy );
}

gimmeThingy().alertItems(); //should be same every time except order of numbers - maybe

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

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

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