‫Custom Paging بهینه و غیر Declarative در DataGrid

اگر بخواهید از الگوی MVP در برنامه‌های ASP.NET استفاده کنید بایستی بتوانید همه چیز را به CodeBehind انتقال دهید. این یعنی declarative و binding تقریباً تعطیل. یکی از امکانات مهمی که این وسط از دست می‌رود، امکان Paging بهینه کنترل GridView از طریق CodeBeind است. منظور از Paging بهینه فقط نمایش pager در قسمت پایین کنترل نیست، بلکه منظور این است که فقط رکوردهای مورد نیاز برای صفحه جاری (معمولاً ۱۰ تا ۲۰ تا) از دیتابیس فراخوانی شود. کنترل GridView از طریق DataSourceهای موجود در markup مثل ObjectDataSource یا SqlDataSource می‌تواند Paging بهینه را ارائه دهد. اما از طریق CodeBehind، یعنی handle کردن دستی event مربوط به Paging فقط یک Paging غیر بهینه ارائه می‌دهد. چون در CodeBehind راهی برای اعلام تعداد رکوردها به GridView وجود ندارد (+).

می‌شود به جای GridView از کنترل DataGrid استفاده کرد. DataGrid امکان Paging بهینه از داخل Code Behind را به خوبی پشتیبانی کرده و می‌توان آن را با استفاده از الگوی MVP به کار گرفت. برای این کار کافیست از eventهای SortCommand و PageIndexChanged و پراپرتی‌های VirtualItemCount و CurrentPageIndex استفاده نمایید. لطفاً نمونه زیر را ببینید.

‫مزایای الگوی MVP

خیلی وقت پیش چیزهایی راجع به استفاده از الگوی MVP‌ در صفحات ASP.NET WebForm شنیده بودم. مزایایش را می‌دانستم و کمی هم امتحانش کرده بودم. اخیراً در یک پروژه وب کوچک ASP.NET WebForm از اون به طور کامل استفاده کرده و تمام مزایای آن را به طور عملی لمس کردم.

یکی از بهترین چیزهایی که MVP برای من داشت این بود که تقریباً به من اجازه نمی‌داد که در صفحات ASPX از کنترل‌های Data Aware مثل Grid و Form به صورت خودکار و markup استفاده کنم. به عبارت دیگر Data Binding و واگذار کردن همه چیز به DataSourceها ممنوع شده بود. این طوری من مجبور شدم همه عملیات مثل نمایش اطلاعات در صفحه یا خواندن اطلاعات از کنترل‌ها از طریق CodeBehind انجام دهم. خوبی این کار در این بود که جلوی بعضی خطاها را همان هنگام compile می‌گیرم. مثل اگر نام فیلدی را اشتباه تایپ کرده باشم یا تعداد پارامترهای دریافتی یک متود را رعایت نکرده باشم، همان زمان کامپایل خطا را می‌بینم. در حالت DataBinding خودکار نام فیلدها، متودها و اطلاعات پارامترها به صورت string غیر قابل کامپایل در فایل aspx/ascx قرار دارد و تا زمانی که صفحه در یک مرورگر باز نشود نمی‌توان متوجه خطا شد.

حس می‌کنم MVP قدرت تقسیم کار و کار تیمی را افزایش می‌دهد. چون همان کاری که همیشه در Codebehind انجام می‌شد، حتی با فرض این که دسترسی به دیتابیس و logic کار در یک لایه جداگانه انجام می‌پذیرد، را هم می‌توان به دو تیکه کاملاً مجزا تقسیم کرده و به افراد مختلف سپرد. این موضوع کار designerها (طراحی صفحات، گرافیک، جاوا اسکریپت) را هم ساده می‌کند. چون می‌توانند به صورت مستقل از برنامه‌نویس‌ها و بدون آن که مجبور باشند کار همدیگر را خراب کنند، با خیال راحت کارشان را انجام دهند. خوانا شدن کد برنامه، خصوصاً آنچه که در Presenter قرار داد، بخش دیگری از مزایای MVP است که من خودم با دستان خودم لمس کردم.

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

پ.ن.: به این لینک هم که توضیحاتی کلی راجع به مدل‌های MVP و مشابه MVP است نگاهی بیندازید.

‫‫‫استفاده از الگوی mvp

حتماً تا به حال اسم mvp را چندین و چند بار شنیده و مطالبی را هم راجع به آن خوانده‌اید. mvp یک الگوی طراحی شبیه mvc است که بیشتر برای winform استفاده می‌شود. از جمله مزایای mvp عبارت‌اند از:

۱- Seperation of Concerns (جدا سازی بخش‌های مختلف): یعنی هر بخشی باید کار خودش را انجام دهد.
۲- loose coupling: کاهش وابستگی بین بخش‌های مختلف برنامه
۳- قابلیت‌های نگهداری و خوانایی بالا
۴- افزایش قابلیت unit test و تست پذیری
۵- کمک به جدا سازی کار طراح UI و برنامه‌نویس Code behind

پیاده‌سازی mvp هم مثل خیلی از design patternهای دیگر بر خلاف ظاهرش بسیار ساده است. mvp روش چندان عجیبی نیست به طوری که حتی ممکن است روش پیاده‌سازی UIی که خود شما تا حالا استفاده می‌کرده‌اید به طور ناخودآگاه شباهت زیادی به mvp داشته باشد. در روش mvp به ازای هر فرم سه کلاس برای model، view و presenter وجود دارد. البته برای view و model اینترفیس هم وجود دارد. view توسط فرم ویندوزی پیاده‌سازی می‌شود، model به منطق برنامه یا مثلاً دیتابیس وصل است، presenter هم رابط این دو تا است.

بهترین راه یادگیری mvp استفاده از مثال است. برای یادگیری بیشتر به منابع زیر مراجعه کنید:

http://www.dotnettips.info/2009/08/mvp.html
http://www.codeproject.com/KB/architecture/WinForms_MVP.aspx
http://codebetter.com/jeremymiller/2007/07/26/the-build-your-own-cab-series-table-of-contents/