‫فایده فضولی در Object Browser

چند روز است که می‌خواستم با استفاده از کتابخانه SharpZipLib یک فولدر و ساب فولدرهایش را zip کنم اما نمونه کدهای موجود نمی‌توانستند recursive عمل کنند و فقط فایل‌های موجود در فولدر را zip می‌کردند. از طرفی توسعه نمونه کدها هم نیاز به شناخت کامل‌تری از API کتابخانه داشت.

خوشبختانه کمی فضولی در اسمبلی ICSharpCode.SharpZipLib نجاتم داد. چون حین نگاه کردن به کلاس‌ها و name spaceهای آن متوجه کلاسی به اسم FastZip شدم. کار مد نظر من با FastZip با همین دو خط زیر انجام شد:

            FastZip fastZip = new FastZip();

            fastZip.CreateZip(zipFileName, sourceDirectory, true, “”);

تزریق انقلابی

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

در این طور موارد اگر فرد برنامه‌نویس آن قدر وقت و حوصله نداشته که همه این موارد را بررسی کرده و ضمناً معتقد باشد که feature مورد نظر چندان هم اثر بدی رو کلیت سیستم ندارد و می‌توان موارد جزیی به وجود آمده را بلافاصله رفع و رجوع کرد آن وقت می‌توان از یک روش انقلابی استفاده کرد. من اسم این روش را «تزریق انقلابی» گذاشته‌ام. به این معنی که ابتدا موارد اصلی بررسی شده و سپس feature مذکور بدون آن که توجه کسی (مشتری/کاربر/کارفرما/مدیر پروژه/…) به آن جلب شود به سیستم تزریق (اضافه) گردد. البته مدتی هم باید گوش به زنگ مشتری ماند تا هر گونه ایراد و اشکال احتمالی سریعاً برطرف گردد.

‫فواید LINQ و LINQ-to-Objects

اگر عادت کنید به استفاده از LINQ بعداً می‌توانید از یکی از مزایای مفید آن استفاده کنید. مدتی پیش مجبور شدم یک سری بهینه‌سازی‌هایی روی دسترسی به دیتابیس انجام دهم. یکی از موارد رایجی که برای بهینه‌سازی پیدا کردم entityهایی بودند که با یک query لینک از دیتابیس فراخوانی می‌شدند. این entityها تعداد رکورد محدودی داشتند، معمولاً خیلی کم تغییر می‌کردند ولی استفاده کنندگان زیادی داشتند. مثلاً فرض کنید آیتم‌های یک منو که در تمام صفحات برنامه مورد نیاز هستند.

در مورد این entityها به ذهنم رسید که همه آنها در ابتدای کار برنامه به جای ثابتی در حافظه load کرده و سپس هر وقت که با آنها کار داشتم از آنجا استفاده کنم. خوشبختانه چون قبلاً از LINQ برای query زدن استفاده کرده بودم، روال query زدن از objectهای موجود در حافظه چندان سخت نبود. کافی بود در query دیتابیسی مقدار in را به جای خواندن از دیتابیس با آن Array یا Collection موجود در حافظه عوض کنم و بعضی ملاحظات LINQ-to-Objects را رعایت کنم. به این ترتیب هم روش query زدنم عوض نشد و هم مجبور نشدم برای استخراج اطلاعات از حافظه از روش‌های foreach و loop و… استفاده کنم.