PDA

View Full Version : برنامه نویسی رویه گرا در زبانهایی که از این پارادایم پشتیبانی نمیکنند!



freeman99
جمعه 15 اسفند 1393, 14:31 عصر
مهندس خودت تاپیکم رو قفل کردی مجبور شدم بخاطر این مطلب تاپیک جداگانه بزنم :لبخند:


شما اگه تونستی تو #C یک خط کد بدون شئ گرایی بنویسی جایزه داری.
خب مثلا میخوام یه free standing function تعریف کنم، به زبان ساده همون توابع مستقل/خارج از کلاس، میام و بعنوان یک تابع استاتیک توی یک کلاس ساده و تک عضوی بعنوان wrapper اون رو پکیج میکنم. میتونم اصلا اسم کلاس رو هم با اسم تابع یکسان یا مشابه بگیرم یا از یک ترفند دیگری استفاده کنم. بعدم که فراخوانی کاری نداره: func:my_func()‎.
میتونم هم اصلا تمام یا تعدادی از توابع خودم رو تحت یک کلاس واحد ببرم که کارم راحتتر بشه.
این ظاهرش شیء گراست فقط! غیر از اینه؟ به صرف اینکه ما کارمون رو تحت نام و شکل کلاسها انجام دادیم که نمیشه شیء گرایی واقعی! درواقع تفکر و روش ما هنوزم رویه گراست.
همینطور در موارد دیگری هم میشه از همین ترفندها پیاده کرد. درسته البته که کلاسهای خود دات نت شیء گرا هستن، ولی استفاده از اجزای کتابخانه و فریمورکی که شیء گراست با اینکه خودت شیء گرا فکر کنی و ساختار کلی برنامت و کدهای خودت هم بر این اساس باشه مقدار زیادی تفاوت داره. نه؟
من میخوام بگم برنامه نویس اگر بخواد میتونه خیلی از این مسائل رو دور بزنه. هرچند کارش کمی سخت و بیریخت و احتمالا حتی بدتر از رویه گرایی معمولی میشه.
یارو اومده مثلا اینترفیس تعریف کرده، برنامه نویس میتونه بیاد یکسری متدهایی رو که توی اینترفیس اجبار شده حتما باید تعریف و پیاده سازی بشن بجاشون بقول معروف یک stub (تابع خالی) بذاره یا یه چیزی که بهرحال ماست مالیش کنه (همهء منطق و اصول لازم برای اون عملیات رو که هدف و توصیهء طراح اینترفیس بود پیاده سازی نکنه) در عین حالی که در برنامهء خودش و در حالت عادی معلوم نمیشه و مشکلی پیش نمیاره اما طبق اصول و هدف طراح و شیء گرایی نبوده و بعدا میتونه از اون نظر مشکل ساز بشه طبیعتا.
همینطور یک مسائلی مثل استفاده از متغییرهای گلوبال در داخل کلاس که فکر نمیکنم به هیچ وجه با اصول شیء گرایی سازگار باشه (من خودم این کار رو در برنامم در PHP کردم بخاطر اینکه یکسری کلاس از قبل داشتم که میخواستم اونا رو سریع وصله و پینه کنم و کارکردشون رو گسترش بدم، ولی نه با تقید به شیء گرایی). البته حضور ذهن ندارم در سی شارپ هم میشه و چطور در داخل کلاسها از متغییرهای گلوبال استفاده کرد، ولی بهرصورت احتمال زیاد به یک صورتی و با یک ترفند دیگری هم که شده میشه مشابهش رو انجام داد.

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

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

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

