هنر برنامه نویسی

چرا و چطور برنامه نویس خوبی باشیم ؟!

هنر برنامه نویسی

چرا و چطور برنامه نویس خوبی باشیم ؟!

دستورات انتساب در جاوا

فهیم آیت | جمعه, ۱۲ خرداد ۱۳۹۱، ۰۸:۰۲ ب.ظ | ۰ نظر

در زبان های برنامه نویسی ، معمولا به دستوراتی که عملگر = در آنها استفاده شده ، دستورات انتسابی گفته می شود.

برای مثال این دستورات را در نظر بگیرید :

int num = (12*5)/4 ;

int b = 12  ;

int a = b + num ;

a = a + 12 ;

Person p = new Person() ;

p.name = "Ali" ;

p.age = a + 21 ;

دستورات انتساب از سه دستور تشکیل شده اند که با عملگر = از هم جدا می شوند ، بخش سمت راست (RightValue یا R-Value) ، بخش سمت چپ (LeftValue یا L-Value) و انتساب

بخش سمت راست

این بخش در هنگام اجرا ، کاملا مستقل از بخش سمت چپ محاسبه می شود، یعنی سیستم ابتدا این بخش را محاسبه می کند و مقدار آن را مشخص می کند. مثلا در دستور a = a + 12 ، ابتدا سیستم مقدار a+12 را محاسبه می کند.

بخش سمت چپ

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

بخش سمت چپ می تواند خیلی ساده باشد ، مانند a = a + 12 که صرفا اعلام می کند حاصل سمت راست به a  نسبت داده می شود.

همچنین بخش سمت چپ می تواند با اعلام متغیر همراه شود. مانند Person p و یا int a و یا int b (خطوط ۱ ، ۲ ، ۳ و ۵) . در این حالت دستور سمت چپ هم اعلام متغیر است و هم نسبت دهی. حالت نهایی بخش سمت چپ نیز دو خط آخر مثال هستند. در این حالت مقدار دهی به یک جزء از شی مورد نظر نسبت داده می شود. در مثال خط آخر ، مقدار محاسبه شده به فیلد سن از شی person نسبت داده می شود.

 

عمل انتساب

می رسیم به اصل داستان ، زمانی که مقدار سمت راست محاسبه شد و در سمت چپ مشخص شد که قرار است با این مقدار محاسبه شده چه بکنیم ، عمل انتساب انجام می شود. همانطور که در بحث اشیاء و مقادیر توضیح داده شد ، اگر مقدار سمت راست یک مقدار ساده (انواع ساده مانند Int یا boolean) بود ، مقدار آن مستقیما در متغیر سمت چپ ریخته می شود. اگر حاصل یک شی بود ، مقدار سمت چپ به آن شی اشاره می کند.

 

  • فهیم آیت

مروری بر scrum

فهیم آیت | شنبه, ۳۰ ارديبهشت ۱۳۹۱، ۰۹:۵۹ ب.ظ | ۰ نظر

اسکرام چیست ؟

اسکرام (Scrum) یکی از محبوب ترین متدولوژی های افزایشی (Incremental) تولید نرم افزار چابک (agile) است.

تدوین گران  اسکرام تلاش کرده اند که متدولوژی تعریف کنند که تا حد امکان ، پروسه تولید نرم افزار را سریع و انعطاف پذیر کنند، به همین جهت نام اسکرام برگرفته از یک ورزش (نوعی راگبی) است 

اسکرام بر این تاکید دارد که بسیاری از جوانب مساله ، از قبل قابل پیش بینی نیستند و نیازمندی های زیادی ممکن است در طول تولید نرم افزار اضافه شوند یا تغییر کنند ، از این رو ، اسکرام یکی از بهترین متولوژی ها برای مسائلی است که یا جوانب مبهم زیادی دارند و یا به هر دلیلی برخی از جوانب آن قابل پیش بینی و تحلیل نیستند.

 

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

 

بر خلاف متدولوژی های بر پایه RUP که بر مستند سازی کلیه اطلاعات تاکید ویژه ای دارند، این متدولوژی بر پایه تعاملات گروهی است و به افراد تیم ها اجازه می دهد که از مستنداتی مانند Class Diagram ، SequenceDiagram و امثالهم ، فقط در صورت نیاز استفاده کنند. به همین جهت هم از نکات مهم این است که کلیه افراد هر تیم ، در یک محل باشند و در ساعات مشترکی به کار بپردازند . از این رو مدل اسکرام برای تیم های بر پایه دور کاری اصلا مناسب نیست.

متد اسکرام تاکید ویژه ای بر جلسات مستمر و منظم دارد (مانند اکثر متدولوژی های agile) که در ادامه در این رابطه بیشتر صحبت می شود.

مفاهیم اساسی :

 

نقش های اصلی در اسکرام :

کارفرما (ProductOwner) : 

