PDA

View Full Version : سوال: generic programming یعنی چی؟



ebrahim1988
دوشنبه 13 اردیبهشت 1389, 16:58 عصر
سلام
میخواستم ببینم کسی میدونه generic programming چیه؟
چون هر چی سرچ میکنم همش انگلیسی هست و من هم هیچی ازش متوجه نمیشم
ممنون

sh4mid
دوشنبه 13 اردیبهشت 1389, 23:17 عصر
سلام
بگذار با یک مثال ساده بریم جلو
فرض کن می خواهی یه تابع بنویسی که بیشترین مقدار بین دو تا عدد رو بیابی
خوب میای یه همچین تابعی مینویسی



int max(int x, int y)
{
return x < y ? y : x;
}


خوب همین کارت رو راه می اندازه ولی اگه بخواهی مثلا حالا بیشترین مقدار بین دو تا عدد از نوع float یا long رو حساب کنی چی؟باید دوباره همین کد رو براش بنویسی.این یک مثال ساده است و اگر کد را دستی هم براش بنویسی مشکلی نیست مشکل یک همچین راه حل هایی وقتی پیش می آید که مثلا بفهمی منطق تابع اولی که نوشتی ایراد دارد و بخواهی بازنویسی اش کنی خوب اولین تابع رو بازنویسی کردی مابقی رو چکار می کنی با گزینه Find&Replace محیطی که داری باهاش کار میکنی این کارو می کنی؟:متفکر: البته اگه برنامه ات کم باشه می شه همچین کاری کرد ولی فکر کن برنامه ات مثلا 100000 خط کد باشه بنظرت عاقلانه است؟:متفکر: اینجاست که Generic Programming یا همون Template Programming میاد کمکت می کنه
کد بالا رو اینجوری می نویسیم




template <typename T>
T max(T x, T y)
{
return x < y ? y : x;
}

الان یه تابع داریم که دو تا متغیر از نوع T می گیره خروجی اش هم همون نوع ورودی اش است و جواب بزرگترین مقدار مابین این دوتا است
ببین این تابع برای هر نوع Type که عملگر کوچکتر براش تعریف شده باشه کار می کنه(می تونی یک کلاس بنویسی و عملگر کوچکتر رو براش بازتعریف(overload)کنی حالا تابع بالا می تونه دو تا ورودی از کلاس جدید بگیره)
حالا این چطور کار می کنه؟:متفکر:من خودم هم زیاد جزییات رو بلد نیستم ولی می دونم مثلا وقتی Compiler همچین کدی رو می بینه


cout << max(3, 7); // outputs 7


میبینه که این تابع Max فراخوانی شده و ورودی هاش هم از نوع int است می آید یه همچین کدی رو درست میکنه(تو زمان Compile)




int max(int x, int y)
{
return x < y ? y : x;
}

و همین طور الخ
خوبی و مزیت Template به Macro اینه که Template ها type-safe هستند مثلا همین کد بالا رو با Macro بنویسیم اینجوری میشه



#define max(a,b) ((a) < (b) ? (b) : (a))
این وقتی به یه همچین کدی برسه



cout << max(3, 7.66);
می آید کد بالا رو همون جوری مینویسه و اصلا پیغام نمیده که یه int و float هم نوع نیستن



چون هر چی سرچ میکنم همش انگلیسی هست و من هم هیچی ازش متوجه نمیشماول: این زبان مادر مرده پارسی رو پاس بدارید(هر چی جست و جو یا هر چی Search)
دوم:اگه می خواهی برنامه نویس بشی مجبوری و باید زبانت رو خوب کنی

persiansh
پنج شنبه 27 مرداد 1390, 22:46 عصر
سلام
بگذار با یک مثال ساده بریم جلو
فرض کن می خواهی یه تابع بنویسی که بیشترین مقدار بین دو تا عدد رو بیابی
خوب میای یه همچین تابعی مینویسی



int max(int x, int y)
{
return x < y ? y : x;
}


خوب همین کارت رو راه می اندازه ولی اگه بخواهی مثلا حالا بیشترین مقدار بین دو تا عدد از نوع float یا long رو حساب کنی چی؟باید دوباره همین کد رو براش بنویسی.این یک مثال ساده است و اگر کد را دستی هم براش بنویسی مشکلی نیست مشکل یک همچین راه حل هایی وقتی پیش می آید که مثلا بفهمی منطق تابع اولی که نوشتی ایراد دارد و بخواهی بازنویسی اش کنی خوب اولین تابع رو بازنویسی کردی مابقی رو چکار می کنی با گزینه Find&Replace محیطی که داری باهاش کار میکنی این کارو می کنی؟:متفکر: البته اگه برنامه ات کم باشه می شه همچین کاری کرد ولی فکر کن برنامه ات مثلا 100000 خط کد باشه بنظرت عاقلانه است؟:متفکر: اینجاست که Generic Programming یا همون Template Programming میاد کمکت می کنه
کد بالا رو اینجوری می نویسیم




template <typename T>
T max(T x, T y)
{
return x < y ? y : x;
}

الان یه تابع داریم که دو تا متغیر از نوع T می گیره خروجی اش هم همون نوع ورودی اش است و جواب بزرگترین مقدار مابین این دوتا است
ببین این تابع برای هر نوع Type که عملگر کوچکتر براش تعریف شده باشه کار می کنه(می تونی یک کلاس بنویسی و عملگر کوچکتر رو براش بازتعریف(overload)کنی حالا تابع بالا می تونه دو تا ورودی از کلاس جدید بگیره)
حالا این چطور کار می کنه؟:متفکر:من خودم هم زیاد جزییات رو بلد نیستم ولی می دونم مثلا وقتی Compiler همچین کدی رو می بینه


cout << max(3, 7); // outputs 7


میبینه که این تابع Max فراخوانی شده و ورودی هاش هم از نوع int است می آید یه همچین کدی رو درست میکنه(تو زمان Compile)




int max(int x, int y)
{
return x < y ? y : x;
}

و همین طور الخ
خوبی و مزیت Template به Macro اینه که Template ها type-safe هستند مثلا همین کد بالا رو با Macro بنویسیم اینجوری میشه



#define max(a,b) ((a) < (b) ? (b) : (a))
این وقتی به یه همچین کدی برسه



cout << max(3, 7.66);
می آید کد بالا رو همون جوری مینویسه و اصلا پیغام نمیده که یه int و float هم نوع نیستن


اول: این زبان مادر مرده پارسی رو پاس بدارید(هر چی جست و جو یا هر چی Search)
دوم:اگه می خواهی برنامه نویس بشی مجبوری و باید زبانت رو خوب کنی




















کدش اینطوری میشه
#include <iostream>
using namespace std;
template <class T>
T GetMax (T a, T b)
{
T result;
result = (a>b)? a : b;
return (result);
}
int main () {
int i=5, j=6, k;
long l=10, m=5, n;
k=GetMax<int>(i,j);
n=GetMax<long>(l,m);
cout << k << endl;
cout << n << endl;
return 0;
}

_hamid
جمعه 28 مرداد 1390, 00:32 صبح
آره ولی در این مورد که فقط تابع هست حتما لازم نیست که اینجوری
k=GetMax<int>(i,j);
n=GetMax<long>(l,m);

بنوسیم.
اینجوری هم جواب میده:
k=GetMax(i,j);
n=GetMax(l,m);