PDA

View Full Version : روش کدنویسی تکاملی!!



eshpilen
یک شنبه 26 دی 1389, 21:31 عصر
گفتم این بار این تاپیک رو در این تالار بزنم بلکه جدی تر گرفته بشه و پاسخهای حرفه ای تری داده بشه. وگرنه ما اکثرا در تالار عمومی میپلکیم و آدم فکر میکنه اونجا رو افراد خیلی بیشتری بازدید میکنن :لبخند:

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

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

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

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

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

یه مثال دیگه ولی جزیی تر و محدودتر میزنم تا بهتر درک کنید منظورم چیه.
بطور مثال وقتی کلاسی رو طراحی میکنم، اول تمام متدها و متغییرهاش رو بصورت Public تعریف میکنم و وقت و انرژی روی این نمیذارم که فکر و دقت کنم و بین اونها تمایز بصورت Private و Protected و Public قرار بدم. چون کلاس تا از صفر بخواد به تکامل نهایی خودش برسه، تغییرات زیادی میکنه و اگر بخوام حین کدنویسی سطح دسترسی ها رو هم تعیین بکنم بارها مجبور میشم حیطهء دسترسی یک متغییر یا متد رو تغییر بدم یا این متدها و متغییرها به کلی حذف میشن یا چیزهای دیگری جاشون رو میگیرن. بنابراین، نهایتا که کلاس از نظر متدها و پارامترهاشون و متغییرهای داخلی و و اینترفیس خارجی تقریبا به ثبات و شکل نهایی خودش رسید، میتونم چیزهایی مثل سطح دسترسی هر متد و متغییر رو مشخص کنم. فکر میکنم از ابتدا تعیین کردن تمامی جزییات و مقوله های شیء گرایی، بهینه و عاقلانه نیست، چون در این صورت کارهای تکراری و اضافی زیادی انجام میشن.

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

vcldeveloper
یک شنبه 26 دی 1389, 23:24 عصر
اینا رو پرسیدم چون خودم شخصا مثلا چند تجربهء پروژهء عملی که داشتم، از ابتدا بصورت شیء گرا نوشتن بنظرم سخت و غیربهینه میاد، چون با شیء گرایی باید خیلی چیزها رو قبل از اینکه جزییات برنامه دستت بیاد و ساختار نهاییش برات به تجربه روشن بشه، طراحی کنی و وقت و انرژی زیادی رو روی اصول و فروع و کدنویسی اضافه تر برای شکل دادن این ساختارها بکنی. درحالیکه تا برنامه به جایی برسه و تقریبا ساختار نهایی خودش رو بدست بیاره، و در همون جزییات طراحی کلاسها و متدها و کدنویسی، بارها و به مقدار زیاد تغییرات جزیی و کلی میکنه که باعث میشه آدم مجبور باشه دوباره کدهای اضافهء مربوط به ساختار مهندسی نرم افزار و شیء گرایی و تعریف متد و کلاس و Public و Private و غیره رو ویرایش کنه یا کلا از نو بنویسه.
و اینجا ست که refactoring مطرح میشه! اشکالی نداره که شما مرتبا ساختارهایی رو تغییر بدید، به خصوص اگر این تغییرات در interface ها نباشه. میشه گفت به نوعی، شما باید در طول توسعه پروژه تون مرتبا این تغییرات رو انجام بدید. این کار باعث میشه که کدتان به تدریج بهینه تر بشه. البته گفتم، در هنگام تغییر، باید روی تغییر در interfaceها خیلی حساس باشید، چون تغییر در interface معمولا موجب اشکال در سایر کلاس ها و ماجول های وابسته به کد شما میشه. تغییرات، بخصوص اگر Unit Test های مناسبی داشته باشید، خیلی هم خوب هستند. اصلا در روش های Test-Driven، شما مسائل را با ساده ترین و گاها ابتدایی ترین راه حل هایی که به ذهن تان میرسه، حل می کنید، تا فقط تست مربوطه pass بشه. سپس مرتبا با تغییر در کدها و refactor کردنشان، اونها را بهینه تر می کنید، و البته بعد از هر تغییر هم تست هایتان را به صورت خودکار اجرا می کنید، تا مطمئن بشید تغییرات شما موجب خراب شدن بخش یا بخش هایی از کد نشده.

eshpilen
یک شنبه 26 دی 1389, 23:54 عصر
قربونت میشه یخورده سطح دیپلم بگی؟ من سواد مواد درست و حسابی ندارما. یعنی دانشگاه رو نصفه خوندم (کاردانی بودم) ولی عوضش تا دلت بخواد علاقه و پشتکار دارم (فکر میکنم استعداد هم داشته باشم :لبخند:).
میشه صریح بگید آیا اشکالی داره که بخشهای مختلف کارایی برنامه رو اول بصورت غیر شیء گرا بنویسیم و در مرحلهء نهایی (پس از تست عملی که الگوریتمش کار میکنه و کامل و دقیق هست) اون رو به شکل شئ گرا دربیاریم؟
یعنی اصلا من فکر میکنم این روش بهتر باشه.
البته این ریفکتور مکتور که میگی قبلا خوندم انگار :متفکر:

vcldeveloper
دوشنبه 27 دی 1389, 12:04 عصر
من سواد مواد درست و حسابی ندارما. یعنی دانشگاه رو نصفه خوندم (کاردانی بودم)
نگران نباش، من تا همون حد کاردانی هم مدرک تحصیلی دانشگاهی مرتبط با کامپیوتر و نرم افزار ندارم.


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

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


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

eshpilen
سه شنبه 28 دی 1389, 11:21 صبح
اینا که شما میگید درسته بنظرم.
اما مطمئن نیستم همهء پارامترها یا پارامتر کافی برای تصمیمگیری درمورد روش باشه. ابهام دارم. حتی درمورد اینکه خودم واقعا چیکار میکنم و دیگران چکار میکنن و اصول رسمیش چیه. اصلا فکرش رو میکنم میبینم شاید منم واقعا کار غیرعادی ای نمیکنم. چون چیزهایی که میگم اول غیرشیء گرا بنویسم درواقع اغلب تمام بخشهای داخلی یک کلاس هستن! یعنی چون داخل خود کلاس کار میکنم، فکر میکنم دارم غیر شیء گرا مینویسم، فقط به این خاطر که از ابتدا اون رو کاملا در چهارچوب نهاییش قرار ندادم و عنوان کلاس نداره.
موقعی که شما داخل خود یک کلاس کد مینویسید، تقریبا شبیه برنامه نویسی ساخت یافتهء تابعی هست دیگه! درسته؟ چون اغلب فقط تابع تعریف میکنید و یکسری متغییر. حالا اسم این تابعها اونجا متد هست و اسم متغییرها فیلد و غیره، ولی ماهیت و شکل کدنویسیش تقریبا همون برنامه نویسی غیرشیء گرا هست.

eshpilen
پنج شنبه 30 دی 1389, 21:13 عصر
نظری نداشتید؟