PDA

View Full Version : استفاده از interface



yegane8
پنج شنبه 26 مرداد 1391, 04:36 صبح
سلام
من قبل از اینکه شروع به نوشتن یه برنامه کنم فکر کردم که 3 تا متد بین بیشتر کلاس های این برنامه مشترک اند اما بدنه مشترکی ندارند به همین دلیل تصمیم گرفتم که یه کلاس interface با 3 تا متد abstract بنویسم و کلاس هایی که این 3 تا متد رو داشتند این متدها رو در اوون ها override کردم اما راستش نمی دونم این کار اصلا فایده داره یا نه من از interface به عنوان یه رابط استفاده کردم اما اگر این کلاس هم نبود من به جای override کردن متدها , خود متدها رو تو کلاس های مورد نظر می نوشتم
به نظر شما بهتره که کلا این کلاس interface رو پاک کنم یا نه ؟
باتشکر

persianshadow
پنج شنبه 26 مرداد 1391, 12:25 عصر
البته متدهای توی اینترفیس شما از نوع ابسترکت نیست بلکه شما یه اینترفیس تعریف کردید. خب نه چرا پاکش کنید !‌ کار درستی هست.

javaphantom
پنج شنبه 26 مرداد 1391, 15:12 عصر
چرا اصلا یک interface تعریف می کنیم که تمام متدود های آن abstract هستند یعنی فاقد بدنه یا همان body؟
چرا یک کلاس abstract تعریف نمی کنیم و تمام متدود های آن را abstract نمی کنیم؟
آیا می توان یک کلاس abstract داشته باشیم و هیچ متدود abstract ی نداشته باشیم؟ اگر می شود چرا پس می گن abstract class؟

چه فرقی بین extend , implement هست؟ چه موقع استفاده کنیم؟
در نهایت تفاوت abstract class با یک interface چیه؟

این سوالات رو در اینترنت بگرد و جوابشون رو پیدا کن. بهت قول می دم که جواب سوالات رو که می گیری هیچ. کلی از مفاهیم object oriented رو هم که توش ضعیف هستی، قوی خواهی شد

yegane8
پنج شنبه 26 مرداد 1391, 22:02 عصر
البته متدهای توی اینترفیس شما از نوع ابسترکت نیست
اگه متدها از نوع abstract نیست پس چیه؟
باتشکر

yegane8
پنج شنبه 26 مرداد 1391, 22:08 عصر
چرا اصلا یک interface تعریف می کنیم که تمام متدود های آن abstract هستند یعنی فاقد بدنه یا همان body؟
چرا یک کلاس abstract تعریف نمی کنیم و تمام متدود های آن را abstract نمی کنیم؟
آیا می توان یک کلاس abstract داشته باشیم و هیچ متدود abstract ی نداشته باشیم؟ اگر می شود چرا پس می گن abstract class؟

چه فرقی بین extend , implement هست؟ چه موقع استفاده کنیم؟
در نهایت تفاوت abstract class با یک interface چیه؟

این سوالات رو در اینترنت بگرد و جوابشون رو پیدا کن. بهت قول می دم که جواب سوالات رو که می گیری هیچ. کلی از مفاهیم object oriented رو هم که توش ضعیف هستی، قوی خواهی شد
این http://barnamenevis.org/showthread.php?152516-%D8%AF%D9%84%DB%8C%D9%84-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-Interface-%D9%88-Abstract&highlight=abstract+interface
رو خوندم جواب اکثر سوال هایی که بپرسیدید رو فهمیدم
اما تو همین لینک شما جواب این سوال
خوب سوال : بابا این چه کاریه از همون اول خودمون می آیم همه کلاس ها رو طوری در نظر می گیریم که نیازی به interface نباشه. مثلا توی مثل دومی مگس رو جدا می گیرم و هواپیما رو جدا
رو اینطور داده بودید :
نکته: در زبان جاوا هر کلاس یا کلاس هایی که از یک یا چند Interface استفاده کرده باشند این خاصیت رو بصورت runtime به ما می ده که بجای اینکه از خود نوع کلاس یک instance داشته باشیم از خود کلاس و از نوع Interface اون یک instance داشته باشیم که بسیار کاربردی هست

