تبلیغات
آکنده
آکنده ،،،،
در اندیشه پرواز هم نباش، پرنده هم مردنی است

شی و ساختار و دسته[توسعه نرم‏افزار , ]

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

شی شی است.

در عوض مشخص میکنیم چگونه شی را مشخص میکنیم، بکار میبریم.

برای اشیا ساختار تعریف میکنیم.

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

سه نکته را در نظر داشته باشید:

۱. گروهی از اشیا میتوانند دارای ساختار مشابه باشند.

۲. هر چه بیشتر از ویژگیهای اشیا صرف نظر صرف نظر کنیم، اشیا در دسته های عامتری قراری میگیرند و هر چه بیشتر بر روی ویژگیها تاکید کنیم دسته ها خاصتر میشود.

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

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

نکات ۳ و ۴ دو دلیل برای دسته بندی اشیا است، پس

دسته های اشیا را مشخص میکنیم و به جای ساختار هر شی ساختار دسته را مشخص میکنیم

علت استفاده از کلمه class(دسته) در زبانهای برنامه نویسی نیز به همین خاطر است.

سلسله مراتب اشیا(Class Hierarchy):

بر اساس نکته ۱ و ۲ در هنگام تعریف دسته ها، برای دسته ها سلسله مراتب در نظر میگیریم، یعنی دسته هایی تعریف میکنیم که در قالب یک دسته عام تر قرار میگیرند و برعکس میتوان گفت دسته هایی تعریف میکنیم که خود به چندین دسته خاصتر تقسیم میشوند.

سلسله مراتب اشیا را مشخص میکنیم

در یک سلسله مراتب دسته های خاصتر دارای جزئیات بیشتر نسبت به دسته های عامتر هستند.

دسته های مبنا(Base Classes):

به دسته ای که دسته های دیگر بر مبنای آن قرار دارند(یعنی دسته های دیگر با افزودن جزئیات به آن ساخته شده اند) دسته مبنا گفته میشود.

منبعد به دسته های عامتر دسته پایه میگوئیم.

دسته های مشتق شده(Derived Classes):

به دسته ای که با افزودن بعضی جزئیات به دسته ای مبنا ساخته شده است، دسته مشتق شده گفته میشود.

منبعد به دسته های خاصتر دسته مشتق شده میگوئیم.

هر دسته مشتق شده فقط از یک دسته میتواند مشتق شود.(البته این یک دیدگاه است و بعضی از زبانهای برنامه نویسی امکان مشتق کردن از بیش از یک دسته پایه را فراهم میکنند به این اشتباه مهلک ارث بری چندگانه(Multiple Inheritance) میگویند.)

ارث بری(Inheritance):

ساختار دسته های مشتق شده دارای جزئیات ساختار پایه نیز هستند به این وضعیت ارث بری میگویند و  میگویند که دسته مشتق شده ساختار دسته پایه را به ارث میبرند.

دسته های عینی(Concrete Classes):

به دسته هایی که اجزا آن به حدی مشخص هستند که میتوان شی مشخصی را از آن دسته متصور شد دسته های عینی(concreate classes) گفته میشود 

دسته های مجرد(Abstract Classes):

یه دسته هایی که نمتوان از آنها شی ای متصور شد دسته های مجرد(Abstract Classes) گفته میشود.

دسته تمام اشیا

یک دسته کاملاً عام به نام دسته تمام اشیا وجود دارد و سایر دسته ها از آن مشتق شده اند.

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

 

 

تا اینجا خیلی به جزئیات ساختار دسته ها اشاره کردیم، در ادامه در مورد جزئیات ساختار دسته ها بحث را ادامه میدهیم، موافقید؟؟

 

منتظر نظرات، دیدگاههای شما هستم و همچنین در مورد مطالب مطرح شده پاسخگوی سوالات.

تاریخ فرستادن:دوشنبه 18 مهر 1384، نویسنده: فرشید کزازی (همیشه همینه)
تعداد بازخوردها: ، شما هم دیدگاه خود را ارائه کنید

چند تعریف پایه شیگرایی[توسعه نرم‏افزار , ]

شیگرایی(Object Oriention)

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

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

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