کارفرما یا صاحب محصول ، نماینده مشتری و کاربران سیستم است. کارفرما کسی (یا کسانی) هستند که نیازمندی های سیستم را تعریف می کنند ، نیازمندی ها را اولویت بندی می کنند و لیست قابلیت های سیستم را تعیین می کنند.

تیم تولید(Development Team) :

تیم تولید یک تیم 3 تا 9 نفره از افرادی با توانایی های مختلف است که تولید نرم افزار (تولید نرم افزار شامل تحلیل ، طراحی ، پیاده سازی ، تست ، بومی سازی ، مستند سازی و پشتیبانی فنی است) را بر عهده دارند.

استاد اسکرام (ScrumMaster) :

استاد اسکرام کسی است که وظیفه برطرف کردن موانع از سر راه تیم های تولید را بر عهده دارد، البته استاد اسکرام را نباید با مدیر یا رهبر تیم اشتباه گرفت. نقش وی اعمال کردن قوانین اسکرام است ، اینکه اجازه ندهد تمرکز تیم های تولید از اهدافی که در ابتدای هر sprint فاصله نگیرند.

 

UserStory ، Theme و Epic :

در این مطلب جداگانه بررسی شده اند.

لیست کارهای ناتمام (Backlog) :

لیست تمام نیازمندی های سطح بالا (یا روایات کاربرها) که بر اساس اولویت مرتب شده. این لیست ، سطح بالاترین دید از سیستم است که کلیه قابلیت های سطح بالای سیستم  در آن قابل مشاهده است.

مهم ترین ویژگی آیتم های موجود در Backlog ، اولویت آن و تخمین هزینه آن آیتم است.

 

اسپرینت (Sprint):

پیشتر توضیح داده شد که هر اسکرام از یک سری فاز به نام Sprint تشکیل شده. اسپرینت یک فاز تولید سیستم است که در یک قالب زمانی تعریف می شود ، یعنی در ابتدای هر اسپرینت مدت مورد نظر مشخص می شود که این مدت می تواند بین یک هفته تا یک ماه باشد.

در ابتدای هر اسپرینت وظایف (Tasks) مشخص می شوند و هر تیم ، بسته به وظایفی که بر عهده گرفته ، بخشی از سیستم را تکمیل می کند. در پایان مدت مقرر ، بخش های تکمیل شده به کارفرما ارائه می شود و کارهایی که ناتمام مانده به لیست کارهای ناتمام (Backlog) برگردانده می شود.

جلسات

جلسه برنامه ریزی اسپرینت (Sprint plannigng meeting) :

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

اسکرام روزانه (Daily Scrum):

در طول  sprint ، هر روز جلسه ای برگزار می گردد که به آن standup روزانه نیز گفته می شود. دلیل این نام نیز این است که از آنجا که قرار بر این است که این جلسه کوتاه و خلاصه برگذار شود ، معمولا به صورت ایستاده و در ابتدای روز کاری برگزار می شود. خصوصیات این جلسه از این قرار است :

  • طول جلسه محدود به 15 دقیقه است
  • ترجیحا جلسه همیشه در یک محل و سر ساعت خاصی برگزار می شود.
  • در طول هر جلسه ، هر یک از افراد تیم توضیح می دهند که روز قبل چه کردند ، امروز چه می کنند و چه مشکلاتی بر سر راهشان قرار دارد.

جلسه تمیز کردن لیست کارهای نا تمام (Backdlog Grooming) :

در این جلسات که تیم ها در مورد تخمین زمانی و هزینه کار ها صحبت می کنند و در صورت نیاز ، story های بزرگ را به story های کوچک تر می شکنند. تعداد این جلسات در طول دوره بسته به نظر اعضای تیم است ، اما هر یک از این جلسات نباید بیش از یک ساعت به طول انجامد.

 

جلسه اسکرام اسکرام ها !

این جسله تشکیل شده از نمایندگان هر تیم ( یک نفر از هر تیم)  که همان موضوعات اسکرام روزانه را با رویکرد تیمی بررسی می کنند. به این معنی که در این جلسه هر نمایند توضیح می دهد که تیمش چه کرده اند و در روز جاری انتظار دارند به کجا برسند. این جلسه هر روز بعد از اسکرام روزانه تشکیل می شود.

جلسات پایان اسپرینت : retrospective و print review

جلسه Sprint review جهت ارائه کارهای انجام شده در اسپرینت به کارفرما و کاربران است. در این جلسه چهار ساعته لیست کار های انجام شده به کارفرما ارائه می شود و بخش های قابل استفاده توسط کاربران ، به کاربران ارائه می گردد.

جلسه rerospective ، یک جلسه درون تیمی است که در آن افراد تیم ، به نقد و بررسی ایرادات و تکنیک های استفاده شده در اسپرینت اخیر می پردازند ، این جلسه نیز محدود به چهار ساعت بوده و این دو سوال اساسی باید پاسخ داده شود : چه نکات مثبتی در اسپرینت اخیر وجود داشت ، چه وجوهی از کار تیم می تواند بهبود یابد.

 

 

نتیجه گیری :

به طور کلی می توان نتیجه گرفت که اسکرام ، یک متدولوژی چابک برای انجام یک پروژه با ابعاد متوسط می باشد.

این روش تاکید ویژه ای بر تعاملات تیمی و بین تیمی و نظم مطلق در این تعاملات دارد ، بگونه ای که زمانبندی جلسات و کارها ، چه از جهت طول انجام کار و چه از جهت زمان شروع بکار ، در تمام اجزای این متدولوژی دیده می شود.

بر خلاف روش های سنتی ، در این روش اصرار خاصی بر مستند سازی اطلاعات وجود ندارد.

این روش برای outsource کردن پروژه ها و استفاده از متخصصینی که از راه دور در اجرای کار همکاری می کنند و به خصوص پروژه هایی که به صورت Community Develope پیاده سازی می شوند اصلا مناسب نبوده و کلا در فضای کاری دیگری مطرح می شوند.

این روش تاکید خاصی بر Self Organize بودن افراد و تیم ها دارد ، بگونه ای که تاکید شده ، حتی در جلسات برنامه ریزی اسپرینت ها که وظایف مشخص می شوند، هیچ وظیفه ای به کسی محول (Assign) نمی شود ، بلکه افراد با توجه به توانایی و سابقه ، خود وظایف را انتخاب می کنند.

برای مسائلی که تیم عملیاتی ، شناخت کاملی از مساله ندارند و یا بطور کلی این شناخت امکان پذیر نیست ، بازدهی روش های چابک (Agile) می تواند خیلی بهتر از روش های سنتی مانند RUP باشد. اما در مسائلی که به هر دلیل ، می توان از قبل تحلیلی کامل و جامع در مورد نیازمندی های سیستم انجام داد و طراحی سیستم بگونه ای باشد که به احتمال زیاد ، در طول پروژه تغییر کمی داشته باشد ، روش هایی نظیر RUP می توانند بازدهی بالاتری داشته باشند.

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

 

 

منابع :

http://www.scrumalliance.org/learn_about_scrum

http://www.scrum.org/

http://www.mountaingoatsoftware.com/topics/scrum

http://en.wikipedia.org/wiki/Scrum_(development)

 

  • فهیم آیت

تفاوت فیلد ها و متد های استاتیک و غیر استاتیک

فهیم آیت | جمعه, ۲۹ ارديبهشت ۱۳۹۱، ۱۰:۵۱ ب.ظ | ۱۴ نظر

متد های استاتیک و غیر استاتیک چه تفاوتی دارند ؟

برای این سوال باید در ابتدا تفاوت کلاس ها و اشیا را بدانید. اگر قبلا با این مفاهیم آشنا نشده اید ، مطلب در مورد کلاس ها و اشیا را بخوانید.

 


در مطلبی که در مورد کلاس ها و اشیا توضیح داده شد ، اشاره کردیم که زمانی که از یک کلاس ، یک شی ساخته می شود ، می توانید با استفاده از نقطه (.) به متد های آن شی دسترسی پیدا کنید.

مثلا زمانی که کلاسی به نام ماشین داشته باشید و در این کلاس متدی به نام روشن شو وجود داشته باشد ، تمام اشیاءی که از روی کلاس ماشین ساخته شده باشند ، این متد را دارند و شما می توانید آن متد را صدا بزنید.

اما واضح است که نمی توانید به کلاس ماشین بگویید روشن شو ، چرا که متد روشن شدن، بسته به خصوصیات هر یک از این اشیا فرق دارد ، مسلما روشن شدن ماشینی که بنزین ندارد و باطری آن هم مدت هاست که از کار افتاده ، خیلی با سایر ماشین ها تفاوت دارد !!!

 

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

فرض کنید کلاسی به نام کلاس MathHelper داریم  که می خواهیم یک سری توابع ریاضی که زیاد استفاده می شوند را در این کلاس بگنجانیم ، تابع سینوس را در نظر بگیرید. مهم نیست که از این کلاس MathHelper چند شی بسازید یا این اشیا چه خصوصیاتی داشته باشند ، متد سینوس یک عدد می گیرد و سینوس آن عدد را محاسبه می کند و بر می گرداند.

به این گونه متد ها استاتیک یا ایستا گفته می شوند  ، به این معنی که برای صدا زدن متد ، نیازی به ساختن شی از کلاس نمی باشد و این متد مستقیما از روی کلاس صدا زده می شود :

float result  = MathHelper.sinus(90) ;

در این دستور یک متغیر اعشاری به نام result یا حاصل تعریف کرده ایم و سینوس 90 درجه را محاسبه و در این متغیر ریخته ایم.

تعریف متد ها و فیلد های استاتیک نیز ساده است.

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

مثلا کلاس MathHelper چنین ترکیبی خواهد داشت:

public class MathHelper{


public static float sinus (float degree) {

float sin = 0 ;

// calculate the sinus

return sin  ;

}

}

 

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

همچنین دقت داشته باشید که عبارت calculate the sinus یک دستور جاوا نیست. در جاوا هر خطی که در ابتدای آن // بیاید ، کامنت (comment) نامید می شود. کامنت ها به این معنی هستند که این خط دستور نیست و به زبان جاوا نوشته نشده اند و اجرا نخواهد شد ، بلکه برای خواندن برنامه نویس هستند.

 

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

در مورد متد های استاتیک این گونه است که برای صدا زدن یک متد استاتیک ، نیازی به داشتن یک شی از کلاس مربوطه نیست.

اما برای صدا زدن متد ها غیر استاتیک از داخل یک متد استاتیک ، حتما باید یک شی از جنس کلاس مربوطه داشته باشید ،

برای روشن تر شدن موضوع ، فرض کنید کلاس MathHelper که پیش تر توضیح داده شد، دو متد دیگر به نام A و B داشته باشد:

 

public class MathHelper{


public static float sinus (float degree) {

float sin = 0 ;

// calculate the sinus

return sin  ;

}


public void a(){

}


public void b(){

}

}

شما می توانید متد b را مستقیما از داخل a صدا بزنید ، یعنی می توانید متد a را اینگونه بنویسید :

public a(){

b() ;

}

اما از داخل متد سینوس که استاتیک است نمی توانید a  و b را صدا بزنید ، چرا که این دو متد استاتیک نیستند و برای دسترسی به آنها باید حتما یک شی از جنس MathHelper داشته باشید.

 

در پایان ، به یاد داشته باشید که متد های استاتیک ، زمانی بکار گرفته می شوند که متد مستقل از اشیا باشد و صدا زدن متد در اشیا مختلف ، تاثیری در نتیجه نداشته باشد.

 

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

  • فهیم آیت

متد ها در جاوا

فهیم آیت | جمعه, ۲۹ ارديبهشت ۱۳۹۱، ۱۰:۴۹ ب.ظ | ۲ نظر

توی این مطلب ، نگاهی داریم به متد ها در زبان برنامه نویسی جاوا

 

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

تعریف متد ساده است. هر متد یک سری اجزای حیاتی داره : چه ورودی هایی می گیره ، چه نامی داره و چه خروجی داره.

مثلا ، متدی تعریف می کنیم که کارش سینوس گرفتنه ، این متد برای ورودی یک عدد می گیره (زاویه)، و خروجیش هم یک عدده . طبیعتا نامش رو میگذاریم sin یا sinus .

علاوه بر این اجزای اصلی ، متد می تونه یک سری اجزای دیگه هم داشته باشه که در مطالب بعدی توضیحات کافی خواهم داد

قالب کلی متد های جاوا ، کاملا مانند زبان های برنامه نویسی شی گرای دیگه مثل ++C و #C هست. 

 

قالب تعریف متد ها در جاوا به این صورته (این قالب می تونه اجزای دیگه ای هم داشته باشد که بعدا مفصل مورد بررسی قرار می گیره ، اما فعلا در همین حد برای اکثر برنامه های ما کافیه )

(پارامتر های ورودی) نام متد          نوع خروجی     استاتیک بودن     سطح دسترسی

در مورد سطح دسترسی توی این مطلب توضیحات کافی وجود داره . 

تفاوت متد های استاتیک و غیر استاتیک هم در مطالب بعدی توضیح داده خواهد شد.

مثال

public static void main(String[] args)

این متد آشنا میگه اولا سطح دسترسی به این متد عمومیه ، (public)

این متد استاتیکه(static)

این متد خروجی نداره ، به عبارت دیگه ، خروجیش پوچه ! (void)

نام این متد main می باشد

این متد آرایه ای از String ها به عنوان ورودی می گیره که اونها رو با نام args میشناسه.

 

