برنامه نویسی

طراحی رابط مجموعه انتزاعی برای صفحه بندی در سی شارپ

Summarize this content to 400 words in Persian Lang
در این مقاله، نحوه طراحی a مجموعه صفحه بندی شده رابط در سی شارپ برای مدیریت داده های مرتب شده و تقسیم آنها به صفحات. این طراحی انعطاف پذیری و کارایی را تضمین می کند و در عین حال جدایی تمیز بین رابط ها و پیاده سازی ها را حفظ می کند. ما با ارائه توضیحات و مثال های واضح، روند را مرحله به مرحله طی خواهیم کرد.

بررسی اجمالی مشکل

هنگام کار با مجموعه داده های بزرگ، اغلب نیاز داریم:

داده ها را مرتب کنید بر اساس معیارهای خاص (به عنوان مثال، بر اساس حروف الفبا، بر اساس تاریخ، یا شناسه).

داده ها را صفحه بندی کنید، تقسیم آن به تکه های قابل مدیریت (صفحات).
اطمینان حاصل کنید که داده ها باقی می مانند مرتب شده است و به راحتی صفحه به صفحه قابل دسترسی است.

این در سناریوهایی مانند:

نمایش نتایج جستجو
ساخت گزارش های صفحه بندی شده
بارگذاری تدریجی داده ها در برنامه های کاربردی وب

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

راه حل: رابط های انتزاعی

برای ایجاد یک راه حل قوی، دو رابط تعریف می کنیم:

IPaginatedCollection: مجموعه ای از صفحات را نشان می دهد و عملکردی را برای تکرار از طریق آنها یا دسترسی به صفحات خاص بر اساس فهرست ارائه می دهد.
صفحه: نشان دهنده یک صفحه از داده ها، از جمله محتوا و ابرداده آن، مانند موقعیت آن در مجموعه است.

مرحله 1: طراحی رابط ها

IPaginatedCollection

این رابط ساختار کل مجموعه صفحه بندی شده را تعریف می کند.