اما این تیکه رو درست نفهمیدم میشه بیشتر توضیح بدین ؟
به سوال دیگه object گرفتن از کلاس human به این شیوه Animals human = new Human();
نسبت به این شیوه Human human = new Human چه مزیتی داره ؟

spiderman200700
پنج شنبه 26 مرداد 1391, 22:44 عصر
فرض کن چند تا کلاس داری که هر کدوم مربوط به یک حیوان میشه. مثلا (Dog,Cat,Horse) . هر سه تا کلاس گفته شده interfaceی به اسم Animals رو پیاده سازی میکنن.
حالا فرض کن توی برنامت یه جا مجبوری یه آرایه از کل حیوانات با انواع مختلف داشته باشی . چون تمام اجزا آرایه باید از یه نوع باشن، اینجاست که Object از نوع interface پیاده سازی شده، به درد میخوره. یعنی باید تمام Object ها رو به نوع Animals تبدیل کنی،بعد ازشون آرایه بسازی.

نکته ی زیر که که گفتی درست متوجه نمیشی هم داره همینو میگه.

نکته: در زبان جاوا هر کلاس یا کلاس هایی که از یک یا چند Interface استفاده کرده باشند این خاصیت رو بصورت runtime به ما می ده که بجای اینکه از خود نوع کلاس یک instance داشته باشیم از خود کلاس و از نوع Interface اون یک instance داشته باشیم که بسیار کاربردی هست

yegane8
پنج شنبه 26 مرداد 1391, 23:09 عصر
حالا اگه قرار نباشه تو برنامه یه ارایه از کل حیوانات درست شه استفاده از interface بی معنی میشه؟
باتشکر

spiderman200700
جمعه 27 مرداد 1391, 00:10 صبح
این یه مثال ساده بود.
interface توی خیلی جاها به کار میاد.
تو کافیه مفهومش رو خوب درک کنی، بعدش دیگه وقتی بهش نیاز پیدا کنی خو دت میفهمی که باید ازش کجا استفاده کنی

مثلا توی همین مثالی که زدم :
میدونیم که هر سه حیوان اسب گربه و سگ راه میرن ، غذا میخورن ، میخوابن و چنیدن رفتار مشترک دارن. ولی هر کدام از این حیوانات این کارا رو به روش خودشون انجام میدن.و حتما هم باید این کارها رو انجام بدن.
در اینجو مواقع میتونیم این متد ها رو توی interface تعریف کنیم تا همه ی کلاس هایی که این رفتار های مشترک رو دارن مجبور بشن به روش خودشون پیاده سازیش کنن.
یعنی گربه مجبوره به روش خودش بخوابه راه بره و غذا بخوره. سگ و اسب هم همینطور.

javaphantom
جمعه 27 مرداد 1391, 10:24 صبح
قبل از هر چیز اشاره کنم که تمام متود هایی که در یک interface هست بصورت پیشفرض همگی public , abstract هستن.

برای اینکه بیشتر با مفهوم و لازمه کار interface اشنا بشی با چند مثال شروع می کنم. مثال اول رو با یک پنل ضبط صوت ماشین شروع می کنم. اگر دقت کنی روی همه ضبط صوت ها و یا حتا ویدوها یک سری علامت می بینی که همگی استاندارد شدن. مثل علامت play , forward, rewind ,stop همه ما با این علامت ها کار کردیم و می دونیم بر فرض مثال اگر بخواهیم یک موزیک یا یک فیلم نگاه کنیم باید بریم چه دکمه ای با چه علامتی رو فشار بدیم تا موزیک یا فیلم پخش بشه. اما سوال من ، تا اینجا ظاهر قضیه بود اما پشت قضیه چه جوری هست؟ مثلا شرکت kenwood و یا شرکت pioneer اون پشت رو یک جور طراحی و پیاده سازی کردن؟ مثلا امکان این هست که اولین شرکت با حجم ۲۰۰۰۰ ترانزیستور و شرکت دوم با جحم ۳۰۰۰۰۰ ترانزیستور عملیات پخش فیلم یا صوت رو پیاده سازی کرده باشه؟

در جواب این سوال باید بگم مطمعن با شید که همینطوری هست. متفاوت با یکدیگر و در رقابت با یکدیگر. اما برای من استفاده کننده چه فرقی داره. یک دکمه هست و یک رفتاری داره انجام می شه که من انتظارش رو دارم. پس می بینی که یک interface ی هست و هزاران نوع پیاده سازی از اون. حالا یک مثال ملموس تر کامپیوتری. فرض بکن یک برنامه ای نوشتی که می خواهی توی اون برنامه به کاربرات این امکان رو بدی که بتونن خرید محصولات رو توی برنامت انجام بدن. خوب شما یک قسمتی از برنامت باید به بانک وصل بشه و طرف بیاد مثلا شماره کارتشو بزنه با رمز و مبلغ رو و این خرید درصورتی که همه چیز خوب باشه انجام بشه و پول بره به حساب شما. حتما توقع ندارید که بانک بیاد تمام کلاسهایی که اون پست نشته نوشته رو تحویل شما بده که شما بتونید این عملیات رو انجام بدین. تازه اگر بده مسخره است چون اومدیم و فردا یک تغییر داد تو کلاسها و همه چیز دیگش. باید بیاد به شما هم یک نسخه جدید بده دیگه :قهقهه: نمی شه. پس راه حل چیه. بر می گردیم سراغ همون اینترفیس. بانک به شما یک کلاس کاملا abstract که همون interface هست می ده و یک رفتار کاملا abstract مثلا به نام خرید با چند ارگومان در اختیار شما می زاه که شما اصلا از پشت داستان خبری نداره ولی رفتار رو می دونی چیه. مثلا پیل ضبط ماشین که می دونی اگر دکمه بزنی می خونه ولی نمی دونی چه جوری ولی کارت راه می افته دیگه. پس این interface دقیفا نقش یک کلاس واسط رو برای شما بازی کرده که می گه ورودی رو بده کاریت نباشه من خروجی رو بهت می دم.
حالا با گفتن این داستان می خوام وارد یک بحث طراحی در زبان های شی گرایی کنمت که بهینه سازی می کنه طراحی کارت رو به نام Loose coupling and high cohesion
http://en.wikipedia.org/wiki/Coupling_(computer_programming)
http://www.xyzws.com/scjp/SGS11/5/2

اینکه جرا نمی آییم همه رو توی یک کلاس معمولی بنویسم توی مباحث بالا هست که جواب خواهی گرفت.

اینکه چرا یک کلاس abstract در نظر نمی گیریم بجای یک interface من می خوام خودت بری و با این راهنمایی که بهت می کنم جواب رو بدست بیاری.

در جاوا برای ساختن یک thread هم می تونی از یک interface به نام runnable استاده کنی یا اینکه از کلاس Thread استفاده کنی. چرا جاوا این دوتا رو برای شما در نظر گرفته؟ چه موقع از کدوم یکی استفاده کنیم و چرا؟

yegane8
شنبه 28 مرداد 1391, 01:29 صبح
در جاوا برای ساختن یک thread هم می تونی از یک interface به نام runnable استاده کنی یا اینکه از کلاس Thread استفاده کنی. چرا جاوا این دوتا رو برای شما در نظر گرفته؟ چه موقع از کدوم یکی استفاده کنیم و چرا؟
با توجه به مقالاتی که خوندم جواب این سوال به طور خلاصه این هست که : زمانی از اینترفیس runnable استفاده می کنیم که بخواییم از یه کلاس دیگه مثل JFrame ,... به ارث ببریم و اگه قرار باشه فقط متد Run رو override کنیم بهتره که از اینترفیس runnable استفاده کنیم تا از کلاس thread به ارث ببریم.
اما این سوال رو درست نفهمیدم

اینکه چرا یک کلاس abstract در نظر نمی گیریم بجای یک interface من می خوام خودت بری و با این راهنمایی که بهت می کنم جواب رو بدست بیاری.

یه سوال دیگه : وقتی نمی تونیم از یه کلاس abstract شی بگیریم نوشتن constructor برای کلاس abstract چه معنی و سودی داره ؟

javaphantom
شنبه 28 مرداد 1391, 09:17 صبح
با توجه به مقالاتی که خوندم جواب این سوال به طور خلاصه این هست که : زمانی از اینترفیس runnable استفاده می کنیم که بخواییم از یه کلاس دیگه مثل JFrame ,... به ارث ببریم و اگه قرار باشه فقط متد Run رو override کنیم بهتره که از اینترفیس runnable استفاده کنیم تا از کلاس thread به ارث ببریم.
اما این سوال رو درست نفهمیدم

یکم تند از روی این مطلب عبور کردی. یک نکته خیلی مهمی توی این مسئله بود که من مطرح کردم. که جواب سوال بعدی رو هم می گرفتی. خیلی ذهنیت swing ی و می شه گفت ذهنیت vb کارها و C# کارها رو داری.

نکته قابل توجه در بکار بردن یک interface و استفاده از یک کلاس abstract یا کلاس معمولی رو می شه با این کلمه کلیدی از هم جدا کرد و اون کلمه رفتار هست.

وقتی از یک کلاس ارث می بری یک سری رفتارهایی که شاید حتی به اون نیاز نداشته باشی رو هم به خاطر قانون ارث بری به همراه خودت داری.

نکته : یک کلاس abstract به هیچ عنوان قابل instance گرفتن نیست و باید از اون ارث ببریم تا بشه از اون کلاس استفاده کرد.

دقت کن گفتم ارث ببریم که بشه ازش استفاده کرد. یعنی من کلاسی رو که ازش ارث برده رو آدم حساب نکردم. هنوز دارم در مورد خود کلاس abstract صحبت می کنم. چرا؟ چون گفتم من نیاز به یک سری رفتار های این کلاس دارم. جالب اینکه در یک کلاس abstract می تونی هیچ متدود abstract ی هم نداشته باشی. و همه پیاده سازی شده باشه. چرا؟ چون استفاده از این کلاس به معنای استفاده از رفتار های این کلاس هست. این رفتار ها بعضی هاش کاملا معلومه و از قبل پیاده سازی شده و بعضی هاش به عهده استفاده کننده است که باید پیاده سازی بشه.

اما interface:

چون تمام متدودها در interface بصورت abstract هست در نتیجه رفتار خاصی رو به شما تحمیل نمی کنه اما وجود اون رفتار رو به شما زور می کنه. یعنی به عبارتی قابلیتی اضافه به کلاس شما می ده. برای همین هست که معمولا interface ها با نم گذاری xxxable هستند.

مثال یک : من یک interface دارم به نام flyable که درون اون یک متدود هست doFly . همینطور که داری می بینم من یک قابلیت به نام پرواز کردن تعریف کردم اما هیچ طوری که بگم چه جوری پرواز کن رو مطرح نکردم.

حالا یک کلاس حشرات در نظر می گیرم که از نوع abstract هست و می یام این interface رو هم implement می کنم اما باز doFly رو می تونم abstract نگه دارم. بعد بگم حشرات یک سری رفتا رهای مشترک مثل نیش زدن دارن و همه با یک رفتار خواصی نیش می زنن.

از طرف دیگه کلاس هواپیما رو درست می کنم که مستقیم می گم این کلاس بیاد interface رو implement کنه و متدود doFly رو implement می کنم که مثلا با موتور جت پرواز کنه. اما در کلاس abstarct حشرات هنوز دسته من بازه برای تعریف انواع و اقسام حشرات جور واجور که می تونن علاوه برا رفتار هایی که براشون در نظر گرفتم روش پرواز خودشون هم داشته باشن در صورتی که در کلاس هواپیما من به صراحت گفتم می تونه پرواز کنه اونم با موتور جت


در سوالی که ازت داشتم می خواستم همین رون بهت بگم که وفتی از کلاس Thread ارث می گیری داری یک سری رفتارهایی که مربوط به این کلاس هست رو هم با خودت می یاری که ممکنه اصلا به دردت نخوره چون شما فقط نیاز به داشتن قابلیت thread را می خواهین. پس نیاز به یک interface هست که بخواهید اونطور که دلتون می خواد رفتار run رو تعریف کنید مثل مثال هواپیما و حشرات

این نکته اصلی هست که در وراثت و implementation وجود دارد. برا ی همین هست که در جاوا می گیم extend , implement تا بشه دقیقا این دو معنا رو از هم جدا کرد
فت

بهزاد علی محمدزاده
شنبه 28 مرداد 1391, 10:37 صبح
خیلی ذهنیت swing ی و می شه گفت ذهنیت vb کارها و C#‎‎ کارها رو داری. سلام . چقدر من رو این موضوع کار کردم تا این رفتارها رو در برنامه نویسیم تغییر بدم ، حدود یکسال ویندوز رو از سیستمم حذف کردم ( لینوکس ) . چون اول کار با vb6 آشنا شدم ( و البته غلط اشنا شدیم و مشکل از این زبان ها و تکنولوژی ها نبود ) ، در طرز فکرم تاثیر گذاشته بود . بگذریم ...

اونچه که من از لحن سوال دوستمون فهمدیم ، این نیست که مفهوم Interface رو بخوان بدونن ، بلکه فکر می کنم منظورشون اینه که ما برای یه طراحی جزیی ، و مثلا با داشتن سه متد مشترک ، آیا باز هم از یه کلاس رابط استفاده کنیم ؟ برای همچین کاری ، فایده اش چیه ؟ هر متد رو در کلاس خودش تعریف می کنیم ، چه کاریه حالا برای سه تا متد ما ارث بگیریم ؟

جواب این و اگر ممکنه در موردش صحبت کنید . تشکر

yegane8
شنبه 28 مرداد 1391, 12:35 عصر
ممنون از توضیحات دوستان :لبخندساده:

برای یه طراحی جزیی ، و مثلا با داشتن سه متد مشترک ، آیا باز هم از یه کلاس رابط استفاده کنیم ؟ برای همچین کاری ، فایده اش چیه ؟ هر متد رو در کلاس خودش تعریف می کنیم ، چه کاریه حالا برای سه تا متد ما ارث بگیریم ؟

اگه به این سوال هم پاسخ داده بشه خیلی ممنون میشم
من vb یا c# کار نکردم و نمی دونم vb کار ها دهنیت شون چه طوریه؟

، حدود یکسال ویندوز رو از سیستمم حذف کردم ( لینوکس )
میشه یه کم در مورد اثر یا دلیل این کار توضیح بدین شاید من هم مجبور به همچین کاری شدم

javaphantom
شنبه 28 مرداد 1391, 13:49 عصر
سلام . چقدر من رو این موضوع کار کردم تا این رفتارها رو در برنامه نویسیم تغییر بدم ، حدود یکسال ویندوز رو از سیستمم حذف کردم ( لینوکس ) . چون اول کار با vb6 آشنا شدم ( و البته غلط اشنا شدیم و مشکل از این زبان ها و تکنولوژی ها نبود ) ، در طرز فکرم تاثیر گذاشته بود . بگذریم ...

اونچه که من از لحن سوال دوستمون فهمدیم ، این نیست که مفهوم Interface رو بخوان بدونن ، بلکه فکر می کنم منظورشون اینه که ما برای یه طراحی جزیی ، و مثلا با داشتن سه متد مشترک ، آیا باز هم از یه کلاس رابط استفاده کنیم ؟ برای همچین کاری ، فایده اش چیه ؟ هر متد رو در کلاس خودش تعریف می کنیم ، چه کاریه حالا برای سه تا متد ما ارث بگیریم ؟