در ادامه یک آکولاد باز  (}) می بینید که نقطه شروع بدنه این متده و تا آکولاد بسته ای ( { )  که متناظر به این آکولاد بازه  ،بدنه این متد محسوب میشه ، به این معنی که با هر بار اجرای این متد ، تمام دستوراتی که توی بدنه متد وجود دارند ، به ترتیب اجرا خواهند شد.

 

اگر متد خروجی داشته باشه ، کلمه کلیدی return مشخص می کنه کجا اجرای متد تموم شده و چه مقداری حاصل اجرای متد خواهد بود. به عنوان مثال متد زیر ، یک متد ساده جمع است :

public int calculateSum ( int firstNumber , int secondNumber){

   int total = firstNumber + secondNumber ;

   return total; 

}

 

این متد دو عدد صحیح به عنوان ورودی دریافت می کنه  ، اسم اونها رو firstNumber و secondNumber می گذاره ، 

توی بدنه متد تعریف کردیم که یک متغیر دیگه داریم به نام total ، عدد اول و عدد دوم رو جمع می کنیم و حاصل رو توی total می ریزیم. در نهایت مقدار total رو به عنوان خروجی بر می گردونیم.

  • فهیم آیت

سطوح دسترسی در جاوا

فهیم آیت | جمعه, ۲۹ ارديبهشت ۱۳۹۱، ۱۰:۲۲ ب.ظ | ۱ نظر

در این مطلب ، سطوح دسترسی به فیلد ها ، متد ها و کلاس ها در زبان جاوا رو توضیح می دم.

اگر اولین برنامه ای که نوشتیم رو یادتون بیاد ، متدی داشتیم به نام main.

اولین کلمه ای که توی تعریف این متد ذکر شده بود ، کلمه public بود که سطح دسترسی به این متد رو نشون میده.

 

مقدمه

یکی از مفاهیم مهم زبان های برنامه نویسی پیشرفته ، مفهوم encapsulation یا بسته بندیه.

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

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

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

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

نکته دیگه ای که هست اینه که خیلی وقت ها خود ما هم نمی خواهیم که دیگران یک سری متد یا فیلد رو ببینند.

 

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

در نتیجه می تونید داخل کلاس تعداد زیادی متد ها و فیلد های کمکی داشته باشید که بیرون از کلاس دسترسی به اون ها وجود نداشته باشه و باعث سردرگم شده سایر افراد پروژه نشه.

 

در جاوا چه سطوح دسترسی داره و هر کدوم به چه معنی هستند ؟

 

1- public : سطح دسترسی عمومی که با کلمه کلیدی public  در ابتدای تعریف فیلد ها ، متد ها و کلاس ها مشخص می شه. سطح دسترسی عمومی به این معنی که از تمام نقاط برنامه می شه به اونها دسترسی پیدا کرد.

2- private : سطح دسترسی خصوصی که با کلمه کلیدی private در ابتدای تعریف فیلد ها و متد ها مشخص میشه. این سطح دسترسی به این معنیه که فقط از داخل همین کلاس می شه به این فیلد ها و متد ها دسترسی پیدا کرد.

3- protected : کاملا شبیه به private با این تفاوت که اگر یک متد private باشه ، حتی کلاس هایی که از این کلاس مشتق شدن ( به ارث بردن) به متد خصوصی دسترسی ندارند اما به متد حفاظت شده (protected) دسترسی دارند، به علاوه ، تمام کلاس های دیگه ای که توی همین پکیج باشن ، به اعضای حفاظت شده دسترسی دارند

4- package protected : این سطح دسترسی ، با نگذاشتن هیچ یک از کلمات کلیدی بالا در ابتدای تعریف کلاس ها ، متد ها و متغیر ها مشخص می شه. همون طور که از نامش پیداست (حفاظت شده در پکیج) تمام کلاس هایی که با این کلاس توی یک پکیج قرار دارند، به این متد ، فیلد یا کلاس دسترسی دارند.

 

  • فهیم آیت

اشاره گر ها و مقادیر در جاوا - بخش اول

فهیم آیت | پنجشنبه, ۲۸ ارديبهشت ۱۳۹۱، ۱۰:۱۱ ب.ظ | ۵ نظر

اگر پیش از این ، با زبان هایی مانند c سروکار داشتید ، می دونید که توی c یک مفهوم نسبتا گیج کننده داریم به نام اشاره گر (pointer) . خوشبختانه توی جاوا از کار کردن مستقیم با اشاره گر ها خبری نیست.

اما چون اساسا دسترسی به اشیا مدل call by reference هست ، باید این مفهوم رو بدونید.

 

 

 

مثال ساده زیر رو در نظر بگیرید :

int a ;

int b;

a = 12 ;

b = a ;

b = 25  ;

 

بعد از اجرای این دستورات ساده ، a , b  هر کدوم چه مقادیری خواهند داشت ؟

ساده است . a برابر خواهد بود با 12  و b با 25

اگر جواب درست داده باشید ، یعنی می دونید که در خط چهارم ، عبارت b = a به این معنی نیست که a  و  b  یک چیز هستند ، بلکه صرفا به این معنی است که محاسبه می کنه مقدار سمت راست چند است ( که در این حالت 12 است ) بعد این مقدار رو به b نسبت میده ، کاملا مستقل از اینکه این مقدار از کجا اومده.

در نتیجه a  و  b  کاملا مستقل هستند.

اما در دنیای اشیا ، قضیه کاملا فرق می کنه. فرض کنید کلاسی به نام Person داریم که فیلدی به نام age داره. کد زیر رو در نظر بگیرید :



Person p1 ;

Person p2 ;

p1 = new Person() ;

p1.age= 20 ;


p2 = p1 ;

p2.age= 12 ;

 

بعد از اجرای این کد ، سن p1 چقدر خواهد بود ؟ 20 ؟

نه !! بعد از اجرای این کد ، سن p1 و p2 و 12 خواهد بود !!

عملگر = ، بر خلاف اون اتفاقی که برای اعداد ( و بقیه انواع اولیه ، مانند char و boolean) می افته ، یک کپی از مقدار سمت راست تولید نمی کنه.

علت این امر اینه که متغیر هایی که از جنس یک کلاس تعریف می شوند و یک شی به اونها نسبت داده میشه ، ذاتا با متغیر های ساده ای که اعداد رو نگهداری می کنند ، فرق دارن.

زمانی که یک متغیر ساده (عددی) رو تعریف می کنید ، یک قسمت از RAM یا حافظه ، به اون متغیر اختصاص پیدا می کنه. این متغیر مستقیما به اون بخش از حافظه مرتبط شده. هر عددی که توی اون بخش از حافظه بنویسید ، مقدار متغیر همون خواهد بود.

اما در مورد اشیا قضیه فرق می کنه.

زمانی که یک شی رو new می کنید ، یک بخش از حافظه رو به اون شی نسبت دادید، زمانی که متغیری از جنس کلاس رو تعریف می کنید ، (مانند Person p1) یک بخش دیگه از حافظه رو به p1 اختصاص دادید.

در واقع وقتی که این دستور رو اجرا می کنید :

p1 = new Person();

اول شی ساخته می شه و در حافظه قرار می گیره ، بعد آدرس اون نقطه از حافظه توی p1 قرار می گیره.

وقتی می گید p2 = p1 ، اتفاقی که می افته اینه که آدرسی که درون p1 قرار داره ، درون p2 هم ریخته می شه. این به این معنیه که اگه اون شیئی رو که p1 بهش اشاره داره تغییر بدید ، متوجه می شید که p2 هم تغییر کرده ، چون p2 هم به همون شی اشاره داره.

مثالی که از این قضیه توی دنیای واقعی می شه زد ، اینه  :

کارت دانشجویی شما به شما اشاره داره ، شناسنامه شما هم همینطور. اگر نام شما عوض بشه ، شناسنامه و کارت دانشجویی شما هم باید عوض بشه.

مثال بهتری که میشه زد ، shortcut ها در windows هستند.

شما از یک برنامه می تونید هزاران shortcut بسازید که همه اونها دقیقا به یک برنامه اشاره دارند.

اگر اون برنامه رو پاک کنید ، تمام shortcut ها از بین می رند. نکته جالب اینجاست که این برنامه است که حافظه شما رو اشغال می کنه ، نه shortcutها ، اگر میلیون ها shortcut هم بسازید ، تغییر آنچنانی توی حافظه شما اتفاق نمی افته.

 

برای خاتمه ، این مثال رو هم در نظر بگیرید .

Person p1 ;

Person p2 ;

p1 = new Person() ;

p2 = p1 ;

p2.age = 12 ;


p2 = new Person() ;

p2.age = 14 ;

 

بعد از اتمام این قطعه کد ، p1.age و p2.age چه مقادیری خواهند داشت ؟

12 و 14

 

  • فهیم آیت

اشیا و کلاس ها در جاوا - بخش اول

فهیم آیت | پنجشنبه, ۲۸ ارديبهشت ۱۳۹۱، ۰۳:۱۰ ب.ظ | ۴ نظر

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

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

 

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

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

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

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

وقتی می خواهیم از روی یک کلاس ، شی درست کنیم ، از دستور new استفاده می کنیم. برای اینکار کافیه جلوی کلمه new نام کلاس مورد نظر رو بنویسید و جلوی اون ، یک جفت پرانتز اضافه کنید.

مثال :

new MyClass() ;

چطوری می تونیم از این شیی که ساختیم استفاده کنیم ؟

کافیه اون رو توی یک متغیر بریزیم ، بعد می تونیم از اون متغیر به شی مورد نظر دسترسی پیدا کنیم :

MyClass someObject ;

someObject = new MyClass() ;

 

همون طور که در مطالب قبل خوندید ، هر کلاس می تونه چندید متد و یا فیلد داشته باشه.

اگر بخواهید به یکی از این فیلد ها یا متد ها دسترسی داشته باشد ( در مورد متد ها ، اصطلاحا می گیم متد رو صدا بزنیم) ، کافیه جلوی نام شی ، یک نقطه بگذاریم و بعد نام اون متد رو قید کنیم

مثال :

int number = someObject.doSomething() ;

در این دستور ، متدی به نام doSomething از شی someObject رو صدا می زنیم و حاصل اون که یک عدد صحیحه رو توی متغیری به نام number میریزیم.

دقت داشته باشید که اگر چند شی از کلاس MyClass داشته باشیم، ممکنه صدا زدن این متد برای هر کدوم از این اشیا جواب متفاوتی رو داشته باشد ، همونطور که اگه با ماشین های مختلف بوق بزنید ، صداهای مختلفی خواهید شنید !!!

 

  • فهیم آیت

تعریف User story

فهیم آیت | چهارشنبه, ۲۷ ارديبهشت ۱۳۹۱، ۰۹:۱۴ ب.ظ | ۰ نظر

تعریف :

user story یا روایت کاربر ، شامل جملاتی از قول کاربر است که بخشی از کار وی یا نیاز کاربر از نرم افزار را توصیف می کند.

این مجموعه جملات ( که شباهت هایی با UseCase در متدولوژی هایی مانندRUP دارد ) سنگ بنای طراحی در متدولوژی های چابک است.

user Story ها ، جملات ساده ای هستند که از دید کاربر ، نیازمندی های سطح بالای ( و نه فنی) نرم افزار را مشخص می کنند.

 

نحوه طراحی :

روایت کاربر باید در قالب جمله های کوتاه و حتی الامکان غیر فنی و سطح بالا بیان شوند. همچنین ، اولیت بندی این روایت(در صورت امکان از جانب کاربر) اهمیت ویژه ای دارد.  سپس هزینه پشتیبانی (یا تولید) هر user Story توسط تیم یا فرد مسئول تخمین زده می شود.

اینکه یک userstory چقدر باید کوچک باشد (از نظر هزینه) بسته به اندازه Iteration ها در روال پیاده سازی سیستم است.

یک user story باید آنقدر کوچک باشد که در یک Iteration قابل پیاده سازی باشد.

قالب استاندارد user story ها به این صورت می باشد :

"As a <role>, I want <goal/desire> so that <benefit>"

این قالب به سادگی مشخص می کند که هر user story از دید کدام نقش در سیستم است و چه فوایدی برای سیستم دارد.

 

user story ها ، در مراحل بعدی تکمیل می شوند. البته تکمیل به معنی تغییر صورت user story نیست. به این معنی است که در مصاحبه های بعدی با کاربران ، فاز های طراحی و پیاده سازی ، جزئیات دقیق تری به این روایات اضافه می شوند و گاها با کمک flowchart ها و activity diagram ها شاخ و برگ بیشتری پیدا می کنند،

در مدل سنتی (بدون استفاده از ابزار های طراحی) برای هر user story یک کارت در نظر گرفته می شود که در روی آن کارت ، اصل روایت نوشته می شود و پشت آن توضیحات و جزئیات بیشتر.

 

در کنار User story دو مفهوم دیگر نیز بکار برده می شود : Epic و Theme

Epic:

یک UserStory بزرگ است که به علت بزرگی ، امکان پیاده سازی آن در یک Iteration وجود ندارد ، لذا در مراحل طراحی آن را به User story های کوچک تقسیم می کنند. برخی از منابع استفاده از Epic های تو در تو را نشانه اشتباه در انتخاب متودولوژی می دانند. اینکه سیستم آنقدر گسترده و پیچیده باشد که نیاز به چندین لایه تو در تو از Epic ها داشته باشد ، می تواند نشانه این باشد که برای پیاده سازی چنین سیستمی باید از متدلوژی های سنگین تر ( و نه چابک) استفاده کزد.

 

Theme :

مجموعه ای از User Story های مرتبط که برای طراحی release های بکار می روند. theme ها مشخص می کنند که در هر نسخه از نرم افزار ، کدام User Story ها باید تکمیل و تست شده باشند تا آن زیر سیستم برای کاربران قابل استفاده باشد. به عنوان مثال ، در یک سیستم مدیریت پروژه ، UserStory های تعریف افراد و تعریف پروژه در یک Theme قرار می گیرند. چرا که برای استفاده از زیرسیستم تعریف و اطلاعات پایه سیستم مدیریت پروژه ، تا زمانی که کاربر ها تعریف نشده باشند ، تعریف پروژه معنایی ندارد.

 

منابع :

http://www.agilemodeling.com/artifacts/userStory.htm

http://blog.assembla.com/assemblablog/tabid/12618/bid/5543/Do-s-and-Don-ts-for-User-Stories-Use-Cases-Scenarios.aspx

http://johnnyholland.org/2009/08/user-stories-a-strategic-design-tool/

http://en.wikipedia.org/wiki/User_story

  • فهیم آیت

متغیر ها در جاوا

فهیم آیت | دوشنبه, ۲۵ ارديبهشت ۱۳۹۱، ۰۶:۴۸ ق.ظ | ۴ نظر


این مطلب اختصاص داره به معنی متغیر ها در جاوا

 

اگر قبلا با زبان برنامه نویسی دیگه ای کار کرده باشید ، با مفهوم متغیر کاملا آشنا هستید.

به زبان ساده می شه متغیر رو به یک جعبه تشبیه کرد، یه جعبه با یک شکل خاص ، شکل خاص یعنی اینکه اگر یک جعبه برای یک پراید تولید شده ، نمی تونید یک پژو توش بگذارید!!

 

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

 

برای مثال :

int aNumber ;

یعنی یک متغیر تعریف کردید، گفتید که از جنس int هست (int مخفف Integer به معنی عدد صحیح) و نام aNumber رو براش انتخاب کردید.

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

 

نامی که برای متغیرتون انتخاب می کنید باید از قوانین نام گذاری در جاوا تبعیت کنه . (اگه با این قوانین آشنا نیستید این مطلب رو بخونید.)

 

استفاده از متغیر ها هم خیلی ساده است.

برای اینکه یک مقداری رو داخل یک متغیر بریزید ( یا به زبان حرفه ای تر ، یک مقدار رو به اون متغیر نسبت بدید یا assign کنید) ، کافیه از عملگر = استفاده کنید. برای این کار  (از چپ به راست) اول نام متغیر میاد ، بعد عملگر =  بعد عبارتی که قراره محاسبه بشه و حاصلش داخل متغیر ریخته بشه ، و در نهایت کاراکتر ; که نشون میده دستور ما تموم شده.

مثال :



aNumber = 12;

aNumber = 25+ (12+34)*2 ;

 

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

دقت داشته باشید که عملگر = ، به معنی تساوی نیست ، به معنی نسبت دادنه.

مثلا :

 

int a ;

int b ;

b = 12  ;

a = 34 ;

a = a + b ;

 

 

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

خطوط اول و دوم صرفا متغیر ها رو تعریف می کنند. خط سوم می گه 12 رو نسبت بده به b. یعنی از این به بعد b برابر است با 12.

خط چهارم هم ساده است.

به خط پنجم دقت کنید ، این همون نکته ایه که قبلا گفتم ، عملگر =  به معنی معادله یا تساوی نیست. عملگر = به این صورت عمل می کنه که اول عبارت سمت راست رو کاملا محاسبه می کنه ، مستقل از اینکه چه چیزی سمت چپه. یعنی حساب می کنه a + b  میشه 48 ( چون تا این لحظه  متغیر a  برابر با 34 بوده و متغیر b برابر با 12) بعد از این محاسبه ، مقدار بدست اومده رو به اون متغیری که سمت چپ عملگره (توی این مثال متغیر a) نسبت میده.

یعنی بعد از اجرا کردن این خطوط ، متغیر b برابر با 12 و متغیر a برابر با 48 خواهد بود.

فرض کنید که در ادامه دستورات قبل ، این دستور هم اضافه بشه :

a = a + 10 ;

بعد از اجرای این دستور متغیر a چه مقداری خواهد داشت ؟

58

 

 

  • فهیم آیت

نام گذاری در جاوا

فهیم آیت | دوشنبه, ۲۵ ارديبهشت ۱۳۹۱، ۰۶:۰۴ ق.ظ | ۰ نظر

نام گذاری در جاوا و تمام زبان های برنامه نویسی پیرو یک سری قوانین خاصه که توی این مطلب ، مهمترین قوانینی که باید رعایت بشه رو توضیح میدم.

 

البته دقت داشته باشید که اینها قوانین لازم الاجرای برنامه نویسی هستند، به این معنی که اگر این قوانین رعایت نشوند ، برنامه شما Syntax Error خواهد داشت و قابل کامپایل و اجرا نخواهد بود. در کنار این قوانین ، یک سری الگو ها تعریف شده که اجباری در رعایتشون نیست ، اما رعایت اونها باعث می شه برنامه بهتری داشته باشید. اونها قوانین هستند که مرز بین برنامه نویس و برنامه نویس حرفه ای رو مشخص می کنند.

در مورد اون قوانین توی بخش برنامه نویس های حرفه ای بیشتر توضیح می دم.

 

قوانین نام گذاری :

کاراکتر های مجاز برای استفاده در نام عبارت اند از : اعداد ، حروف (a تا z) ، کاراکتر زیرخط (_ یا Underline) و کاراتر $ . از کاراکتر های حرفی سایر زبان ها (مانند فارسی ) هم می شه استفاده کرد ولی به شدت توصیه میشه که اینکار رو نکنید.

هر نامی که انتخاب می کنید (نام متغیر ، متد ، کلاس و غیره) باید با یک کاراکتر مجاز غیر عددی شروع بشه

بدیهیه که نام نمی تونه شامل فاصله یا نقطه باشه.

نامی که انتخاب می کنید نباید توی لیست کلمات کلیدی باشه ( لیست کلمات کلیدی)

نام ها در جاوا و اکثر زبان های پیشرفته ، case sensitive هستند . یعنی ALI و ali دو نام کاملا متفاوت هستند.

 

  • فهیم آیت