///
/// Represents a generic paginated collection of data.
///
public interface IPaginatedCollection<T> : IEnumerable<IPage<T>>
{
///
/// Gets the total number of pages in the collection.
///
int PageCount { get; }

///
/// Gets the page at the specified (zero-based) index.
///
IPage<T> this[int index] { get; }
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

صفحه

این رابط ساختار یک صفحه واحد را در مجموعه تعریف می کند.

///
/// Represents a single page in a paginated collection.
///
public interface IPage<T> : IEnumerable<T>
{
///
/// Gets the 1-based ordinal number of this page.
///
int Ordinal { get; }

///
/// Gets the number of elements in this page.
///
int Count { get; }

///
/// Gets the declared size of the page.
///
int PageSize { get; }
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

مرحله 2: پیاده سازی اینترفیس ها

Paginated Collection

این PaginatedCollection دسته کلاس:

مرتب سازی داده های ورودی
تقسیم آن به صفحات

public class PaginatedCollection<T> : IPaginatedCollection<T>
{
private readonly List<IPage<T>> _pages;

public PaginatedCollection(IEnumerable<T> source, int pageSize, Func<T, object> sortKeySelector)
{
if (pageSize <= 0)
throw new ArgumentOutOfRangeException(nameof(pageSize), “Page size must be greater than zero.”);

var sortedData = source.OrderBy(sortKeySelector).ToList();
_pages = new List<IPage<T>>();

for (int i = 0; i < sortedData.Count; i += pageSize)
{
var pageData = sortedData.Skip(i).Take(pageSize).ToList();
_pages.Add(new Page<T>(pageData, i / pageSize + 1, pageSize));
}
}

public int PageCount => _pages.Count;

public IPage<T> this[int index] => _pages[index];

public IEnumerator<IPage<T>> GetEnumerator() => _pages.GetEnumerator();

IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

صفحه

این Page کلاس شامل موارد زیر است:

موارد موجود در صفحه
ابرداده مانند موقعیت ترتیبی و اندازه صفحه.

public class Page<T> : IPage<T>
{
private readonly List<T> _content;

public Page(IEnumerable<T> content, int ordinal, int pageSize)
{
_content = content.ToList();
Ordinal = ordinal;
PageSize = pageSize;
}

public int Ordinal { get; }
public int Count => _content.Count;
public int PageSize { get; }

public IEnumerator<T> GetEnumerator() => _content.GetEnumerator();
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

مرحله 3: استفاده از مجموعه صفحه بندی شده

در اینجا نحوه استفاده از PaginatedCollection کلاس:

using Pagination;

class Program
{
static void Main()
{
// Sample data: unsorted integers
var data = new List<int> { 5, 3, 1, 4, 2, 10, 9, 8, 7, 6 };

// Create a paginated collection
var paginatedCollection = new PaginatedCollection<int>(
data,
pageSize: 3,
sortKeySelector: x => x // Sort by value
);

// Display total pages
Console.WriteLine($”Total Pages: {paginatedCollection.PageCount}”);

// Iterate through pages
foreach (var page in paginatedCollection)
{
Console.WriteLine($”Page {page.Ordinal}:”);
foreach (var item in page)
{
Console.WriteLine(item);
}
}
}
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

خروجی

Total Pages: 4
Page 1:
1
2
3
Page 2:
4
5
6
Page 3:
7
8
9
Page 4:
10

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

مزایای طراحی

انعطاف پذیری:

با هر نوع داده ای کار می کند (T) و معیارهای مرتب سازی.
اجرای تنبل کارایی را برای مجموعه داده های بزرگ تضمین می کند.

قابلیت استفاده مجدد:

انتزاعات (IPaginatedCollection و IPage) واسط را از پیاده سازی جدا کنید.

مقیاس پذیری:

به راحتی قابل تمدید برای رسیدگی به نیازهای اضافی (به عنوان مثال، فیلتر کردن، ذخیره سازی).

سادگی:

جدایی واضح از نگرانی ها بین PaginatedCollection و Page کلاس ها

خوراکی های کلیدی

طراحی از بیرون در: قبل از جزئیات پیاده سازی بر نیازهای مصرف کننده تمرکز کنید.
استفاده از انتزاعات (interfaces) برای تعریف قراردادهای واضح برای عملکرد.
پیاده سازی ویژگی هایی مانند اجرای معوق (IEnumerable) برای مدیریت کارآمد حافظه و عملکرد.

با این طراحی، می توانید به راحتی داده های صفحه بندی شده و مرتب شده را در هر برنامه ای مدیریت کنید و راه حل خود را مقیاس پذیر و قابل نگهداری کنید.

در این مقاله، نحوه طراحی a مجموعه صفحه بندی شده رابط در سی شارپ برای مدیریت داده های مرتب شده و تقسیم آنها به صفحات. این طراحی انعطاف پذیری و کارایی را تضمین می کند و در عین حال جدایی تمیز بین رابط ها و پیاده سازی ها را حفظ می کند. ما با ارائه توضیحات و مثال های واضح، روند را مرحله به مرحله طی خواهیم کرد.


بررسی اجمالی مشکل

هنگام کار با مجموعه داده های بزرگ، اغلب نیاز داریم:

  1. داده ها را مرتب کنید بر اساس معیارهای خاص (به عنوان مثال، بر اساس حروف الفبا، بر اساس تاریخ، یا شناسه).
  2. داده ها را صفحه بندی کنید، تقسیم آن به تکه های قابل مدیریت (صفحات).
  3. اطمینان حاصل کنید که داده ها باقی می مانند مرتب شده است و به راحتی صفحه به صفحه قابل دسترسی است.

این در سناریوهایی مانند:

  • نمایش نتایج جستجو
  • ساخت گزارش های صفحه بندی شده
  • بارگذاری تدریجی داده ها در برنامه های کاربردی وب

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


راه حل: رابط های انتزاعی

برای ایجاد یک راه حل قوی، دو رابط تعریف می کنیم:

  1. IPaginatedCollection: مجموعه ای از صفحات را نشان می دهد و عملکردی را برای تکرار از طریق آنها یا دسترسی به صفحات خاص بر اساس فهرست ارائه می دهد.

  2. صفحه: نشان دهنده یک صفحه از داده ها، از جمله محتوا و ابرداده آن، مانند موقعیت آن در مجموعه است.


مرحله 1: طراحی رابط ها

IPaginatedCollection

این رابط ساختار کل مجموعه صفحه بندی شده را تعریف می کند.

/// 
/// Represents a generic paginated collection of data.
/// 
public interface IPaginatedCollection<T> : IEnumerable<IPage<T>>
{
    /// 
    /// Gets the total number of pages in the collection.
    /// 
    int PageCount { get; }

    /// 
    /// Gets the page at the specified (zero-based) index.
    /// 
    IPage<T> this[int index] { get; }
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

صفحه

این رابط ساختار یک صفحه واحد را در مجموعه تعریف می کند.

/// 
/// Represents a single page in a paginated collection.
/// 
public interface IPage<T> : IEnumerable<T>
{
    /// 
    /// Gets the 1-based ordinal number of this page.
    /// 
    int Ordinal { get; }

