freeman99
جمعه 15 اسفند 1393, 15:31 عصر
مهندس خودت تاپیکم رو قفل کردی مجبور شدم بخاطر این مطلب تاپیک جداگانه بزنم :لبخند:
شما اگه تونستی تو #C یک خط کد بدون شئ گرایی بنویسی جایزه داری.
خب مثلا میخوام یه free standing function تعریف کنم، به زبان ساده همون توابع مستقل/خارج از کلاس، میام و بعنوان یک تابع استاتیک توی یک کلاس ساده و تک عضوی بعنوان wrapper اون رو پکیج میکنم. میتونم اصلا اسم کلاس رو هم با اسم تابع یکسان یا مشابه بگیرم یا از یک ترفند دیگری استفاده کنم. بعدم که فراخوانی کاری نداره: func:my_func().
میتونم هم اصلا تمام یا تعدادی از توابع خودم رو تحت یک کلاس واحد ببرم که کارم راحتتر بشه.
این ظاهرش شیء گراست فقط! غیر از اینه؟ به صرف اینکه ما کارمون رو تحت نام و شکل کلاسها انجام دادیم که نمیشه شیء گرایی واقعی! درواقع تفکر و روش ما هنوزم رویه گراست.
همینطور در موارد دیگری هم میشه از همین ترفندها پیاده کرد. درسته البته که کلاسهای خود دات نت شیء گرا هستن، ولی استفاده از اجزای کتابخانه و فریمورکی که شیء گراست با اینکه خودت شیء گرا فکر کنی و ساختار کلی برنامت و کدهای خودت هم بر این اساس باشه مقدار زیادی تفاوت داره. نه؟
من میخوام بگم برنامه نویس اگر بخواد میتونه خیلی از این مسائل رو دور بزنه. هرچند کارش کمی سخت و بیریخت و احتمالا حتی بدتر از رویه گرایی معمولی میشه.
یارو اومده مثلا اینترفیس تعریف کرده، برنامه نویس میتونه بیاد یکسری متدهایی رو که توی اینترفیس اجبار شده حتما باید تعریف و پیاده سازی بشن بجاشون بقول معروف یک stub (تابع خالی) بذاره یا یه چیزی که بهرحال ماست مالیش کنه (همهء منطق و اصول لازم برای اون عملیات رو که هدف و توصیهء طراح اینترفیس بود پیاده سازی نکنه) در عین حالی که در برنامهء خودش و در حالت عادی معلوم نمیشه و مشکلی پیش نمیاره اما طبق اصول و هدف طراح و شیء گرایی نبوده و بعدا میتونه از اون نظر مشکل ساز بشه طبیعتا.
همینطور یک مسائلی مثل استفاده از متغییرهای گلوبال در داخل کلاس که فکر نمیکنم به هیچ وجه با اصول شیء گرایی سازگار باشه (من خودم این کار رو در برنامم در PHP کردم بخاطر اینکه یکسری کلاس از قبل داشتم که میخواستم اونا رو سریع وصله و پینه کنم و کارکردشون رو گسترش بدم، ولی نه با تقید به شیء گرایی). البته حضور ذهن ندارم در سی شارپ هم میشه و چطور در داخل کلاسها از متغییرهای گلوبال استفاده کرد، ولی بهرصورت احتمال زیاد به یک صورتی و با یک ترفند دیگری هم که شده میشه مشابهش رو انجام داد.
شاید بگی خب اینکه رویه گرا برنامه نوشتن در سی شارپ به این شکل بیش از حد سخت و کثیف و ناخوانا میشه باعث میشه برنامه نویس مجبور بشه از رویه گرایی چشم پوشی کنه و از شیء گرایی استفاده کنه، ولی من اینطور فکر نمیکنم! چون بنظر من، تاجاییکه میدونم و عملا هم تجربه و نمونه داشتم، شیء گرایی رو میشه از همون درجهء صرفا یک پوسته و اسم ظاهری و تقلب کردن رعایت کرد تا آخرین درجه اون و بین این دو نقطه هم باز میشه در هر نقطه ای واقع شد و یجورایی ترکیبی از رویه ای و شیء گرا داشت که لزوما خیلی هم سخت و ناخوانا نیست؛ یعنی تاحدی از نظر شیء گرایی بهتر کار کنی، بیشتر ازش استفاده کنی، ولی هنوزم تفکر و هدفت کاملا شیء گرا نیست و اصولش رو 100% مقید نیستی. یه مثال سادش اینه که کلاسهایی که تعریف میکنی میتونن از نظر شیء گرایی ناقص و غیراصولی باشن، ولی احتمالا از اون روش کثیف و کاملا رویه گرای اولیه در کل خیلی بهتر و راحتتر و خواناتره حداقل برای خودت. مثلا من خودم یه برنامهء سی++ و در فریمورک Qt بود بعنوان مثال و تمرین که شیء گرا نوشته شده بود و من اون رو توسعه بیشتری دادم و خیلی ویژگیها بهش اضافه کردم، ولی در عین حال اصلا هم به شیء گرایی تقید نداشتم و صرفا وصله و پینه کردم و کدها رو هرجا میتونستم به هر شکل و بهانه ای چپوندم!! من یه برنامه نویس رویه گرا بودم و ساختار شیء گرای اون برنامه و فریمورک کیوت نتونست منو مجبور به رعایت کامل شیء گرایی کنه.
البته ما که با شیء گرایی لجبازی و دشمنی و پدرکشتگی نداریم که بخوایم به هر بهایی فقط اونو دور بزنیم، من فقط دارم میگم زبان برنامه نویسی نمیتونه برنامه نویس رو مطلقا مجبور به پیروی از پارادایم خاصی بکنه، ولی میتونه این کار رو سخت تر و راحتتر بکنه.
وگرنه من خودم هم اگر با سی شارپ کار میکردم شاید تا الان شیء گرایی رو جدی تر گرفته بودم و بهتر رعایتش میکردم. اصلا شاید یه برنامه نویس شیء گرای واقعی شده بودم! ولی حالا که اینطور نیست و PHP و یکسری زبانهای دیگه کار میکنم که میشه درشون براحتی رویه گرا هم نوشت، خب رویه گرا هم مینویسم و از دید و برای خودم دلیل و اجبار ندارم حتما شیء گرا بنویسم.
در این هم که آیا سی شارپ این کار رو کرده کار خوبی کرده باز یه بحث جداگانه هست. یعنی بگیم خب آیا اینطوری خوبه/درسته که زبان برنامه نویسی سعی کنه یک پارادایم خاص رو اجبار کنه به برنامه نویسان؟ ولی از اون طرف شاید علت این امر درواقع این نبوده که طراحان خواستن یک پارادایم خاص رو به برنامه نویسان force کنن و این کار رو درست دونستن، بلکه فقط بخاطر اولویت ها و محدودیت منابع خودشون بوده که ترجیح دادن رویه گرایی رو ساپورت نکنن (با توجه به اینکه آمار و اهمیت استفادش مدام کمتر شده و مزیت و اهمیت ساپورت کردنش نسبت به شیء گرایی در نظرشون خیلی کمتر بوده). پس منی که فعلا رویه گرا مینویسم چکار دارم به اینکه بیشتر زبانها به سمت عدم ساپورت رویه گرایی رفتن و خواهند رفت؟ هر وقت هم که مجبور شدم خب یه فکری میکنم! چه مشکلی داره؟ یعنی یادگیری و استفاده از شیء گرایی اینقدر سخته و سالها زمان و کلی تجربه عملی میخواد؟ منکه فکر نمیکنم. من قبلا بقدر کافی پایه هاش رو میدونم و دیدم و درک کردم و یک چند مورد کوچولو و محدود هم کار کردم که بنظرم برای آشنایی پایه و قبلی کافیه. کارهای اکثر افراد هم که دیدم در اون حدی پیشرفته و پیچیده و دقیق نبودن در این زمینه که برای من چیز غیرقابل درک و سختی بنظر بیاد.
البته شاید هم در آینده همچنان سعی کردم با ترفندهایی که اشاره کردم شیء گرایی رو کم و بیش دور بزنم! این بستگی داره به شرایط و اینکه کدوم گزینه رو برای خودم به صرفه تر ببینم.
شما اگه تونستی تو #C یک خط کد بدون شئ گرایی بنویسی جایزه داری.
خب مثلا میخوام یه free standing function تعریف کنم، به زبان ساده همون توابع مستقل/خارج از کلاس، میام و بعنوان یک تابع استاتیک توی یک کلاس ساده و تک عضوی بعنوان wrapper اون رو پکیج میکنم. میتونم اصلا اسم کلاس رو هم با اسم تابع یکسان یا مشابه بگیرم یا از یک ترفند دیگری استفاده کنم. بعدم که فراخوانی کاری نداره: func:my_func().
میتونم هم اصلا تمام یا تعدادی از توابع خودم رو تحت یک کلاس واحد ببرم که کارم راحتتر بشه.
این ظاهرش شیء گراست فقط! غیر از اینه؟ به صرف اینکه ما کارمون رو تحت نام و شکل کلاسها انجام دادیم که نمیشه شیء گرایی واقعی! درواقع تفکر و روش ما هنوزم رویه گراست.
همینطور در موارد دیگری هم میشه از همین ترفندها پیاده کرد. درسته البته که کلاسهای خود دات نت شیء گرا هستن، ولی استفاده از اجزای کتابخانه و فریمورکی که شیء گراست با اینکه خودت شیء گرا فکر کنی و ساختار کلی برنامت و کدهای خودت هم بر این اساس باشه مقدار زیادی تفاوت داره. نه؟
من میخوام بگم برنامه نویس اگر بخواد میتونه خیلی از این مسائل رو دور بزنه. هرچند کارش کمی سخت و بیریخت و احتمالا حتی بدتر از رویه گرایی معمولی میشه.
یارو اومده مثلا اینترفیس تعریف کرده، برنامه نویس میتونه بیاد یکسری متدهایی رو که توی اینترفیس اجبار شده حتما باید تعریف و پیاده سازی بشن بجاشون بقول معروف یک stub (تابع خالی) بذاره یا یه چیزی که بهرحال ماست مالیش کنه (همهء منطق و اصول لازم برای اون عملیات رو که هدف و توصیهء طراح اینترفیس بود پیاده سازی نکنه) در عین حالی که در برنامهء خودش و در حالت عادی معلوم نمیشه و مشکلی پیش نمیاره اما طبق اصول و هدف طراح و شیء گرایی نبوده و بعدا میتونه از اون نظر مشکل ساز بشه طبیعتا.
همینطور یک مسائلی مثل استفاده از متغییرهای گلوبال در داخل کلاس که فکر نمیکنم به هیچ وجه با اصول شیء گرایی سازگار باشه (من خودم این کار رو در برنامم در PHP کردم بخاطر اینکه یکسری کلاس از قبل داشتم که میخواستم اونا رو سریع وصله و پینه کنم و کارکردشون رو گسترش بدم، ولی نه با تقید به شیء گرایی). البته حضور ذهن ندارم در سی شارپ هم میشه و چطور در داخل کلاسها از متغییرهای گلوبال استفاده کرد، ولی بهرصورت احتمال زیاد به یک صورتی و با یک ترفند دیگری هم که شده میشه مشابهش رو انجام داد.
شاید بگی خب اینکه رویه گرا برنامه نوشتن در سی شارپ به این شکل بیش از حد سخت و کثیف و ناخوانا میشه باعث میشه برنامه نویس مجبور بشه از رویه گرایی چشم پوشی کنه و از شیء گرایی استفاده کنه، ولی من اینطور فکر نمیکنم! چون بنظر من، تاجاییکه میدونم و عملا هم تجربه و نمونه داشتم، شیء گرایی رو میشه از همون درجهء صرفا یک پوسته و اسم ظاهری و تقلب کردن رعایت کرد تا آخرین درجه اون و بین این دو نقطه هم باز میشه در هر نقطه ای واقع شد و یجورایی ترکیبی از رویه ای و شیء گرا داشت که لزوما خیلی هم سخت و ناخوانا نیست؛ یعنی تاحدی از نظر شیء گرایی بهتر کار کنی، بیشتر ازش استفاده کنی، ولی هنوزم تفکر و هدفت کاملا شیء گرا نیست و اصولش رو 100% مقید نیستی. یه مثال سادش اینه که کلاسهایی که تعریف میکنی میتونن از نظر شیء گرایی ناقص و غیراصولی باشن، ولی احتمالا از اون روش کثیف و کاملا رویه گرای اولیه در کل خیلی بهتر و راحتتر و خواناتره حداقل برای خودت. مثلا من خودم یه برنامهء سی++ و در فریمورک Qt بود بعنوان مثال و تمرین که شیء گرا نوشته شده بود و من اون رو توسعه بیشتری دادم و خیلی ویژگیها بهش اضافه کردم، ولی در عین حال اصلا هم به شیء گرایی تقید نداشتم و صرفا وصله و پینه کردم و کدها رو هرجا میتونستم به هر شکل و بهانه ای چپوندم!! من یه برنامه نویس رویه گرا بودم و ساختار شیء گرای اون برنامه و فریمورک کیوت نتونست منو مجبور به رعایت کامل شیء گرایی کنه.
البته ما که با شیء گرایی لجبازی و دشمنی و پدرکشتگی نداریم که بخوایم به هر بهایی فقط اونو دور بزنیم، من فقط دارم میگم زبان برنامه نویسی نمیتونه برنامه نویس رو مطلقا مجبور به پیروی از پارادایم خاصی بکنه، ولی میتونه این کار رو سخت تر و راحتتر بکنه.
وگرنه من خودم هم اگر با سی شارپ کار میکردم شاید تا الان شیء گرایی رو جدی تر گرفته بودم و بهتر رعایتش میکردم. اصلا شاید یه برنامه نویس شیء گرای واقعی شده بودم! ولی حالا که اینطور نیست و PHP و یکسری زبانهای دیگه کار میکنم که میشه درشون براحتی رویه گرا هم نوشت، خب رویه گرا هم مینویسم و از دید و برای خودم دلیل و اجبار ندارم حتما شیء گرا بنویسم.
در این هم که آیا سی شارپ این کار رو کرده کار خوبی کرده باز یه بحث جداگانه هست. یعنی بگیم خب آیا اینطوری خوبه/درسته که زبان برنامه نویسی سعی کنه یک پارادایم خاص رو اجبار کنه به برنامه نویسان؟ ولی از اون طرف شاید علت این امر درواقع این نبوده که طراحان خواستن یک پارادایم خاص رو به برنامه نویسان force کنن و این کار رو درست دونستن، بلکه فقط بخاطر اولویت ها و محدودیت منابع خودشون بوده که ترجیح دادن رویه گرایی رو ساپورت نکنن (با توجه به اینکه آمار و اهمیت استفادش مدام کمتر شده و مزیت و اهمیت ساپورت کردنش نسبت به شیء گرایی در نظرشون خیلی کمتر بوده). پس منی که فعلا رویه گرا مینویسم چکار دارم به اینکه بیشتر زبانها به سمت عدم ساپورت رویه گرایی رفتن و خواهند رفت؟ هر وقت هم که مجبور شدم خب یه فکری میکنم! چه مشکلی داره؟ یعنی یادگیری و استفاده از شیء گرایی اینقدر سخته و سالها زمان و کلی تجربه عملی میخواد؟ منکه فکر نمیکنم. من قبلا بقدر کافی پایه هاش رو میدونم و دیدم و درک کردم و یک چند مورد کوچولو و محدود هم کار کردم که بنظرم برای آشنایی پایه و قبلی کافیه. کارهای اکثر افراد هم که دیدم در اون حدی پیشرفته و پیچیده و دقیق نبودن در این زمینه که برای من چیز غیرقابل درک و سختی بنظر بیاد.
البته شاید هم در آینده همچنان سعی کردم با ترفندهایی که اشاره کردم شیء گرایی رو کم و بیش دور بزنم! این بستگی داره به شرایط و اینکه کدوم گزینه رو برای خودم به صرفه تر ببینم.