freeman99
جمعه 15 اسفند 1393, 16:53 عصر
تازه تمام متدها و متغییرهای کلاسها رو هم public تعریف میکنیم تا بدون هیچ قاعده و اصول و محدودیتی بتونیم از هر کجا دستکاری و استفاده کنیمشون! به این شکل به برنامه نویسی رویه گرا بیشتر نزدیک میشیم!!
بقول یارو میگه هیچ آدابی و ترتیبی مجوی، هرکاری میخوای بکن :لبخند:
آخه اینکه دیگه نشد شیء گرایی! فقط اسمش شیء گراست.
حالا باز بگو یک خط هم نمیشه کد رویه گرا نوشت! من میگم یه کاری میکنم که یه خط هم کد شیء گرا نباشه :بامزه:
اصلا میخوام یه فریمورک برنامه نویسی رویه گرا برای سی شارپ درست کنم :قهقهه:

Veteran
جمعه 15 اسفند 1393, 19:04 عصر
دلت خوشه خدایی :قهقهه:

MMSHFE
شنبه 16 اسفند 1393, 08:12 صبح
خدمت جناب استارتر عزیز عرض میکنم که این وسط شما درحقیقت دارین سر خودتون رو کلاه میگذارین نه زبان برنامه نویسی رو. بله این روشی که شما انجام میدین، کار میکنه منتها در اصل دارین شئ گرا مینویسین. استفاده از متدهای استاتیک بصورت زیاد و افراطی توی اصول شئ گرایی ابداً توصیه نمیشه ولی ممنوع نیست. درسته که الان فقط صدا زدن متدها تغییر کرده و منطق همون منطق رویه گراست ولی باز هم به کمک شئ گرایی، مزایایی مثل AutoLoad و... در اختیارتون قرار میگیره و نمیتونید ادعا کنید کدتون شئ گرا نیست چون کدتون رو داخل کلاس نوشتین (هرچند کلاس خیلی مسخره ایه). اینکه گفتم اگه تونستی تو #C کد رویه گرا بنویسی جایزه داری هم منظورم این بود که بتونی دقیقاً مثل برنامه نویسی رویه گرا، یک تابع بیرون از کلاس تعریف کنی و صداش بزنی. کدی که شما نوشتی رویه گرا نیست بلکه از امکانات شئ گرایی به شکل ناشیانه ای استفاده کرده.

در پایان من هم با سبحان موافقم: دلت خوشه خدایی

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

freeman99
شنبه 16 اسفند 1393, 11:04 صبح
مردم دنبال اینن که روزبروز امکانات زبانهای برنامه نویسی بیشتر بشه و کار و شغلشون راحتتر از قبل بشه و دنبال UML و... هستن اونوقت جنابعالی دنبال اینی که یک زبان برنامه نویسی مدرن رو مجبور کنی با همون ساختار فسیل شده کدنویسیت کار کنه. علتش فقط یه چیزه عزیزم: از تغییر میترسی.
این بخشش دیگه از اون حرفا بود :قهقهه:
بارها توضیح دادم که چرا من فعلا احساس نیازی به شیء گرایی ندارم. گفتم که این شغل من نیست و برنامه هایی که نیاز میشه و مینویسم اغلب کوچک و موردی هستن و عجله زیادی هم در نوشتن اونا دارم، وقت ندارم برم بخاطر چیزی که تاثیر چندانی در چنین برنامه هایی نداره یادگیری و تجربه داشته باشم و بشینم کلی وقت و انرژی صرف کنم واسه هرکدام از چنین برنامه هایی شیء گرایی اصولی طراحی کنم.
من از تغییر نمیترسم، بلکه شما از واقعیت هایی که مطابق خوشایند و دیدگاههای ساده شده و مطلق شدهء خودتون باشه میترسید!
چیزهای سخت تر و طولانی تری از شیء گرایی رو رفتم یاد گرفتم و کم و بیش استفاده هم کردم، چرا، چون اونا رو اساسی و ضروری دیدم. مثلا اگر شما امنیت و رمزنگاری بلد نباشی نمیتونی برنامه هایی با امنیت بالا بنویسی. این اهمیتش در دید من از شیء گرایی بیشتره، چون بدون شیء گرایی هم میشه الگوریتم ها و برنامه های امن نوشت (دست کم از اون نوع برنامه های کوچک و موردی که من مد نظر دارم) ولی بدون دانش و بینش و توانایی در امنیت و رمزنگاری مدرن شما نمیتونید برنامه هایی با امنیت خوف بنویسید، حالا هرچی شیء گرایی عالی و نبوغ آمیز و آخر استاندارد بلد باش و استفاده کن. مشکلی هم که در برنامه های خیلی ها دیدم همینه که ظاهر دارن، شیء گرایی و استانداردهاشون هم بد نیست، اما باطنشون که به همین الگوریتم ها و مسائل ختم میشه و اون منطق و کد و الگوریتم هایی که کار نهایی رو انجام میدن از نظرهای مختلف مثل همین امنیت و رمزنگاری اصولی ضعیف هستن؛ البته از لحاظ دقت منطقی هم خیلی وقتا مشکل و باگ دارن. مثلا همون مسائل همزمانی و قفل خیلی ها نمیدونستن و در برنامه هاشون استفاده نمیکردن، و همین الانش هم درک و احاطهء کامل و مهارت کافی خیلی ها درش ندارن. ولی چیزهایی امثال شیء گرایی تابلوی تبلیغاتش همه جا هست و فعالیت روش زیاده و من نیازی به آموزش و تاکید در این زمینه نمیبینم چون نه تجربهء عملی زیادی دارم و نه مسئلهء آنچنان پیچیده و ناشناخته ای است که نیاز به دخالت و کمک امثال بنده باشه. منبع و آموزش و اطلاعات کامل و دقیق و خوب براش زیاده، تجربه و کدش راجع بهش زیاده.

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

freeman99
شنبه 16 اسفند 1393, 11:16 صبح
آدم توانایی «نه گفتن» داشته باشه خیلی خوبه در زندگیش.
منم از اون آدمام که به یه دنیا راحت میگم نه!
همه یه راهی رو برن norm اشون یه چیزی باشه، من راه خودم رو میرم، روش زندگی خودم رو انتخاب میکنم، هرجور خودم حال میکنم زندگی میکنم.
حالا شما خودت رو بکش بگو شیء گرایی، میگم نیاز ندارم، استفاده نمیکنم، به خودم زحمت نمیدم. میگی از تغییر میترسی، ولی اینطور نیست. خودت توی درک یه واقعیت به این روشنی و سادگی مشکل داری و نمیتونی هضمش کنی، بعد شعار میدی و به آدمی مثل من برچسب میزنی. وقتی یه چیزی رو نمیتونی ثابت کنی، پس دیگه اتهامش رو نزن ادعاش رو نکن. منم برام جای تعجب داره که دلایلی که میارم بنظر خودم روشن و منطقیه، چرا امثال شما درک نمیکنن پس! یه مسئلهء کوچک رو اینقدر گنده کردید. بابا دارم برنامه مینویسم حالا شیء گرایی استفاده نکنم استانداردهای روز رو استفاده نکنم مگه آسمون به زمین میاد گناه کبیره شده وحی منزل بوده! وقت ندارم خب حس نیاز نمیکنم علاقه ندارم بنظرم فعلا برام اونقدری کاربرد و بازدهی نداره که به خودم زحمت بدم. همین! وگرنه والا بلا واسه آدمی مثل من یادگیری و تغییر در چنین زمینه هایی کار ترسناکی نیست دلیلی هم نداره بدم بیاد. میگی زیاد وقت نمیبره زیاد سخت نیست (بهرحال بنظر من استفادش توی برنامه های کوچک فکر نمیکنم درمقابل بازدهی ای که داره صرف بکنه و جبران وقت و انرژی کارهایی مثل کلاس طراحی کردن و کد اضافه نوشتن براش رو داشته باشه)، میگم من همین الان از صبح اینقدر مقاله ویکیپدیا و بحثهای تخصصی در http://crypto.stackexchange.com باز کردم مونده روی دستم با عجله و حداکثر قدرت دارم سر کار تا رئیسم نیومده همه رو میخونم این tab هاش همینطور توی مرورگر باز مونده از اینور یکی میخوندم میبندم از اونور چند تا لینک دیگه در همین حین باز کردم اضافه میشه بهش! الان اینا واسه من خیلی جذاب تر و کاربردی تره تا شیء گرایی. قدرت زیادی در این مباحث میبینم. برعکس شیء گرایی، جایی شما این مباحث رو نمیبینید تبلیغ و اشاره بکنن و بگن یاد بگیرید استفاده کنید، و اصولا افراد کمی سمت این مباحث میرن و نسبت به مباحث روتین و بازاری مثل شیء گرایی، افراد خیلی کمی بلد هستن، ولی اینا خیلی پیشرفته هستن و قدرت مخوفی توشون هست (هرچند شاید در زمینهء شغل و درآمد در خیلی موارد در مقابل زحمت و هزینهء یادگیری و استفادشون صرف نکنن).
الان یدونه مقاله راجع به طرز کار دریل بخونم فکر کنم برام کاربردی تر باشه تا شیء گرایی!!
آدم چرا باید دنبال چیزی بره که هنوز براش کاربرد آنچنانی نداره، وقتی اینقدر مباحث جالب و جذاب و کاربردی دیگر وجود دارن؟
چشم هروقت منم جدا خواستم وارد بازار کار برنامه نویسی بشم، بیشتر روی شیء گرایی و اینا کار میکنم! البته چون فکر میکنم به موقعش میتونم با سرعت و راحتی زیادی توش راه بیفتم (بخصوص که با تئوری و پایش بنظر خودم بقدر کافی آشنایی دارم) اینه که زیاد مهم و ضروری نمیبینم که پیشاپیش کار کنم، وگرنه من همیشه یک نیم نگاهی به این دارم که بالاخره این همه سرمایه گذاری وقت و انرژی و سواد و توانایی خودم در برنامه نویسی رو تجاری و منبع درآمد خودم بکنم و ممکنه یه زمانی شغل اصلیم بشه.

MMSHFE
شنبه 16 اسفند 1393, 12:22 عصر
خوب اگه ضرورتی به استفاده از شئ گرایی نمیبینید یا در همین حد کار شما رو راه میندازه که static کار کنید، نیازی به جار و جنجال و من فلانم و من بهمانم نداره. شما تاپیک زدین گفتین به این روش میشه توی زبانهایی که شئ گرایی اجبار هست، رویه گرا کار کرد و من هم گفتم این روش، رویه گرا نیست چون طبق تعریف، برنامه نویسی رویه گرا یعنی برنامه نویسی بدون کلاس و حتی وجود کلاس با متدهای تماماً استاتیک هم شئ گرایی محسوب میشه و شما کار خاص و پیچیده ای نکردین که بیاین تاپیک بزنین بگین میشه توی این زبانها رویه گرا نوشت! درمورد بقیه مباحث هم توی تالار جای صحبتش نیست و درصورت درج پستهای غیر مرتبط، مطابق قوانین اقدام به حذف پستها و در مرحله بعد، بستن تاپیک خواهد شد.

MMSHFE
شنبه 16 اسفند 1393, 12:27 عصر
حالا شما خودت رو بکش بگو شیء گرایی، میگم نیاز ندارم، استفاده نمیکنم، به خودم زحمت نمیدم.
نه من خودم رو نمیکشم. شما گفتین این روش جواب میده من هم گفتم شما چه بخواین چه نخواین توی همین روش هم دارین شئ گرا کار میکنین. سبک کدنویسی شما هم برام مهم نیست. من مطابق وظیفه ای که دارم، اصول برنامه نویسی صحیح رو به همه کسانی که درقبالشون مسئولیت دارم (مثل اعضای این تالار یا کسانی که ازم سؤال میپرسن) میگم. دیگه اینکه میخواد استفاده کنه یا نه به خودش مربوطه.

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

تاپیک قفل شد.