شی (موجود) (Object) :

هر چیزی را که بتوانید در نظر بگیرید، یک شی است. البته منظور صرفاً اشیا فیزیکی نیست مثل یک ایده، یا یک مفهوم.

هر شی دو بعد مهم دارد :

1. وجود : هر شیی وجود دارد.

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

2. ساختار(structure) : مجموعه ای از ویژگیها و خصائص که موجب تمایز بین یک شی با اشیا دیگر میشود.

ساختار (Structure):

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

نکته خیلی مهم در مورد تعریف ساختار اینست که ساختار مشخص میکند که شی چه ویژگیهایی دارد، اما مشخص نمیکند که مقدارهر ویژگی چیست.

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

رویه (Interface):

به ساختار بیرونی یک شی رویه(interface) گفته میشود. به ساختار دورنی پیاده سازی رویه شی گفته میشود.

دسته (Class):

در طراحی شیگرا اشیایی که دارای ساختار مشابه(با صرفنظر کردن از بعضی ویژگیها) هستند را در یک دسته(class) قرار میدهند و برای تمام آنها از یک تعریف ساختار استفاده میکنند و به اشیایی که درون یک دسته قرار میگیرند نمونه(Instance) میگویند.

مخفی کردن اطلاعات (Information Hiding):

غیر قابل دسترسی کردن ساختار درونی یک شی از اشیا بیرونی را مخفی کردن اطلاعات(Information Hiding) میگویند.

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

کپسوله کردن(Encapsulation):

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

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

تاریخ فرستادن:پنجشنبه 14 مهر 1384، نویسنده: فرشید کزازی (همیشه همینه)
تعداد بازخوردها: ، شما هم دیدگاه خود را ارائه کنید

الگوی Late-Update[توسعه نرم‏افزار , ]

الگوی Late-Update یک الگوی کدنویسی است که از خودم در کردم و میتواند خیلی پرکاربرد باشد و احتمالاً هم، تاکنون از آن استفاده کردید و من صرفاً اکنون یک نام برای آن لحاظ کرده ام.

ایده اصلی

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

شرایط کاربرد:

در حالتی که مقدار یک ویژگی به مقدار چند ویژگی وابسته باشد یا اینکه کلاً مقدار یک ویژگی برآیند مقدار چند ویژگی دیگر باشد و با تغییر مقادیر وابسته-به مقدار وابسته باید ارتقا یابد و دو حالت زیر برقرار باشد:

تغییر در مقدارهای ویژگی وابسته-به متداول باشد ویا تغییرات به صورت دسته ای(batch) اعمال میشوند.

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

مزایا:

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

حداقل بازسازی مقدار وابسته - ویژگی وابسته فقط در اولین دستیابی بازسازی میشود و نه در هر تغییر مقدار ویژگی وابسته-به. (توجه داشته باشید در یک الگوی اشتباه و متداول مقدار ویژگی وابسته هر بار از اول بر اساس ویژگیهای وابسته-به بازسازی میشود. و این روش در مقابل آن فوق العاده موثر است.)

معایب:

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

روش:

1. هر بار که مقدار وابسته-به تغییر کرد یک flag را تنظیم میکنید تا معین کنید که مقدار ویژگی وابسته غیر معتبر شده است.(مثلاً میتوانید مقدار وابسته را مساوی null ست کنید.)

2. در get accessor ویژگی وابسته flag فوق الذکر را بررسی کنید و در صورتی که برقرار بود مقدار ویژگی وابسته را از نوع بازسازی میکند و cache میکند در غیر اینصورت مقدار cache شده بر گردانده میشود.

از بابت عدم استفاده از model های نمایشی و ارائه مثال عذر میخواهم، در آینده حرفه ای تر مینویسیم.

تاریخ فرستادن:شنبه 9 مهر 1384، نویسنده: فرشید کزازی (همیشه همینه)
تعداد بازخوردها: ، شما هم دیدگاه خود را ارائه کنید

مقدمه ای بر برنامه نویسی همروند[توسعه نرم‏افزار , ]

Concurrent Programming

 

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

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