    /// 
    /// Gets the number of elements in this page.
/// 
    int Count { get; }

    /// 
    /// Gets the declared size of the page.
    /// 
    int PageSize { get; }
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید


مرحله 2: پیاده سازی اینترفیس ها

Paginated Collection

این PaginatedCollection دسته کلاس:

  1. مرتب سازی داده های ورودی
  2. تقسیم آن به صفحات
public class PaginatedCollection<T> : IPaginatedCollection<T>
{
    private readonly List<IPage<T>> _pages;

    public PaginatedCollection(IEnumerable<T> source, int pageSize, Func<T, object> sortKeySelector)
    {
        if (pageSize <= 0)
            throw new ArgumentOutOfRangeException(nameof(pageSize), "Page size must be greater than zero.");

        var sortedData = source.OrderBy(sortKeySelector).ToList();
        _pages = new List<IPage<T>>();

        for (int i = 0; i < sortedData.Count; i += pageSize)
        {
            var pageData = sortedData.Skip(i).Take(pageSize).ToList();
            _pages.Add(new Page<T>(pageData, i / pageSize + 1, pageSize));
        }
    }

    public int PageCount => _pages.Count;

    public IPage<T> this[int index] => _pages[index];

    public IEnumerator<IPage<T>> GetEnumerator() => _pages.GetEnumerator();

    IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

صفحه

این Page کلاس شامل موارد زیر است:

  1. موارد موجود در صفحه
  2. ابرداده مانند موقعیت ترتیبی و اندازه صفحه.
public class Page<T> : IPage<T>
{
    private readonly List<T> _content;

    public Page(IEnumerable<T> content, int ordinal, int pageSize)
    {
        _content = content.ToList();
        Ordinal = ordinal;
        PageSize = pageSize;
    }

    public int Ordinal { get; }
    public int Count => _content.Count;
    public int PageSize { get; }

    public IEnumerator<T> GetEnumerator() => _content.GetEnumerator();
    IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید


مرحله 3: استفاده از مجموعه صفحه بندی شده

در اینجا نحوه استفاده از PaginatedCollection کلاس:

using Pagination;

class Program
{
    static void Main()
    {
        // Sample data: unsorted integers
        var data = new List<int> { 5, 3, 1, 4, 2, 10, 9, 8, 7, 6 };

        // Create a paginated collection
        var paginatedCollection = new PaginatedCollection<int>(
            data,
            pageSize: 3,
            sortKeySelector: x => x // Sort by value
        );

        // Display total pages
        Console.WriteLine($"Total Pages: {paginatedCollection.PageCount}");

        // Iterate through pages
        foreach (var page in paginatedCollection)
        {
            Console.WriteLine($"Page {page.Ordinal}:");
            foreach (var item in page)
            {
                Console.WriteLine(item);
            }
        }
    }
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید


خروجی

Total Pages: 4
Page 1:
1
2
3
Page 2:
4
5
6
Page 3:
7
8
9
Page 4:
10
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید


مزایای طراحی

  1. انعطاف پذیری:

    • با هر نوع داده ای کار می کند (T) و معیارهای مرتب سازی.
    • اجرای تنبل کارایی را برای مجموعه داده های بزرگ تضمین می کند.
  2. قابلیت استفاده مجدد:

    • انتزاعات (IPaginatedCollection و IPage) واسط را از پیاده سازی جدا کنید.
  3. مقیاس پذیری:

    • به راحتی قابل تمدید برای رسیدگی به نیازهای اضافی (به عنوان مثال، فیلتر کردن، ذخیره سازی).
  4. سادگی:

    • جدایی واضح از نگرانی ها بین PaginatedCollection و Page کلاس ها

خوراکی های کلیدی

  1. طراحی از بیرون در: قبل از جزئیات پیاده سازی بر نیازهای مصرف کننده تمرکز کنید.
  2. استفاده از انتزاعات (interfaces) برای تعریف قراردادهای واضح برای عملکرد.
  3. پیاده سازی ویژگی هایی مانند اجرای معوق (IEnumerable) برای مدیریت کارآمد حافظه و عملکرد.

با این طراحی، می توانید به راحتی داده های صفحه بندی شده و مرتب شده را در هر برنامه ای مدیریت کنید و راه حل خود را مقیاس پذیر و قابل نگهداری کنید.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا