اشتراکها
اشتراکها
قانون بوی اسکات
در حین ایندکس کردن، بجای StandardAnalyzer، نیاز خواهید داشت یک PersianNormalizer سفارشی را استفاده کنید که در مطلب « استفاده از Luke برای بهبود کیفیت جستجوی لوسین » به آن اشاره شدهاست.
نظرات مطالب
معرفی کتاب: مرجع کامل ASP.NET MVC 4
مثل همیشه عالیه مهندس
فقط کمی کیفیت چاپ پندار پارس پایینه
در هر صورت از دور دست مریزاد میگم و خسته نباشید
فقط کمی کیفیت چاپ پندار پارس پایینه
در هر صورت از دور دست مریزاد میگم و خسته نباشید
فایلهای پروژهها
DNTViewer.V1.1.zip
- لینک به صفحات داخلی سایت موجود در بانک اطلاعاتی، از همان بانک اطلاعاتی آفلاین خوانده خواهد شد.
- بهبود کیفیت جستجوی مطالب
- بهبود کیفیت جستجوی مطالب
نظرات نظرسنجیها
کدامیک از سرویس دهندههای ابری زیر را پیشنهاد میکنید
ممنون میشم دوستانی که از این سرویسها استفاده کردن بیشتر سعی کنن در مورد کیفیت و پشتیبانیشون و در کل تجربه ای که با این سرویس دهندهها داشتن بنویسن.
کارهای سورس باز قابل توجهی از برنامه نویسهای ایرانی یافت نمیشوند؛ عموما کارهای ارائه شده در حد یک سری مثال یا کتابخانههای کوچک است و در همین حد. یا گاهی هم انگشت شمار پروژههایی کامل. مثل یک وب سایت یا یک برنامه نصفه نیمه دبیرخانه و امثال آن. اینها هم خوب است از دیدگاه به اشتراک گذاری اطلاعات، ایدهها و هم ... یک مزیت دیگر را هم دارد و آن این است که بتوان کیفیت عمومی کد نویسی را حدس زد.
اگر کیفیت کدها رو بررسی کنید به یک نتیجهی کلی خواهید رسید: "عموم برنامه نویسهای ایرانی (حداقل اینهایی که چند عدد کار سورس باز به اشتراک گذاشتهاند) با مفهومی به نام Refactoring هیچگونه آشنایی ندارند". مثلا یک برنامهی WinForm تهیه کردهاند و کل سورس برنامه همان چند عدد فرم برنامه است و هر فرم بالای 3000 سطر کد دارد. دوستان عزیز! به این میگویند «فاجعهای به نام کدنویسی!» صاحب اول و آخر این نوع کدها خودتان هستید! شاید به همین جهت باشد که عمدهی پروژههای سورس باز پس از اینکه برنامه نویس اصلی از توسعهی آن دست میکشد، «میمیرند». چون کسی جرات نمیکند به این کدها دست بزند. مشخص نیست الان این قسمت را که تغییر دادم، کجای برنامه به هم ریخت. تستی ندارند. ساختاری را نمیتوان از آنها دریافت. منطق قسمتهای مختلف برنامه از هم جدا نشده است. برنامه یک فرم است با چند هزار سطر کد در یک فایل! کار شما شبیه به کد اسمبلی چند هزار سطری حاصل از decompile یک برنامه که نباید باشد!
به همین جهت قصد دارم یک سری «ساده» Refactoring را در این سایت ارائه دهم. روی سادگی هم تاکید کردم، چون اگر عموم برنامه نویسها با همین موارد به ظاهر ساده آشنایی داشتند، کیفیت کد نویسی بهتری را میشد در نتایج عمومی شده، شاهد بود.
این مورد در راستای نظر سنجی انجام شده هم هست؛ درخواست مقالات خالص سی شارپ در صدر آمار فعلی قرار دارد.
Refactoring چیست؟
Refactoring به معنای بهبود پیوسته کیفیت کدهای نوشته شده در طی زمان است؛ بدون ایجاد تغییری در عملکرد اصلی برنامه. به این ترتیب به کدهایی دست خواهیم یافت که قابلیت آزمون پذیری بهتری داشته، در مقابل تغییرات مقاوم و شکننده نیستند و همچنین امکان به اشتراک گذاری قسمتهایی از آنها در پروژههای دیگر نیز میسر میشود.
قسمت اول - مجموعهها را کپسوله کنید
برای مثال کلاسهای ساده زیر را در نظر بگیرید:
namespace Refactoring.Day1.EncapsulateCollection
{
public class OrderItem
{
public int Id { set; get; }
public string Name { set; get; }
public int Amount { set; get; }
}
}
using System.Collections.Generic;
namespace Refactoring.Day1.EncapsulateCollection
{
public class Orders
{
public List<OrderItem> OrderItems { set; get; }
}
}
نکته اول: هر کلاس باید در داخل یک فایل جدا قرار گیرد. «لطفا» یک فایل درست نکنید با 50 کلاس داخل آن. البته اگر باز هم یک فایل باشد که بتوان 50 کلاس را داخل آن مشاهده کرد که چقدر هم عالی! نه اینکه یک فایل باشد تا بعدا 50 کلاس را با Refactoring از داخل آن بیرون کشید!
قطعه کد فوق، یکی از روشهای مرسوم کد نویسی است. مجموعهای به صورت یک List عمومی در اختیار مصرف کننده قرار گرفته است. حال اجازه دهید تا با استفاده از برنامه FxCop برنامه فوق را آنالیز کنیم. یکی از خطاهایی را که نمایش خواهد داد عبارت زیر است:
Error, Certainty 95, for Do Not Expose Generic Lists
بله. لیستهای جنریک را نباید به همین شکل در اختیار مصرف کننده قرار داد؛ چون به این صورت هر کاری را میتوانند با آن انجام دهند، مثلا کل آن را تعویض کنند، بدون اینکه کلاس تعریف کننده آن از این تغییرات مطلع شود.
پیشنهاد FxCop این است که بجای List از Collection یا IList و موارد مشابه استفاده شود. اگر اینکار را انجام دهیم اینبار به خطای زیر خواهیم رسید:
Warning, Certainty 75, for Collection Properties Should Be ReadOnly
FxCop پیشنهاد میدهد که مجموعه تعریف شده باید فقط خواندنی باشد.
چکار باید کرد؟
بجای استفاده از List جهت ارائه مجموعهها، از IEnumerable استفاده کنید و اینبار متدهای Add و Remove اشیاء به آنرا به صورت دستی تعریف نمائید تا بتوان از تغییرات انجام شده بر روی مجموعه ارائه شده، در کلاس اصلی آن مطلع شد و امکان تعویض کلی آنرا از مصرف کننده گرفت. برای مثال:
using System.Linq;
using System.Collections.Generic;
namespace Refactoring.Day1.EncapsulateCollection
{
public class Orders
{
private int _orderTotal;
private List<OrderItem> _orderItems;
public IEnumerable<OrderItem> OrderItems
{
get { return _orderItems; }
}
public void AddOrderItem(OrderItem orderItem)
{
_orderTotal += orderItem.Amount;
_orderItems.Add(orderItem);
}
public void RemoveOrderItem(OrderItem orderItem)
{
var order = _orderItems.Find(o => o == orderItem);
if (order == null) return;
_orderTotal -= orderItem.Amount;
_orderItems.Remove(orderItem);
}
}
}
اکنون اگر برنامه را مجددا با fxCop آنالیز کنیم، دو خطای ذکر شده دیگر وجود نخواهند داشت. اگر این تغییرات صورت نمیگرفت، امکان داشتن فیلد _orderTotal غیر معتبری در کلاس Orders به شدت بالا میرفت. زیرا مصرف کننده مجموعه OrderItems میتوانست به سادگی آیتمی را به آن اضافه یا از آن حذف کند، بدون اینکه کلاس Orders از آن مطلع شود یا اینکه بتواند عکس العمل خاصی را بروز دهد.
نظرات اشتراکها
دوراهی انتخاب NHibernate و Entityframework
1 - با EF Code first بدون نیاز به دیتابیس میتونید یک برنامه رو کامل کنید. (منهای بحث آزمایش)
- کد نهایی تمیزتر. چون کلاسها را خودتان طراحی میکنید و توسط ابزارها به صورت خودکار تولید نمیشوند، کنترل بیشتر و نهایتا کیفیت بالاتری دارند.
- ساده است. درگیر نگهداری edmx modelها نخواهید بود. به روز رسانی بانک اطلاعاتی آن هم میتواند کاملا خودکار شود.
2 - دیتاست که کلا کارآیی بالایی نداره. اما ... نهایتا مطمئن هستم خروجی EF (به همراه تمام best practices لحاظ شده در آن) سرعت بالاتری از کلاسهای دست ساز sql helper موجود در وب دارد. برای مثال سطح اول کش آن خیلی از کوئریها را مجددا به بانک اطلاعاتی ارسال نمیکند. قابلیت اجرای به تعویق افتاده کوئریهای لینک امکان تهیه کوئریهای بسیار پیچیده را در یک رفت و برگشت مهیا میکند. کاری که با sql helperهای معمولی نیازی به چندبار رفت و برگشت دارد. قابلیتهای lazy loading آن میتواند مصرف حافظه و بار سرور را درصورت استفاده صحیح کاهش دهد. کوئریهای آن strongly typed و پارامتری هستند (تحت نظر کامپایلر + امنیت + سرعت (کوئریهای پارامتری مانند رویههای ذخیره شده کش میشوند)). به صورت پیش فرض از تراکنشها استفاده میکند و ... خیلی از الگوهای مفید دیگر که چندین سال باید وقت صرف کنید تا نمونه آنها را پیاده سازی کنید. یعنی کار اصولی با بانک اطلاعاتی صرفا یک select ساده نیست که بر اساس آن کارآیی و یا بهتر بودن روشی را مشخص کنید.
- کد نهایی تمیزتر. چون کلاسها را خودتان طراحی میکنید و توسط ابزارها به صورت خودکار تولید نمیشوند، کنترل بیشتر و نهایتا کیفیت بالاتری دارند.
- ساده است. درگیر نگهداری edmx modelها نخواهید بود. به روز رسانی بانک اطلاعاتی آن هم میتواند کاملا خودکار شود.
2 - دیتاست که کلا کارآیی بالایی نداره. اما ... نهایتا مطمئن هستم خروجی EF (به همراه تمام best practices لحاظ شده در آن) سرعت بالاتری از کلاسهای دست ساز sql helper موجود در وب دارد. برای مثال سطح اول کش آن خیلی از کوئریها را مجددا به بانک اطلاعاتی ارسال نمیکند. قابلیت اجرای به تعویق افتاده کوئریهای لینک امکان تهیه کوئریهای بسیار پیچیده را در یک رفت و برگشت مهیا میکند. کاری که با sql helperهای معمولی نیازی به چندبار رفت و برگشت دارد. قابلیتهای lazy loading آن میتواند مصرف حافظه و بار سرور را درصورت استفاده صحیح کاهش دهد. کوئریهای آن strongly typed و پارامتری هستند (تحت نظر کامپایلر + امنیت + سرعت (کوئریهای پارامتری مانند رویههای ذخیره شده کش میشوند)). به صورت پیش فرض از تراکنشها استفاده میکند و ... خیلی از الگوهای مفید دیگر که چندین سال باید وقت صرف کنید تا نمونه آنها را پیاده سازی کنید. یعنی کار اصولی با بانک اطلاعاتی صرفا یک select ساده نیست که بر اساس آن کارآیی و یا بهتر بودن روشی را مشخص کنید.
در طی این چند وقت اخیر هر قدر به سایتهای خبری داخل کشور مراجعه کردم بیشتر نا امید شدم. آیا واقعا این بزرگواران فکر میکنند مردم فرصت این را دارند که روزانه به چند صد سایت خبری سر بزنند؟ این سایتها یا RSS فید ندارند و یا این مشکلات را به همراه دارند:
- استاندارد نبودن تاریخ فیدها. (عزیزان برنامه نویس این تاریخ شمسی نیست و نباید باشد! RSS یک فرمت استاندارد است.)
- استاندارد نبودن محتوای XML تولید شده (قابل parse نیست!)
- بعضی از آنها RSS فید دارند اما باید چند دقیقه در سایت جستجو کنید تا یک لینک را بتوانید در این زمینه پیدا کنید!
- از همه بدتر اینکه خروجی RSS آنها یا چند لینک است بدون توضیح یا چند لینک است بعلاوه یک سطر توضیح. (هدف یک مشترک RSS این است که دیگر به سایت شما مراجعه نکند و مشروح مطالب را از طریق فید دنبال کند. بنابراین یک لینک کافی نیست. یک سطر توضیح هم کم لطفی است. لطفا کل متن خبر را نیز ارائه دهید.)
- تعداد در نظر گرفته شده ناکافی مداخل مربوطه. مثلا امروز 20 خبر در سایت درج شده اما فید RSS آن فقط 10 خبر آخر را نمایش میدهد. این فید هم تقریبا بدون استفاده است چون حداقل یک روز کامل را پوشش نمیدهد.
سایت نستعلیق آنلاین با استفاده از ASP.Net و فونت ایران نستعلیق ایجاد شده است. شاید این سؤال پیش بیاید که چگونه اینکار را انجام دادهاند؟ چگونه متن را به تصویر تبدیل کردهاند یا از همه مهمتر چگونه فونت را به صورت پویا بارگذاری میکنند (چون عموما هاستها فونتی را برای شما نصب نخواهند کرد)؟
برای انجام اینکار از کلاس PrivateFontCollection فضای نام System.Drawing.Text میتوان استفاده کرد. نحوه انجام اینکار را در یکی از پروژههای سایت codeproject میتوان ملاحظه نمود.
کمی این پروژه را اصلاح کردم به همراه افزودن و تنظیم خواص تولید تصویر با کیفیت بالا. پروژه نهایی را به همراه قلمهای مربوطه، از اینجا میتوانید دریافت کنید.
احتمالا در سایت نستعلیق آنلاین از روش موجود در مقاله بالا استفاده شده است که مجبور شدهاند تصویر نهایی را در یک صفحه دیگر نمایش دهند (تخلیه بافر در مرورگر). در پروژهای که ضمیمه شد، تصویر در یک پوشه ذخیره شده و سپس نمایش داده میشود. به این صورت تصویر را میتوان در هر جایی از صفحه بدون ارجاع کاربر به صفحه دوم نمایش داد. البته باید دقت داشت که یوزر asp.net باید دسترسی write را بر روی این فولدر که در اینجا files نام دارد، داشته باشد.
راه دیگر انجام اینکار استفاده از http handlers است. نحوه پیاده سازی این تکنیک را در این مقاله میتوانید مشاهده نمائید.