موضوع مقاله: نوع‌دهی اردکی | مخاطب: عمومی | لحن: دانشنامه‌ای | ساختار: عنوان، مقدمه، 3 بخش، جمع‌بندی | مقاله: | # نوع‌دهی اردکی | مقدمه: در برنامه‌نویسی شی گرا، نوع‌دهی اردکی یک شیوه نوع‌دهی پویاست که در آن خصوصیات و توابع فعلی شی معنای آن را مشخص می‌کند و نه ارث بری آن از یک کلاس خاص و interface. | ## بخش 1: نوع‌دهی اردکی | نام این نوع تایپ دهی از آزمون اردکی (duck test) که به James Whitcomb Riley منسوب است گرفته شده‌است که آن را می‌توان به این صورت بیان کرد: «اگر پرنده‌ای ببینم که مانند اردک راه می‌رود، مانند اردک شنا می‌کند و مانند اردک صدا درمی‌آورد، من به آن پرنده اردک می‌گویم» در تایپ دهی اردکی تمرکز ما فقط بر روی آن دسته از خصوصیات شی است که استفاده می‌شوند و نه نوع شی. برای مثال در یک زبان بدون تایپ دهی اردکی، می‌توان تابعی نوشت که یک شی از نوع «اردک» می‌گیرد و متدهای «راه رفتن» و «صدا درآوردن» آن شی را فراخوانی می‌کند. اما در زبانی با تایپ دهی اردکی، همان تابع به این صورت است که یک شی از «هر نوع» می‌گیرد و متدهای «راه رفتن» و «صدا درآوردن» آن شی را فراخوانی می‌کند. پذیرش «هر نوع» شیی توسط تابع، که متدهای «راه رفتن» و «صدا درآوردن» درست را داشته باشد در واقع نشان دهنده نام این تایپ دهی و جمله بالاست که «اگر پرنده‌ای ببینم که مانند اردک راه می‌رود، مانند اردک شنا می‌کند و مانند اردک صدا درمی‌آورد، من به آن پرنده اردک می‌گویم». تست نکردن نوع آرگومان‌ها در توابع از روی عادت، مستندسازی، کدهای خوانا و واضح و تست کردن برای اطمینان از استفاده صحیح، به برنامه‌نویسی با تایپ دهی اردکی کمک می‌کند. برنامه نویسانی که به تایپ دهی ایستا عادت کرده‌اند و می‌خواهند از برنامه‌های با تایپ دهی پویا استفاده کنند، معمولاً تمایل دارند که قبل از اجرا چک کردن تایپ را به صورت استاتیک انجام دهند که با این کار از مزایا و انعطاف‌پذیری تایپ دهی اردکی بهره‌مند نمی‌شوند و پویایی زبان را با محدودیت مواجه می‌سازند. این همان محک اردکی است: تعریف شده بودن + (مانند اردک راه می‌رود) و تعریف شده بودن * (مانند اردک شنا می‌کند) کافی است تا به آن شیء محاسباتی (اردک) بگوییم. در حالی که در تایپ دهی‌های استاتیک، برای این کار مجبور بودیم این تابع را برای نوع رشته یا int به‌طور خاص فراخوانی کنیم. (در واقع کلاس‌هایی داشتیم که هر کدام از یک کلاس پدر ارث می‌بردند و هر کدام از این کلاس‌ها یک شکل تابع calculate را پیاده‌سازی می‌کردند) تایپ دهی اردکی در کد زیر که به زبان Python نوشته شده‌استفاده شده‌است. این خصوصیت اجازه می‌دهد که این زبان‌ها هم بیشتر مزایای تایپ دهی اردکی را داشته باشند. | ## بخش 2: نوع‌دهی اردکی | مقایسه با سایر سیستم‌های تایپ دهی سیستم‌های تایپ دهی ساخت یافته تایپ دهی اردکی مشابه ولی متمایز از تایپ دهی ساخت یافته‌است. تایپ دهی ساخت یافته یک سیستم تایپ دهی استاتیک است که مطابقت نوع و تساوی را توسط ساختار نوع تشخیص می‌دهد در حالی که تایپ دهی اردکی پویاست و مطابقت نوع را فقط با قسمتی از ساختار نوع که در موقع اجرا از آن استفاده می‌شود تعیین می‌کند. واسط‌ها (Interfaces) واسط‌ها می‌توانند بعضی از مزایای تایپ دهی اردکی را ایجاد کنند هرچند تایپ دهی اردکی از این جهت که هیچ گونه واسطی را به‌طور صریح تعریف نمی‌کند با آن فرق دارد. برای مثال اگر یک کتابخانه جاوا یک کلاس را که اجازه تغییر آن را ندارد implement کند، نمی‌توان یک نمونه از آن کلاس را در واسطی که خودمان تعریف کرده‌ایم استفاده کنیم، در حالی که تایپ دهی اردکی این اجازه را می‌دهد. این کار تمام مزایا و مشکلات تایپ دهی استاتیک را در مقابل تایپ دهی پویا خواهد داشت. تایپ دهی اردکی همچنین از این نظر انعطاف‌پذیرتر است که تنها متدهایی که در زمان اجرا فراخوانی می‌شوند نیاز به پیاده‌سازی دارند، در حالی که templateها چون در زمان کامپایل این تایپ دهی را انجام می‌دهند، به پیاده‌سازی همه متدهایی که ممکن است در زمان اجرا فراخوانی شوند نیاز دارد. انتقاد یکی از نقدهای معمول به این نوع تایپ دهی: یکی از مشکلات تایپ دهی اردکی این است که برنامه‌نویس مجبور است فهم وسیع تری از کدی که در هر لحظه می‌نویسد داشته باشد. در یک زبان با تایپ دهی استاتیک که از سلسله مراتب‌های نوع و چک کردن نوع پارامترها استفاده می‌کند، نسبت دادن شیی با نوع غلط به یک کلاس بسیار سخت‌تر خواهد بود. با تایپ دهی اردکی برای جلوگیری از خطاهای ناخواسته، برنامه‌نویس باید از هر نوع استفاده متد press مطلع باشد. ماهیتا مشکل این است که «اگر چیزی مانند اردک راه می‌رود، مانند اردک شنا می‌کند و مانند اردک صدا درمی‌آورد» می‌تواند یک اژدها باشد که ادای اردک‌ها را درمی‌آورد! | ## بخش 3: نوع‌دهی اردکی | شاید همیشه نخواهید یک اژدها را به یک تالاب راه دهید حتی اگر بتواند مثل یک اردک رفتار کند! طرفداران تایپ دهی اردکی معتقدند که این مشکل با تست کردن و داشتن اطلاعات لازم در مورد کد و رفع خطاهای آن، برطرف خواهد شد. او همچنین فهم نادرست از تست اردکی را بیان کرد (به نظر می‌رسد لغت تست اردکی در آن زمان استفاده می‌شده‌است). به بیان دیگر نگاه نکنید که آیا این یک اردک است، ببینید که آیا صدای اردک درمی‌آورد، مثل اردک راه می‌رود و…، بسته به اینکه دقیقاً شما چه زیر مجموعه‌ای از رفتار شبیه اردک را نیاز دارید.» پیاده‌سازی در C در C# 4.0 کامپایلر و زمان اجرا با هم همکاری می‌کنند تا تایپ دهی پویا پیاده‌سازی شود. برای این نوع آرگومان، یک شی دلخواه می‌تواند به تابع فرستاده شود و فراخوانی توابع به صورت پویا در زمان اجرا bind می‌شوند. در این زبان متدها خارج کلاس‌ها تعریف می‌شوند و همچنین می‌توانند برای اشیای خاصی هم استفاده شوند. فرستنده پیام می‌تواند چک کند که شی به پیام پاسخ می‌دهد یا نه، و شی نیز می‌تواند در زمان رسیدن پیام تصمیم بگیرد که آیا به آن پاسخ دهد یا خیر، و اگر فرستنده پیامی بفرستد که گیرنده نمی‌تواند به آن پاسخ دهد، یک exception رخ می‌دهد؛ بنابراین تایپ دهی اردکی کاملاً توسط زبان Objective C حمایت می‌شود. واژه نامه پایتون تایپ دهی اردکی را به صورت زیر تعریف می‌کند: شیوه برنامه‌نویسی به روش پایتون به این صورت است که نوع یک شی توسط متدها و خصوصیات(attribute) آن تعیین می‌شود و نه توسط رابطه صریح آن با نوع خاصی از اشیا. این زبان با تکیه بر واسط‌ها و نه نوع‌های خاص، انعطاف‌پذیری بالایی را در کدهایی که به خوبی طراحی شده‌اند ایجاد می‌کند. کلاس‌ها می‌توانند بعضی یا همه متدهای یک فایل را پیاده کنند و می‌توانند جاهایی که فایل‌ها استفاده می‌شوند مورد استفاده قرار گیرند. | ## جمع‌بندی | این موضوع انعطاف‌پذیری تایپ دهی اردکی را نشان می‌دهد: یک شی فایل گونه تنها متدهایی را که توانایی آن را دارد implement می‌کند و بنابراین می‌تواند در جاهایی که معنای درستی می‌دهد مورد استفاده قرار گیرد.