PDA

View Full Version : گفتگو: کلاس دیتابیس استاتیک؟ آیا؟



navid3d_69
جمعه 25 مرداد 1392, 03:25 صبح
سلام الان به ذهنم رسید که کلاس دیتابیس رو static باشه نظرتون چیه؟ اصلا درست هست؟
توی یه فرم ورکی هم فکر کنم قبلا دیده بودم static بود .

engmmrj
جمعه 25 مرداد 1392, 04:02 صبح
http://www.rezaonline.net/blog/static-var-in-function.html

Dead Space
جمعه 25 مرداد 1392, 10:31 صبح
ببینید دوست عزیز بستگی به نوع طراحی برنامتون داره.
ممکنه شما معماری MVC که دارید در برنامتون استفاده می کنید تمامی Query هاتون به یک Model اصلی که بقیه کلاس هاش والدش هستن ارسال بشه.
ممکن هم هست اینطور نباشه و شما مستقیما بخواهید در هر جای از برنامتون مستقیما مثلا متد Query کلاس db تون رو صدا بزنید و query پاس بدید.
static بودن هیچ مشکلی نیست در zend و laravel من دیدم که کلاس db شون static هست

colors
جمعه 25 مرداد 1392, 11:16 صبح
نکته خاص استاتیک بودن این است که دیگه نیاز به ساخت شیء, نگهداری و مدیریتش نیست.
چون دیتابیس زیاد تو صفحات مورد استفاده قرار میگیره و ساخت هر بار یک شیء و نگهداریش نسبت به استاتیک, مشکله! ( یکی از نکات مورد بحث در نشست دوم بابل )

AliRezaPro
جمعه 25 مرداد 1392, 12:46 عصر
با چه تفکری به اینجا رسیدید که فکر میکنید نیاز دارید کل کلاس static باشه ؟میدونید با این کار قوانین OOP را نقض میکنید ؟

navid3d_69
جمعه 25 مرداد 1392, 12:55 عصر
مثلا شما یک کلاس دارید برای دیتابیس و می خواهید توی یک سری کلاس دیگه ازش استفاده کنید توی هر نوع پروژه با این روش راحت میشه البته با متغیر های global هم میشه این رو انجام داد ولی فرم ورک هایی که از کلاس استاتیک دیتابیس مشکل برنامه نویسی داره ؟ یا قوانین نقض شدن؟

AliRezaPro
جمعه 25 مرداد 1392, 14:07 عصر
مثلا شما یک کلاس دارید برای دیتابیس و می خواهید توی یک سری کلاس دیگه ازش استفاده کنید توی هر نوع پروژه با این روش راحت میشه البته با متغیر های global هم میشه این رو انجام داد ولی فرم ورک هایی که از کلاس استاتیک دیتابیس مشکل برنامه نویسی داره ؟ یا قوانین نقض شدن؟
الگوریتم کاری فریم ورک ها رو نمیدونم , اما اگر بخواید این همه متد و پروپرتی ها رو بصورت static معرفی کنید , کجا قوانین رو رعایت کردید ؟ در اینصورت شما فقط یه سری اسپگتی کد و Old کد دارید .استفاده از متغیر global تا جایی که واقعا نفر دومی که میخواد سیستم رو دولوپ کنه نیاز نداشته باشه نباید بصورت global معرفی بشه , حتی کسی حق دسترسی اونو بصورت مستقیم نباید داشته باشه , شاید اونو بتونید بصورت property به کاربران یا دولوپر بعدی پاس بدید ما دسترسی عمومی کار اشتباهی است و اصول رو رعایت نکردید( Encapsulation or Security reason) .

شما یک شرکت ماشین سازی دارید, در سال 2012 ماشینی طراحی میکنید که بسیار عالی کار میکنه , ماشین ساخته ی شما License رایگان دارد و هر کسی حق گسترده کردن علمی ماشین را از لحاظ(بدنه , موتور , مکانیک) را دارد . شما برای اولین کار متودی می نویسید که سرعت را به کاربر در کیلومتر سنج نمایش دهد .
اگر Developer بعدی( در سال 2013) سیستم شما را بخواهد گسترده تر کند و آن را ازتقاع بدهد , شاید پس از مدتی بخواهد سرعت را محاسبه کند و نتیجه ی ازتقاع خودش رو ببیند , شما در کلاس مربوطه متودی نوشتید که خروجی اون Int و سرعت است , شما بک متغیر عمومی بصورت Private تعریف میکنید و اونو با خروجی متود باردار میکنید.
دسترسی به این متغیر رو باید برای نفر بعدی بصورت یک property باشد .
ویرایش :
پیشنهاد بنده اینه که حتما static قرار دادن متد ها را از نظر امنیت بررسی کنید.

navid3d_69
جمعه 25 مرداد 1392, 15:02 عصر
آخه یک کلاس دیتابیسی که من دارم کلا 7 تا متد داره این همه نیست



در اینصورت شما فقط یه سری اسپگتی کد و Old کد دارید


این قسمت رو متوجه نشدم یعنی کلاس دیتابیس اگر static باشه تبدیل میشه به اسپگتی کد ؟

MMSHFE
شنبه 26 مرداد 1392, 10:15 صبح
دوست گرامی، استفاده از Static بطور کلی و عام مناسب نیست چون اگه قرار بود همه جا بدون استفاده از شئ کار بشه، خوب چه کاریه، همون متدها رو بکار میبردیم دیگه چرا شئ گرا مینویسیم؟ اما درمورد موضوع سؤال (کلاس دیتابیس) با توجه به اینکه تعداد متدها زیاد نیست و در اکثر موارد، نتیجه اجرای کوئریها قرار نیست زیاد مورد دسترسی واقع بشه (در اکثر موارد یکبار بیشتر کاربرد نداره)، Static نوشتن کلاس، مشکلی ایجاد نمیکنه. بعلاوه وقتی توی کل کد، قراره یکبار به دیتابیس وصل بشیم، کوئری رو اجرا کنیم و بعد اتصال رو قطع کنیم و دیگه کاری با این کلاس نداریم، ایجاد کلاس بصورت غیر Static منطقی نیست چون سربارهایی مثل ایجاد شئ و تعریف فیلدها و سازنده و اختصاص حافظه داره (اونهم از نوع Heap که بطور خودکار آزاد نمیشه و باید توسط Garbage Collector هرموقع کمبود منابع احساس شد، آزاد بشه)، توصیه نمیشه. بخصوص در هاستهای اشتراکی که عدم استفاده بهینه از منابع، تهدیدهایی مثل مسدودشدن اکانت شما و... در پی خواهد داشت.
بعلاوه کجای قوانین OOP گفته شده که Static یعنی اسپاگتی کد؟ خیلی کدها داریم که حتی OO هم نیستن ولی اسپاگتی هم محسوب نمیشن. Static هم مزایای خاص خودش رو داره که اگه به درستی بکار بره و افراط نکنیم، در جای خودش خیلی هم خوب و پسندیده است. مثلاً من خودم هم توی اکثر کدهایی که دارم، کلاس DB رو بصورت static تعریف میکنم. اما بعضی جاها لازمه که شئ ایجاد بشه و طبیعتاً توی اون پروژه ها، کلاس بصورت معمولی ساخته میشه و از مزایای مباحث رایج OOP مثل وراثت و ایجاد شئ و کپسوله سازی و... استفاده میکنم. بقول معروف، هر چیز به جای خویش نیکوست.