جواب این و اگر ممکنه در موردش صحبت کنید . تشکر


همیشه رعایت اصول ممکنه در نگاه اول سخت و حتی بی معنی باشه اما منفعت های خودش رو در آینده نشون می ده.

با این سه مثال شروع می کنم.

یک لونه سگ رو در نظر بگیرد. با چهارتا چوب چند تا میخ می تونی درست کنی. یک کم هم رنگ که خوشکل بشه.

یک خونه چهار طبقه جی ؟ آیا می شه ؟ مطمعنا نه.

حالا اگر بخوای یک برج یا یک آسمون خراش درست کنی چی؟

نتیجه بنا به نیازت ابزار انتخاب کن طراحی کن و پیاده سازی.

از یک نگاه دیگه.

اگر به یک نجار معمولی بگی لونه سگ درست کنه چه قدر به استحکام گرما سرما فضا ظاهر کار دقت می کنه و اگر هم بکنه چقدر تجربی چقدر علمی و چقدر اقتصادی هست.

حالا همون برج ساز رو بهش بگن خونه سگ بساز یا حداقل طراحی کن جه قدر به مواردی که بالا اشاره کردم دقت می کنه.


به اعتقاد شخصی من برای چهارتا کلاس ساده هم باید اصول طراحی رعایت بشه.

javaphantom
شنبه 28 مرداد 1391, 13:52 عصر
در ضمن اگر مفهوم چیزی رو درست متوجه بشی و درکش کنی به هیچ عنوان علت استفاده اون برات سوال نمی شه. در نتیجه من اعتقاد مفاهیم که در پست های قبل صحبت شد بسیار خوب و بجا بود چون مطمعا هستم که کسانی که الان چندین ساله دارن جاوا کار می کنن با همین مفاهیم اولیه مشکل دارند.

yegane8
شنبه 28 مرداد 1391, 14:04 عصر
خیییییلی ممنون از توضیحاتتون
من هم معتقدم مطالب گفته شده خوب و به جا بودند با اینکه مطالب زیادی در این موارد خوندم اما هر مثال جدیدی که می خونم یه قسمتی از قضیه رو که تا حالا نسبت بهش بی توجه بودم رو برام روشن میکنه

بهزاد علی محمدزاده
شنبه 28 مرداد 1391, 16:07 عصر
میشه یه کم در مورد اثر یا دلیل این کار توضیح بدین شاید من هم مجبور به همچین کاری شدم

من این کار رو توصیه نمی کنم ، نه اینکه دنیای متن باز و لینوکس و توصیه نکنم بلکه یکسال کار روی سیتسم عامل رو در صورتی که قرار نیست در اون زمینه کار کنید و توصیه نمی کنم ، چون کسی که در این دنیا ( نرم افزار ) فعالیت می کنه ، لازمه که آشنایی داشته باشه نه اینکه یکسال در این زمینه وقت صرف کنه ولی کارش این نباشه ... کاری که من کردم یه تصمیم کاملا شخصی بود ، چون یه کاربر قدیمی کامپیوتر بودم ، و سالها کامپیوتر داشتم ، اما شغلم چیزه دیگه ایی بود و بعد ها تصمیم گرفتم ادامه تحصیل بدم و دست از کار کشیدم و برای دانشگاه آماده شدم . ولی در طول اون سالها که از ویندوز 95 شروع شده بود ، عادت های خیلی بدی کسب کرده بودم ، از همون ها که هرچی میومد yes رو می زدیم ، :لبخند: ، پیغام میومد که من یه تروجان هستم می خوای نصب بشم ، ما هم بدون اینکه بخونیم می گفتیم : yes yes ... :لبخند: .