حال : در حال حاضر امکانات Multi Threading بصورت کتابخانه های مستقل از زبان برنامه نویسی موجود است و برای مثال شما میتوانید در .Net بسادگی قسمتهایی از برنامه را بصورت موازی اجرا کنید و اجرای همزمان را مدیریت کنید.

آینده : امکانات برنامه نویسی همروند بطور درون-ساخت در زبانهای برنامه نویسی فراهم میشود و دیگر برنامه نویس با مفاهیمی مثل thread بطور مستقیم درگیر نخواهد بود. در سی شارپ 3 مایکروسافت برنامه نویسی همروند معرفی میشود که مایکروسافت با پروژه های تحقیقاتی مثل Concurrent C# و سی امگا طراحی زبان سی شارپ 3 را به وجهی عالی انجام داده است(من برای انتشار نسخه 3 سی شارپ لحظه شماری میکنم چون علاوه بر برنامه نویسی همروند تغییرات اساسی دیگری در فرایندهای برنامه نویسی ایجاد میکند که فوق العاده جذاب هستند.)

دو ویژگی مهم :

  • مدل اختصاصی طراحی و برنامه نویسی
    برنامه نویسی همروند مدل برنامه نویسی خاص خود را دارد و دقیقاً در نقطه مقابل برنامه نویسی ترتیبی(Sequential) قرار دارد.(توجه داشته باشید که برنامه نویس شیگرایی فعلی نیز نوعاً ترتیبی است چون در هر لحظه کنترل اجرای برنامه در اختیار یک شی قرار دارد.)
    با توجه به این نکته اشیا متودهای همدیگر را صدا نمیزنند، بلکه نحوه عملکرد(اجرا) اشیای دیگر را با تغییری که در محیط اطراف خود ایجاد میکنند تغییر میدهند.
  • تاثیر بر مفاهیم شیگرایی
    من از دیرباز اشیا را به سه دسته جامد، زنده، هوشمند تقسیم بندی میکنم، با استفاده از برنامه نویسی همروند امکان تعریف اشیا زنده وجود دارد، چون همانطور که از تعریف این اشیا بر می آید شی زنده شئی است که بطور مداوم فعال است و اجرا میشود و شی هوشمند نیز شئی زنده است که در حین فعالیت(اجرای مداوم) در ساختار خود تغییر ایجاد میکند.
    در مورد این مقوله در اولین پستی که راجع به شی گرایی بفرستم بیشتر صحبت میکنم.
تاریخ فرستادن:شنبه 9 مهر 1384، نویسنده: فرشید کزازی (همیشه همینه)
تعداد بازخوردها: ، شما هم دیدگاه خود را ارائه کنید

روش Design By Code[توسعه نرم‏افزار , ]

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

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

۱. دستها باید کد بنویسند.(فکرکردن توسط مغز و ارسال پیامهای حرکتی از مغز به دست زمانبر است.)

۲. حجم تغییرات زیاد است.

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

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

 

 

ادامه دارد....

تاریخ فرستادن:شنبه 9 مهر 1384، نویسنده: فرشید کزازی (همیشه همینه)
تعداد بازخوردها: ، شما هم دیدگاه خود را ارائه کنید

 

درباره فرشیدکزازی

 
 

هیچ چیز قابل گفتنی درباره خودم وجود نداره.
کاری داشتید به farshidkazazi@gmail.com پیام بفرستید.

 

 

درباره آکنده

 
 

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

** اسم وبنوشت هیچ معنای خاصی ندارد، اولین کلمه ای بود که موقع ثبت نام به ذهنم رسید.

دسته بندی نگاره ها:
عمومی (7)
توسعه نرم‏افزار (13)

 

 

وبنوشتهای دیگر

 
  زیر چتر باران
واژگان مدیریت دانش
 

 

ابزارها

 
 
جستجو در بلاگ


برای دریافت نگاره ها از طریق email با وارد کردن آدرس email نام‏ نویسی کنید:
بایگانی گذشته
مرداد 1385 (2)
تیر 1385 (3)
اردیبهشت 1385 (1)
بهمن 1384 (4)
آذر 1384 (1)
آبان 1384 (4)
مهر 1384 (5)