PDA

View Full Version : موارد استفاده از کلاسها و توابع استاتیک



میلاد قاضی پور
چهارشنبه 17 شهریور 1389, 06:05 صبح
سلام . من اغلب هنگام نوشتن کدهام جهت سهولت کار دلم میخواد کلاسهام رو به صورت استاتیک تعریف کنم اما دلهره این رو دارم که شی گرایی هتک حرمت بشه و اینکار رو نمیکنم . میخواستم از اونهایی که دستی تو کار دارند سوأل کنم چه موقع ما اجازه استفاده از اشیاء استاتیک رو خواهیم داشت ؟

fjm11100
چهارشنبه 17 شهریور 1389, 10:32 صبح
نه شی گرایی خدشه ای نمیبینه. بیشترین استفاده اش در جایی ک فقطه یکسری متد را میخای بریزی توی یک بسته!!
کلاس استاتیک از نظر سرعت خیلی بهتر از کلاس های معمولی که instance از آنها میسازی.

اَرژنگ
چهارشنبه 17 شهریور 1389, 10:41 صبح
نه شی گرایی خدشه ای نمیبینه. بیشترین استفاده اش در جایی ک فقطه یکسری متد را میخای بریزی توی یک بسته!!.
چطوری چنین کاری خلاف اصول شیگرایی نیست؟



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

fjm11100
چهارشنبه 17 شهریور 1389, 10:58 صبح
جز شی گرایی نیست اما خلافش نیست. خلاف شی گرایی یعنی اینکه جایی که شما می تونی ارثبری کنی کدت را Copy & Paste کنی! اگر خلاف بود توی C# یا C++ یا java امکانش را نمی گذاشتند حتی خود دات نت سرشار از کلاس های استاتیک است.

Reza_Yarahmadi
چهارشنبه 17 شهریور 1389, 11:16 صبح
چنین کاری خلاف اصول شیگرایی نیست؟
درسته كه بر خلاف شيگرايي به حساب مياد ولي كاري كه دوستمون ميكنه اصلا شيگرايي نيست!
مفهوم كلاس فقط توي شيگرايي خلاصه نميشه بلكه اين قابليت رو گذاشتن كه جاهاي ديگه هم ازش استفاده بشه ، در بعضي از موارد از كلاس براي مرتب كردن كدها استفاده ميشه مثلا من معمولا توي برنامه هام يك كلاس دارم به نام Helper كه توي اين كلاس تمام متغير هاي پايه و يا Const رو توي اون و بصورت استاتيك تعريف ميكنم و يا بعضي از متدهاي اعتبار سنج و مبدل و ... رو هم بصورت استاتيك تعريف ميكنم. اين كار باعث ميشه كه سرعت خوندن كدها و سرعت اجراي برنامه بالا بره ، ...
ولي اين كاري كه من انجام ميدم شيگرايي نيست.
درسته كه توي خيلي جاها (البته توي ايران) فكر ميكنن كه اگه كدها رو توي كلاس بنويسن دارن شيگرا كار ميكنن ولي اينطور كد نوشتن كجا و شيگرايي كجا!
شيگرايي نياز به يك تحليل كامل و قوي داره نميشه همينطوري شروع به كدنويسي كرد و شيگرا برنامه نوشت(منظور پروژه هاي يه ذره جون دار!! :چشمک:)

saeedalg
چهارشنبه 17 شهریور 1389, 11:32 صبح
شی گرایی یه ابزاره که با استفاده از اون برنامت ماژولار بشه قابلیت توسعه برنامه و نگه داری اون بالاتر بره، باعث پیچیدگی برنامه میتونه بشه باعث کند شدن هم میتونه بشه، مثلا تو یه شخص داری میتونه حقیقی و حقوقی باشه، این شخص یه شناسه داره یه نام داره یه آدرس داره یه واژه احترام عمومی براش به کار میره (جناب آقای، شرکت محترم) یه واژه احترام خصوصی (دکتر، پیشرو) و قواعد بازی دیگه ای که مختص پروژه است، حالا همین آدرس خودش میتونه از چند زیر آدرس تشکیل بشه و واژه احترام هم ... خوب اگه استاتیک بذاری متدات رو باید برای هر چیزی که داینامیک میخواد کاربر تعریف کنه یه متد استاتیک داشته باشی که اون کار رو انجام بده، اما وقتی این رو یه شی میکنی زمان اجرا کاربر براش 4 تا پارامتری که اون شی داره رو انتخاب میکنه و حالا که میخوای تو دیتا بیس ذخیره کنی میره یه شخص رو با تمام اطلاعاتش ذخیره میکنه، ولی وقتی بخوای شی ازش نسازی باید هر بار آیدی شخص رو بدی و بری هر دفعه یه پارامتر رو ست کنی (همون طور که گفتم باید برای هر پارامتری توابع جدا داشته باشی وگرنه برای یک شخص یه تابع دو هزار خطی داری که با کمترین تغییری تو پارامترهاش باید 2 روز کد رو بالا و پایین کنی). خوب اینجوری با استفاده از OO با توجه به اینکه به دی بی اکسس کمتری داشتی سرعت بالاتری داشتی هر چند که از رم زیاد استفاده کردی، اما حالا یه کلاسی مثل Math رو در نظر بگیر، خود Math خروجی نداره که بدی جای دیگه (شخص داره میتونی پاسش کنی) این کلاس کلی تابع داره که یه سری ورودی خروجی میگیره ممکنه کلی پارامتر هم داشته باشه که همشون مثلا تو متد Pow نیاز نیست مقدار دهی بشن، خوب دیگه نیازی نیست که ازش شی بسازی Method call هم همون کار رو میکنه سریعترم هست. یا یه DB میخوای ازش یه سری خروجی بگیری توابعی که کانکشن برقرار میکنن و Query میسازن و اینا مشخصن نیازی نیست هر جایی یه نمونه ازش ایجاد کنی چون با خودش کاری نداری میخوای از توابع اون استفاده کنی، گاهی پیش میاد که با خود کلاس کار نداری از توابعش استفاده میکنی اما چون یه سری کلاس مشابه داری که میتونی با Inheritance سرعت طراحی و پیاده سازی و توسعه رو بالا ببری از OO استفاده کنی.

میلاد قاضی پور
چهارشنبه 17 شهریور 1389, 21:14 عصر
خب من در کل از حرفای شما دوستان اینطور متوجه شدم که اگر قرار بود تغییراتی در مقادیر کلاسی که قراره چندین جا و پروژه استفاده بشه بوجود بیاریم و هر بار متغیر هارو با مقادیر مختلف مدار دهی کنیم باید یک نمونه از کلاس بتونیم بسازیم بنابراین کلاس نباید استاتیک باشه . اما اگر تعدادی متد و متغیر درون کلاسی بود که قرار نبود مقادیرشون تغییر کنه و به اصلاح همه جا قرار شد اون کلاس به همون شکلی که هست استفاده بشه کلاسهارو باید از نوع استاتیک تعریف کنیم . این نیست ؟

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

fjm11100
پنج شنبه 18 شهریور 1389, 11:41 صبح
درسته. می تونید اینکارو بکنید