بعد که با ویژوال بیسیک آشنا شدم ، در هر زمینه در برنامه نویسی اول دنبال این بودیم که ببینیم آیا این کار محیط ویژوال داره ؟ و این شده بود یه وابستگی معتاد گونه ، به همین خاطر من تصمیم گرفتم برم و با لینوکس کار کنم .

الان هم این کارها رو ادامه میدم ، مثلا سعی می کنم از قابلیت های Editor ها مثل Code completion کم استفاده کنم و ترجیحا کد ها رو Type کنم تا در ذهنم حک بشه .

بخش عمده ایی از وقتم رو الان Database کار می کنم و شامل SQL هم میشه . از هیچ محیط وپژوالی استفاده نمی کنم و کد میزنم . اینها تصمیمات شخصی هست اما توضیحاتی هم میدم که شاید لازم باشه بگم :

بعضی از زبان ها و در کل کارهایی که ما اگر بریم سراغشون به درک بیشتر ما از زبان ها وسیستم ها کمک می کنه ، مثل طراحی با مداد در دنیای نقاشی هست .

اگر شما برید سراغ نقاشی ، و تصمیم بگیرید کلاس برید ، می بینید که انواع آموزش ها رو دارن ، رنگ روغن ، آبرنگ ، مداد رنگی ( برای خودش دنیایی داره ) ، و طراحی با مداد و ... شما می تونید از همون اول رنگ روغن انتخاب کنید ، در تمرینات استاد براتون طرح رو می کشه روی بوم و به شما رنگ رو آموزش میده . اما تقریبا میشه گفت تمام اساتید این رشته به شما توصیه می کنن که اگر چه به رنگ روغن علاقه مند هستید اما بهتره از طراحی با مداد شروع کنید ! و تقریبا اکثر نقاشهای بزرگ طراحی رو حرفه ایی کار کردن و بعد رنگ و انتخاب می کنن . یعنی اگر یه تیکه ذغال بهشون بدی اون باهاش نقاشی می کشه و اکثرشون آثار طراحی با مداد رو دارن .

در دنیای برنامه نویسی هم میشه گفت اینجوری هست ، ( نظر شخصی منه ) ، اگر کسی مدتی رو اسمبلی بنویسه و مدتی رو سی پلاس پلاس کار کنه ( و نه لزوما برای شروع ) ، در برنامه نویسی ( و ابته نه تمام جنبه های تولید و مهندسی نرم افزار ) ، دیگه هیچ زبان و تکنولوژی براش سخت و نامفهوم نیست .

مشکل اکثر دوستان ما ، اگر بخش های دات نت و PHP رو دنبال کنید ، می بینید که ، مفاهیم رو ندونسته و تمرین نکرده ، رفتن سراغ تولید نرم افزار !!! ... هنوز کار با آرایه رو بلد نیست رفته سراغ زبان سمت سرور که برای تولید نرم افزاره و نه تمرین . مثل اون علاقه مند به نقاشی می مونن که موقع ثبت نام هرچی بهش میگن در طراحی ثبت نام کن و شما باید چند سال با مداد کار کنید ، این خیال می کنه که میشه این مفاهیم بنیادی رو دور زد و زودتر به نتیجه رسید ، به همین خاطر گوش نمیده و همون رنگ روغن و انتخاب می کنه اما شاید هیچ وقت کاری در خور توجه نتونه ارائه بده ...

اما پیشنهاد من به شما اینه که اگر به دنبال یادگیری مفاهیم و درک برنامه نویسی هستید ، Game هست . بازی بنویس ، دو بعدی ( اگر فرضا به گرافیک و سه بعدی علاقه نداری دو بعدی کار کن ) . در بازی نویسی همه چیز هست . از کنترل ورودی ها تا خروجی ها ، تا الگوریتم ... و منظورم این نیست که حتما بازی نویس بشید ، بلکه اگر مدتی رو به این کار اختصاص بدی و بازی های دو بعدی تمرین کنی و بنویسی ، درک خیلی بالایی از برنامه نویسی بدست میاری . اونوقت با درک بالا ،‌با تکنولوژی ها ، زبان و ... کار می کنی .