অনলাইনে সফটওয়্যারটিতে এলোমেলো বিষয়গুলি পড়ার সময় আমি হাঁসের টাইপিং শব্দটি পেয়েছি এবং এটি পুরোপুরি বুঝতে পারি নি।
"হাঁসের টাইপিং" কী?
অনলাইনে সফটওয়্যারটিতে এলোমেলো বিষয়গুলি পড়ার সময় আমি হাঁসের টাইপিং শব্দটি পেয়েছি এবং এটি পুরোপুরি বুঝতে পারি নি।
"হাঁসের টাইপিং" কী?
উত্তর:
এটা ব্যবহৃত শব্দই হলো গতিশীল ভাষায় যে হবে না শক্তিশালী টাইপিং ।
ধারণাটি হ'ল কোনও বস্তুর উপর বিদ্যমান পদ্ধতিটি চাওয়ার জন্য আপনার কোনও প্রকারের দরকার নেই - যদি কোনও পদ্ধতিতে এটি সংজ্ঞায়িত করা হয় তবে আপনি এটি শুরু করতে পারেন।
নামটি এই শব্দটি থেকে এসেছে "এটি যদি হাঁসের মতো দেখায় এবং হাঁসের মতো কোঁক দেয়, এটি একটি হাঁস"।
উইকিপিডিয়ায় আরও অনেক তথ্য রয়েছে।
হাঁসের টাইপিংয়ের অর্থ একটি অপারেশন এর অপারেশনগুলি যে পূরণ করতে হবে তা আনুষ্ঠানিকভাবে নির্দিষ্ট করে না , তবে যা দেওয়া হয় তা দিয়ে চেষ্টা করে ।
অন্যেরা যা বলেছে তার বিপরীতে, এটি অগত্যা গতিময় ভাষা বা উত্তরাধিকার সংক্রান্ত সমস্যার সাথে সম্পর্কিত নয়।
উদাহরণ টাস্ক:Quack
একটি বস্তুর উপর কিছু পদ্ধতি কল করুন ।
হাঁস-টাইপিং ব্যবহার না করে, f
এই টাস্কটি করছে এমন একটি ক্রিয়াকলাপটি আগে থেকেই নির্দিষ্ট করতে হবে যে তার যুক্তিতে কিছু পদ্ধতি সমর্থন করতে হবে Quack
। একটি সাধারণ উপায় হ'ল ইন্টারফেস ব্যবহার
interface IQuack {
void Quack();
}
void f(IQuack x) {
x.Quack();
}
কলিং f(42)
ব্যর্থ হয়, তবে f(donald)
যতক্ষণ না donald
একটি IQuack
সাব-টাইপের উদাহরণ হিসাবে কাজ করে ।
আর একটি পদ্ধতির কাঠামোগত টাইপিং - তবে আবার, পদ্ধতিটি Quack()
এমন কোনও কিছুকে আনুষ্ঠানিকভাবে নির্দিষ্ট করা হয়েছে যা এটি quack
আগে থেকে প্রমাণ করতে পারে না যে সংকলক ব্যর্থতার কারণ হতে পারে।
def f(x : { def Quack() : Unit }) = x.Quack()
আমরা এমনকি লিখতে পারে
f :: Quackable a => a -> IO ()
f = quack
হাস্কেল-এ, যেখানে Quackable
টাইপক্লাস আমাদের পদ্ধতির অস্তিত্ব নিশ্চিত করে।
ঠিক আছে, যেমনটি আমি বলেছি, হাঁসের টাইপিং সিস্টেম প্রয়োজনীয়তা নির্দিষ্ট করে না তবে কিছু কাজ করে কিনা চেষ্টা করে ।
সুতরাং, পাইথনের সর্বদা হাঁসের টাইপিং ব্যবহার করে একটি গতিশীল টাইপ সিস্টেম:
def f(x):
x.Quack()
যদি f
একটি x
সমর্থনকারী একটি পায় Quack()
, সবকিছু ঠিক আছে, যদি তা না হয় তবে এটি রানটাইমের সময় ক্রাশ হবে।
তবে হাঁসের টাইপিং মোটেও গতিশীল টাইপিংকে বোঝায় না - আসলে, এখানে একটি খুব জনপ্রিয় তবে সম্পূর্ণ স্ট্যাটিক হাঁস টাইপিং অ্যাপ্রোচ আছে যা কোনও প্রয়োজনীয়তাও দেয় না:
template <typename T>
void f(T x) { x.Quack(); }
ফাংশনটি কোনওভাবে বলতে পারে না যে এটি কিছু x
করতে পারে Quack
এমনটি চায় , তাই পরিবর্তে এটি কেবল সংকলন করার সময় চেষ্টা করে এবং যদি সবকিছু কাজ করে তবে তা ঠিক আছে।
def f(x)
পরিবর্তে def f(IQuack x)
।
প্রশ্নের শব্দার্থবিজ্ঞানের আলোচনাটি মোটামুটি nuanced (এবং খুব একাডেমিক), তবে এখানে সাধারণ ধারণাটি রয়েছে:
হাঁসের টাইপিং
("যদি এটি হাঁসের মতো হাঁটতে থাকে এবং হাঁসের মতো কোঁক দেয় তবে এটি হাঁস” ") - হ্যাঁ! তবে তার মানে কি ??! উদাহরণস্বরূপ এটি সর্বোত্তমভাবে ফুটিয়ে তোলা হয়েছে:
হাঁসের টাইপিং কার্যকারিতার উদাহরণ:
ভাবুন আমার একটা ম্যাজিক ভান্ড আছে। এটির বিশেষ ক্ষমতা রয়েছে। আমি যদি লাঠিটি তরঙ্গ করে বলি "ড্রাইভ!" একটি গাড়ী, ভাল তারপর, এটি ড্রাইভ!
এটি অন্যান্য জিনিস কাজ করে? নিশ্চিত নয়: তাই আমি ট্রাকে চেষ্টা করে দেখি। বাহ - এটাও চালায়! আমি এরপরে এটি প্লেন, ট্রেন এবং 1 উডসে চেষ্টা করে দেখি (এগুলি একধরণের গল্ফ ক্লাব যা লোকেরা গল্ফ বল 'চালাতে' ব্যবহার করে)। তারা সবাই গাড়ি চালায়!
কিন্তু এটা কি বলার জন্য কাজ করবে, একটি শিক্ষাদান? ত্রুটি: KAAAA-BOOOOOOM! যে এত ভাল কাজ করে না। ====> টিপস চালাতে পারে না !! duh !?
এটি মূলত হাঁসের টাইপিংয়ের ধারণা। এটি আপনি কেনার আগে-আগে চেষ্টা করার ব্যবস্থা। যদি এটি কাজ করে তবে সব ঠিক আছে। তবে যদি এটি আপনার হাতে একটি গ্রেনেডের মতো ব্যর্থ হয় তবে এটি আপনার মুখে ফুঁকতে উঠবে।
অন্য কথায়, আমরা বস্তুটি কী করতে পারে তা সম্পর্কে আগ্রহী , বরং বস্তুটি কী তা করে ।
উদাহরণ: স্ট্যাটিকালি টাইপ করা ভাষা
যদি আমরা বস্তুটি আসলে কী ছিল তা নিয়ে উদ্বিগ্ন হয়ে থাকি তবে আমাদের যাদু কৌশলটি কেবল প্রি-সেট, অনুমোদিত ধরণের ক্ষেত্রে কাজ করবে - এই ক্ষেত্রে গাড়িগুলি, তবে গাড়ি চালাতে পারে এমন অন্যান্য বস্তুগুলিতে ব্যর্থ হবে : ট্রাক, মোপেড, টুক-টুকস ইত্যাদি cars এটি ট্রাকগুলিতে কাজ করবে না কারণ আমাদের যাদু যাতায়াত কেবল এটির জন্য কাজ করবে বলে আশা করছে ।
অন্য কথায়, এই পরিস্থিতিতে, জাদু সৌন্দর্য খুব ঘনিষ্ঠভাবে কি বস্তুর সময়ে জাদুদণ্ড হয় (এটা একটা গাড়ী আছে?) বদলে কি বস্তু কি করতে পারেন (যেমন গাড়ি, ট্রাক ইত্যাদি ড্রাইভ করতে পারেন কিনা)।
ট্রাক চালানোর একমাত্র উপায় হ'ল যদি আপনি কোনওভাবে যাদু যাদুকরীটিকে ট্রাক এবং গাড়ি উভয়ই আশা করতে পারেন (সম্ভবত "একটি সাধারণ ইন্টারফেস প্রয়োগ করে")। এর অর্থ কী তা যদি আপনি না জানেন তবে মুহুর্তের জন্য এটি এড়িয়ে যান।
সংক্ষিপ্তসার: কী টেক আউট
হাঁসের টাইপিংয়ের ক্ষেত্রে যা গুরুত্বপূর্ণ তা হ'ল বস্তুটি আসলে কী করতে পারে তার চেয়ে অবজেক্টটি কী ।
আপনি একটি সাধারণ ফাংশন ডিজাইন করছেন তা বিবেচনা করুন, যা কোনও ধরণের অবজেক্ট পায় Bird
এবং এর walk()
পদ্ধতিটি কল করে । দুটি উপায় আছে যা আপনি ভাবতে পারেন:
Bird
, বা তাদের কোডটি সংকলন করবে না। কেউ আমার ফাংশন ব্যবহার করতে চায়, তিনি যে আমি শুধুমাত্র গ্রহণ সচেতন থাকতে হবে Bird
গুলিobjects
এবং আমি কেবলমাত্র অবজেক্টের walk()
পদ্ধতিতে কল করি । সুতরাং, যদি object
করতে পারেন walk()
এটি সঠিক কিনা, যদি এটা আমার কাজ করবে ব্যর্থ করতে পারবে না। সুতরাং এখানে এটি গুরুত্বপূর্ণ নয় যে বিষয়টি কোনও Bird
বা অন্য কিছু, এটি গুরুত্বপূর্ণ যে এটি করতে পারে walk()
(এটি হাঁসের টাইপিং )এটি অবশ্যই বিবেচনা করা উচিত যে হাঁসের টাইপিং কিছু ক্ষেত্রে কার্যকর হতে পারে, উদাহরণস্বরূপ পাইথন হাঁসের টাইপিংকে প্রচুর পরিমাণে ব্যবহার করে।
উইকিপিডিয়ায় মোটামুটি বিস্তারিত ব্যাখ্যা রয়েছে:
http://en.wikipedia.org/wiki/Duck_typing
হাঁসের টাইপিং হ'ল ডায়নামিক টাইপিংয়ের একটি স্টাইল যেখানে কোনও নির্দিষ্ট শ্রেণি থেকে তার উত্তরাধিকার বা নির্দিষ্ট ইন্টারফেসের প্রয়োগের পরিবর্তে কোনও বস্তুর বর্তমান পদ্ধতি এবং বৈশিষ্ট্যের সেটটি বৈধ শব্দার্থবিজ্ঞান নির্ধারণ করে।
গুরুত্বপূর্ণ নোটটি সম্ভবত হাঁসের টাইপিংয়ের সাথে একজন বিকাশকারী প্রকৃত অন্তর্নিহিত ধরণটি পরিবর্তে যে পরিমাণ বস্তু সেবন করা হয় তার চেয়ে বেশি উদ্বিগ্ন।
আমি প্রচুর উত্তর দেখতে পাচ্ছি যা পুরানো প্রতিবাদের পুনরাবৃত্তি করে:
এটি যদি হাঁসের মতো দেখতে লাগে এবং হাঁসের মতো কোঁক দেয় তবে এটি একটি হাঁস
এবং তারপরে হাঁসের টাইপিংয়ের সাহায্যে আপনি কী করতে পারেন তার একটি ব্যাখ্যাতে ডুব দিন বা এমন একটি উদাহরণ যা ধারণাটিকে আরও বিস্মৃত করে বলে মনে হচ্ছে।
আমি তেমন সাহায্য পাই না।
হাঁসের টাইপিংয়ের বিষয়ে আমি যে স্পষ্ট ইংরেজী উত্তর পেয়েছি তার মধ্যে এটি সেরা চেষ্টা:
হাঁসের টাইপিংয়ের অর্থ একটি অবজেক্টটি যা করতে পারে তার দ্বারা সংজ্ঞায়িত করা হয়, এটি কী তা দিয়ে নয়।
এর অর্থ হল যে আমরা কোনও জিনিসের শ্রেণি / প্রকারের সাথে কম উদ্বিগ্ন এবং এতে কী কী পদ্ধতিগুলি বলা যেতে পারে এবং এর উপর কোন ক্রিয়াকলাপ সম্পাদন করা যায় সে সম্পর্কে আরও বেশি উদ্বিগ্ন। আমরা এটি টাইপ করা নিয়ে চিন্তা করি না, আমরা এটি কী করতে পারে তা যত্নশীল ।
হাঁসের টাইপিং:
যদি এটি কথা বলে হাঁসের মতো হাঁটতে থাকে তবে এটি হাঁস
এটি বিশেষভাবে বলা হয় অপহরণ ( abductive যুক্তি বা নামেও retroduction , একটি পরিষ্কার সংজ্ঞা আমি মনে করি):
থেকে সি (উপসংহার কি আমরা দেখতে ) এবং আর (নিয়ম, আমরা কি জানি ), আমরা গ্রহণ / সিদ্ধান্ত নেন / অনুমান পি (চত্বর, সম্পত্তি অন্য কথায়) একটি প্রদত্ত সত্য
... চিকিৎসা নির্ণয়ের একেবারে ভিত্তি
হাঁসের সাথে: সি = হাঁটা, কথা বলা , আর = হাঁসের মতো , পি = এটি একটি হাঁস
প্রোগ্রামিংয়ে ফিরে যান:
অবজেক্ট ও এর পদ্ধতি / সম্পত্তি এমপি 1 রয়েছে এবং ইন্টারফেস / টাইপ টি এমপি 1 সংজ্ঞায়িত / সংজ্ঞায়িত করে
অবজেক্ট ও এর পদ্ধতি / সম্পত্তি এমপি 2 রয়েছে এবং ইন্টারফেস / টাইপ টি এমপি 2 সংজ্ঞায়িত / সংজ্ঞায়িত করে
...
সুতরাং, কেবল গ্রহণ চেয়ে বেশি mp1 ... কোন বস্তুর উপর যতদিন এর কিছু সংজ্ঞা পূরণ করেছে mp1 ..., কম্পাইলার / রানটাইম এছাড়াও ঠিক আছে হওয়া উচিত কথন সঙ্গে ণ ধরনের হয় টি
এবং ভাল, উপরের উদাহরণগুলির সাথে কি এটি ঘটেছে? হাঁসের টাইপিং কি মূলত কোনও টাইপিং নয়? বা আমরা কি এটি অন্তর্ভুক্ত টাইপিং বলা উচিত?
ভাষা নিজেই তাকান সাহায্য করতে পারে; এটি প্রায়শই আমাকে সহায়তা করে (আমি স্থানীয় ইংরেজী স্পিকার নই)।
ভিতরে duck typing
:
1) শব্দের typing
অর্থ কোনও কীবোর্ডে টাইপ করা নয় (যেমনটি আমার মনে দৃ in় প্রতিচ্ছবি ছিল), তার অর্থ নির্ধারণ করা হয় " জিনিসটি কোন ধরণের জিনিস? "
2) শব্দটি duck
প্রকাশ করে যে কীভাবে নির্ধারণ করা হয়; এটি এক ধরণের 'looseিলে .ালা' নির্ধারণ করে যেমন রয়েছে: " যদি এটি হাঁসের মতো হাঁটে ... তবে এটি একটি হাঁস "। এটি 'আলগা' কারণ জিনিসটি হাঁস হতে পারে বা নাও পারে তবে এটি আসলে হাঁস কিনা তা বিবেচনাধীন নয়; মূল বিষয়টি হ'ল আমি হাঁসের সাথে যা করতে পারি তা দিয়ে আমি এটি করতে পারি এবং হাঁসের দ্বারা প্রদর্শিত আচরণগুলি প্রত্যাশা করি। আমি এটিকে রুটির টুকরো টুকরো খাওয়াতে পারি এবং জিনিসটি আমার দিকে যেতে পারে বা আমার কাছ থেকে চার্জ দিতে বা পিছনে ফিরে যেতে পারে ... তবে এটি আমাকে গ্রিজির মতো গ্রাস করবে না।
আমি জানি আমি সাধারণীকরণের উত্তর দিচ্ছি না। রুবিতে আমরা ভেরিয়েবল বা পদ্ধতিগুলির প্রকার ঘোষণা করি না - সবকিছুই কেবল একরকম অবজেক্ট। সুতরাং বিধিটি হল "ক্লাসগুলি প্রকার নয়"
রুবিতে, শ্রেণিটি কখনও (টাইপ হয় না, প্রায় কখনই না)। পরিবর্তে, কোনও বস্তুর প্রকারটি সেই বস্তুটি কী করতে পারে তার দ্বারা আরও সংজ্ঞায়িত হয়। রুবিতে আমরা এই হাঁসের টাইপিংকে ডাকি। যদি কোনও বস্তু হাঁসের মতো হাঁটতে থাকে এবং হাঁসের মতো কথা বলে, তবে অনুবাদক এটির মতো হাঁসের মতো আচরণ করে খুশি হন।
উদাহরণস্বরূপ, আপনি স্ট্রিংয়ে গানের তথ্য যুক্ত করতে একটি রুটিন লিখতে পারেন। আপনি যদি কোনও সি # বা জাভা ব্যাকগ্রাউন্ড থেকে এসে থাকেন তবে আপনি এটি লেখার জন্য প্রলুব্ধ হতে পারেন:
def append_song(result, song)
# test we're given the right parameters
unless result.kind_of?(String)
fail TypeError.new("String expected") end
unless song.kind_of?(Song)
fail TypeError.new("Song expected")
end
result << song.title << " (" << song.artist << ")" end
result = ""
append_song(result, song) # => "I Got Rhythm (Gene Kelly)"
রুবির হাঁসের টাইপিং আলিঙ্গন করুন এবং আপনি আরও সহজ কিছু লিখতে চাইছেন:
def append_song(result, song)
result << song.title << " (" << song.artist << ")"
end
result = ""
append_song(result, song) # => "I Got Rhythm (Gene Kelly)"
আপনার আর্গুমেন্টের ধরণটি পরীক্ষা করার দরকার নেই। যদি তারা << (ফলাফলের ক্ষেত্রে) বা শিরোনাম এবং শিল্পী (গানের ক্ষেত্রে) সমর্থন করে তবে সবকিছু ঠিক কাজ করবে। যদি তা না করে, আপনার পদ্ধতিটি যাইহোক যাইহোক একটি ব্যতিক্রম ছুঁড়ে ফেলবে (ঠিক তেমনভাবে যদি আপনি প্রকারগুলি পরীক্ষা করে থাকেন তবে)। তবে চেক না করে হঠাৎ আপনার পদ্ধতিটি অনেক বেশি নমনীয়। আপনি এটিকে একটি অ্যারে, একটি স্ট্রিং, একটি ফাইল বা অন্য কোনও বস্তু যা << ব্যবহার করে সংযোজন করতে পারেন তা পাস করতে পারেন এবং এটি কেবল কাজ করবে।
হাঁসের টাইপিং হিন্টিং টাইপ নয়!
মূলত "হাঁসের টাইপিং" ব্যবহার করার জন্য আপনি একটি সাধারণ ইন্টারফেস ব্যবহার করে একটি নির্দিষ্ট প্রকারটিকে লক্ষ্য করে বরং বৃহত্তর উপ-প্রকারকে লক্ষ্য করবেন না (উত্তরাধিকারের বিষয়ে কথা বলছেন না, যখন আমি সাবটাইপস বোঝাতে চাইছি "জিনিস" যা একই প্রোফাইলের সাথে খাপ খায়) ।
আপনি এমন একটি সিস্টেম কল্পনা করতে পারেন যা তথ্য সঞ্চয় করে। তথ্য লিখতে / পড়তে আপনার এক ধরণের স্টোরেজ এবং তথ্য প্রয়োজন।
স্টোরেজের ধরণগুলি হতে পারে: ফাইল, ডাটাবেস, সেশন ইত্যাদি
ইন্টারফেসটি স্টোরেজ প্রকার নির্বিশেষে উপলভ্য বিকল্পগুলি (পদ্ধতিগুলি) আপনাকে জানাতে দেবে, যার অর্থ এই মুহুর্তে কিছুই প্রয়োগ করা হয়নি! অন্য কথায় ইন্টারফেস তথ্য সংরক্ষণের উপায় সম্পর্কে কিছুই জানে না।
প্রতিটি স্টোরেজ সিস্টেমের অবশ্যই ইন্টারফেসের অস্তিত্বটি একেবারে একই পদ্ধতি প্রয়োগ করে জানতে হবে।
interface StorageInterface
{
public function write(string $key, array $value): bool;
public function read(string $key): array;
}
class File implements StorageInterface
{
public function read(string $key): array {
//reading from a file
}
public function write(string $key, array $value): bool {
//writing in a file implementation
}
}
class Session implements StorageInterface
{
public function read(string $key): array {
//reading from a session
}
public function write(string $key, array $value): bool {
//writing in a session implementation
}
}
class Storage implements StorageInterface
{
private $_storage = null;
function __construct(StorageInterface $storage) {
$this->_storage = $storage;
}
public function read(string $key): array {
return $this->_storage->read($key);
}
public function write(string $key, array $value): bool {
return ($this->_storage->write($key, $value)) ? true : false;
}
}
সুতরাং এখন, প্রতিটি সময় আপনার তথ্য লেখার / পড়ার দরকার পড়ে:
$file = new Storage(new File());
$file->write('filename', ['information'] );
echo $file->read('filename');
$session = new Storage(new Session());
$session->write('filename', ['information'] );
echo $session->read('filename');
এই উদাহরণে আপনি স্টোরেজ কনস্ট্রাক্টরে হাঁস টাইপিং ব্যবহার করে শেষ করেছেন:
function __construct(StorageInterface $storage) ...
আশা করি এটি সাহায্য করেছে;)
আমি মনে করি এটি গতিশীল টাইপিং, স্ট্যাটিক টাইপিং এবং হাঁসের টাইপিংয়ের মিশ্রণে বিভ্রান্ত। হাঁসের টাইপিং একটি স্বতন্ত্র ধারণা এবং গো এর মতো স্থির টাইপযুক্ত ভাষাও রয়েছে, একটি টাইপ চেকিং সিস্টেম থাকতে পারে যা হাঁসের টাইপিং প্রয়োগ করে। যদি কোনও টাইপ সিস্টেম কোনও (ঘোষিত) অবজেক্টের পদ্ধতিগুলি পরীক্ষা করে তবে টাইপ না করে তবে এটিকে হাঁসের টাইপিং ভাষা বলা যেতে পারে।
আমি বিখ্যাত বাক্যটি আমার উপায়ে বোঝার চেষ্টা করি: "পাইথন ডোজ কোনও জিনিসকে যত্নশীল করে না এটি একটি আসল হাঁস বা না All
একটি ভাল ওয়েবসাইট আছে। http://www.voidspace.org.uk/python/articles/duck_typing.shtml#id14
লেখক নির্দেশ করেছেন যে হাঁসের টাইপিংয়ের সাহায্যে আপনার নিজস্ব শ্রেণি তৈরি করা যায় যাগুলির নিজস্ব অভ্যন্তরীণ ডেটা কাঠামো রয়েছে - তবে সাধারণ পাইথন সিনট্যাক্স ব্যবহার করে অ্যাক্সেস করা হয়।