برنامه نویسی

طراحی سطح پایین: طرحی برای پیروزی در جنگ های نرم افزاری

Summarize this content to 400 words in Persian Lang سلام، معماران جوان! 👷‍♂️👷‍♀️آماده ای برای غوطه ور شدن در طراحی ریزدانه سطح پایین؟ اینطور فکر کنید: طراحی سطح پایین همان نقشه جادویی برای هر جزئیات عمارت نرم افزار شماست! بدون آن، هرج و مرج خواهید داشت، مانند قرار دادن یخچال در حمام. بیایید درستش کنیم!

طراحی سطح پایین (LLD) چیست؟

طراحی سطح پایین (LLD) بر روی جزئیات گرانول سیستم شما تمرکز دارد. اگر طراحی سطح بالا (HLD) متعلق به شماست نقشه نشان دادن شهرها و بزرگراه ها، LLD است جی پی اس بزرگنمایی برای نشان دادن اینکه کدام خیابان را برای رسیدن به مقصد خود می چرخانید. این ازدواج کامل از عملکرد و ظرافت است! این در مورد تعریف است:

کلاس ها
اشیاء
روش ها
تعامل بین اجزا
طراحی طرحواره پایگاه داده

حال تصور کنید که پروژه ای مانند a بسازید اپلیکیشن تحویل غذا. LLD پاسخ می دهد چگونه سیستم شما قرار است وظایف سختی را انجام دهد. از اینکه کدام کلاس ها مسئول داده های رستوران هستند، تا اینکه چگونه فراخوانی های API را برای نمایش تاریخچه سفارش کاربر ساختار می دهید.

بیایید کمی گوشت روی استخوان ها بگذاریم: مورد استفاده

مورد استفاده واقعی: سیستم تحویل غذا 🍔

سناریو: ما در حال طراحی یک سیستم سطح پایین برای خدمات تحویل آنلاین غذا مانند Zomato یا Uber Eats هستیم. هدف: سفارش‌ها، کاربران، رستوران‌ها و تحویل را بدون ایجاد کد اسپاگتی انجام دهید.

اجزای کلیدی (سوپر تیم ما)

کاربر: مشتری گرسنه 🥵

رستوران: غذا از کجا میاد🍕

سفارش دهید: ارتباط غذا با شکم 🥡

شریک تحویل: جنگجوی جاده ها 🏍️

مرحله 1: طراحی کلاس – بازیگران را بیرون بیاورید 🎭

در این سطح، شما کارگردان هستند. شما باید «بازیگران» عالی (کلاس‌ها) را انتخاب کنید و به آن‌ها بگویید چه نقش‌هایی را بازی کنند.

java
Copy code
class User {
private String userId;
private String name;
private String email;
private List<Order> orders;

public User(String userId, String name, String email) {
this.userId = userId;
this.name = name;
this.email = email;
this.orders = new ArrayList<>();
}

public void placeOrder(Order order) {
orders.add(order);
}

// Getters and Setters
}

class Restaurant {
private String restaurantId;
private String name;
private List<FoodItem> menu;

public Restaurant(String restaurantId, String name, List<FoodItem> menu) {
this.restaurantId = restaurantId;
this.name = name;
this.menu = menu;
}

public List<FoodItem> getMenu() {
return menu;
}
}

class Order {
private String orderId;
private User user;
private Restaurant restaurant;
private List<FoodItem> foodItems;
private OrderStatus status;

public Order(String orderId, User user, Restaurant restaurant, List<FoodItem> foodItems) {
this.orderId = orderId;
this.user = user;
this.restaurant = restaurant;
this.foodItems = foodItems;
this.status = OrderStatus.PENDING;
}

public void updateOrderStatus(OrderStatus status) {
this.status = status;
}
}

چرا کلاس ها؟ آنها را به عنوان بلوک های لگو در نظر بگیرید 🧱. بدون آنها، شما با یک آشغال عظیم از آجرهای بدون ساختار مواجه خواهید شد. تعریف می کنیم سازمان بهداشت جهانی (کاربر، رستوران) و چی (نظم) درگیر می شود.

مرحله 2: روابط – چه کسی با چه کسی صحبت می کند؟ 💬

حالا که “بازیگران” خود را دارید، بیایید نحوه تعامل آنها را بررسی کنیم. نمایشنامه بدون دیالوگ چیست، درست است؟

2.1 کاربر و سفارش

زمانی که یک کاربر سفارش می دهد، یک نمونه جدید از سفارش دهید. اما اگر کاربر همچنان به این فکر کند که کدام پیتزا را تهیه کند چه؟ آنجاست وضعیت سفارش به ما کمک می کند ردیابی کنیم که آیا سفارش وجود دارد یا خیر در انتظار، در حال پیشرفت، یا تحویل داده شد.

2.2 رستوران و منو

رستوران ها دارای منوهایی هستند (دوه!) که فهرستی از آنهاست اقلام غذایی. هنگامی که کاربر سفارشی را ثبت می کند، از بین این موارد انتخاب می کند.

java
Copy code
class FoodItem {
private String itemId;
private String name;
private double price;

public FoodItem(String itemId, String name, double price) {
this.itemId = itemId;
this.name = name;
this.price = price;
}
}

مرحله 3: گردش کار – بیایید جادو را ببینیم! ✨

در اینجا یک جریان معمولی از رویدادها در برنامه تحویل غذا وجود دارد:

کاربر وارد می شود و در را مرور می کند رستوران.

رستوران خود را نشان می دهد منو (فهرست).

کاربر غذا را انتخاب می کند و جای می دهد سفارش دهید.
سیستم تخصیص می دهد سفارش دهید به یک شریک تحویل.
را شریک تحویل سفارش را می گیرد و به روز می کند وضعیت سفارش به عنوان در حال پیشرفت.
پس از تحویل، وضعیت سفارش تبدیل می شود تحویل داده شد.

مرحله 4: نمودار توالی – جریان در عمل 🏄‍♂️

نمودار توالی می تواند به شما کمک کند تا نحوه تعامل اشیاء در طول زمان را تجسم کنید. این به شما گام به گام نشان می دهد که چگونه کاربر، سفارش دهید، رستوران، و شریک تحویل با هم بیایند

sql
Copy code
+———+ +————+ +————–+ +————–+
| User | | Restaurant | | Delivery | | Order |
+———+ +————+ +————–+ +————–+
| | | |
| Browse Menu | | |
|———————->| | |
| | | |
| Place Order | | |
|———————->| | |
| | Prepare Food | |
| |————————>| |
| | | Assign Delivery |
| | |———————->|
| | | |
| | | Update Status: InProgress
| | |———————->|
| | | |
| Get Delivered Order | | |
|<————————————————| |
| Update Status: Delivered | |
|<———————————————————————–|

مرحله 5: مدیریت خطا – اجازه ندهید چیزها بسوزند 🍳🔥

رسیدگی به خطاها بسیار مهم است زیرا سیستم های واقعی نور خورشید و رنگین کمان نیستند. فرض کنید شریک تحویل به دلیل بسته بودن جاده نمی تواند به رستوران برسد. آیا ما فقط گریه می کنیم؟ نه!

اضافه می کنیم مکانیسم های بازگشتی.

java
Copy code
class DeliveryPartner {
public void pickOrder(Order order) throws DeliveryException {
if (roadClosed()) {
throw new DeliveryException(“Road is closed!”);
}
order.updateOrderStatus(OrderStatus.IN_PROGRESS);
}

private boolean roadClosed() {
// Dummy logic to simulate a road closure
return true;
}
}

هنگامی که استثنا وجود دارد، سیستم شما ممکن است به کاربر اطلاع دهد، یک شریک تحویل جدید را مجدداً تعیین کند، یا از رستوران بخواهد سفارش جدیدی را در صورت تأخیر آماده کند.

مرحله 6: بهینه سازی ها و بهبودها 🏗️

اینجا قسمت سرگرم کننده است. پس از راه اندازی سیستم، می توانید به بهبودهایی مانند:

ذخیره سازی منوها برای کاهش تماس با پایگاه داده

چند رشته ای برای حجم های با سفارش بالا

بهینه سازی پایگاه داده مانند نمایه سازی یا اشتراک گذاری برای رسیدگی به میلیون ها کاربر که همزمان سیب زمینی سرخ کرده خود را سفارش می دهند 🍟.

java
Copy code
// Example of caching the menu
class MenuService {
private Map<String, List<FoodItem>> cachedMenus = new HashMap<>();

public List<FoodItem> getMenu(String restaurantId) {
if (!cachedMenus.containsKey(restaurantId)) {
cachedMenus.put(restaurantId, fetchMenuFromDB(restaurantId));
}
return cachedMenus.get(restaurantId);
}

private List<FoodItem> fetchMenuFromDB(String restaurantId) {
// Fetch from DB
return new ArrayList<>();
}
}

نتیجه – این قدرت LLD است! 💪

طراحی سطح پایین برنامه نبرد شماست. این سیستم شما را برای بودن آماده می کند مقیاس پذیر، کارآمد، و قوی. در مثال تحویل غذا، طراحی کلاس، تعاملات، رسیدگی به خطاها و حتی بهینه سازی ها را بررسی کردیم. اگر LLD را به درستی دریافت کنید، سیستم شما مانند ماشینی است که به خوبی روغن کاری شده است و آماده است تا با هر چیزی که دنیا به سمت آن می زند، مقابله کند.

بنابراین دفعه بعد که در کدنویسی عمیق هستید، مانند یک معمار فکر کنید. بازیگران خود را بشناسید، دیالوگ های آن ها را بشناسید و نمایش را روان اجرا کنید.

اکنون، پیش بروید و شروع به قرار دادن آن ها کنید سفارشات… منظورم نوشتن آن هاست کلاس ها! 🍕💻

سلام، معماران جوان! 👷‍♂️👷‍♀️آماده ای برای غوطه ور شدن در طراحی ریزدانه سطح پایین؟ اینطور فکر کنید: طراحی سطح پایین همان نقشه جادویی برای هر جزئیات عمارت نرم افزار شماست! بدون آن، هرج و مرج خواهید داشت، مانند قرار دادن یخچال در حمام. بیایید درستش کنیم!

طراحی سطح پایین (LLD) چیست؟

طراحی سطح پایین (LLD) بر روی جزئیات گرانول سیستم شما تمرکز دارد. اگر طراحی سطح بالا (HLD) متعلق به شماست نقشه نشان دادن شهرها و بزرگراه ها، LLD است جی پی اس بزرگنمایی برای نشان دادن اینکه کدام خیابان را برای رسیدن به مقصد خود می چرخانید. این ازدواج کامل از عملکرد و ظرافت است! این در مورد تعریف است:

  • کلاس ها
  • اشیاء
  • روش ها
  • تعامل بین اجزا
  • طراحی طرحواره پایگاه داده

حال تصور کنید که پروژه ای مانند a بسازید اپلیکیشن تحویل غذا. LLD پاسخ می دهد چگونه سیستم شما قرار است وظایف سختی را انجام دهد. از اینکه کدام کلاس ها مسئول داده های رستوران هستند، تا اینکه چگونه فراخوانی های API را برای نمایش تاریخچه سفارش کاربر ساختار می دهید.

بیایید کمی گوشت روی استخوان ها بگذاریم: مورد استفاده

مورد استفاده واقعی: سیستم تحویل غذا 🍔

سناریو: ما در حال طراحی یک سیستم سطح پایین برای خدمات تحویل آنلاین غذا مانند Zomato یا Uber Eats هستیم. هدف: سفارش‌ها، کاربران، رستوران‌ها و تحویل را بدون ایجاد کد اسپاگتی انجام دهید.

اجزای کلیدی (سوپر تیم ما)

  1. کاربر: مشتری گرسنه 🥵
  2. رستوران: غذا از کجا میاد🍕
  3. سفارش دهید: ارتباط غذا با شکم 🥡
  4. شریک تحویل: جنگجوی جاده ها 🏍️

مرحله 1: طراحی کلاس – بازیگران را بیرون بیاورید 🎭

در این سطح، شما کارگردان هستند. شما باید «بازیگران» عالی (کلاس‌ها) را انتخاب کنید و به آن‌ها بگویید چه نقش‌هایی را بازی کنند.

java
Copy code
class User {
    private String userId;
    private String name;
    private String email;
    private List<Order> orders;

    public User(String userId, String name, String email) {
        this.userId = userId;
        this.name = name;
        this.email = email;
        this.orders = new ArrayList<>();
    }

    public void placeOrder(Order order) {
        orders.add(order);
    }

    // Getters and Setters
}

class Restaurant {
    private String restaurantId;
    private String name;
    private List<FoodItem> menu;

    public Restaurant(String restaurantId, String name, List<FoodItem> menu) {
        this.restaurantId = restaurantId;
        this.name = name;
        this.menu = menu;
    }

    public List<FoodItem> getMenu() {
        return menu;
    }
}

class Order {
    private String orderId;
    private User user;
    private Restaurant restaurant;
    private List<FoodItem> foodItems;
    private OrderStatus status;

    public Order(String orderId, User user, Restaurant restaurant, List<FoodItem> foodItems) {
        this.orderId = orderId;
        this.user = user;
        this.restaurant = restaurant;
        this.foodItems = foodItems;
        this.status = OrderStatus.PENDING;
    }

    public void updateOrderStatus(OrderStatus status) {
        this.status = status;
    }
}

چرا کلاس ها؟ آنها را به عنوان بلوک های لگو در نظر بگیرید 🧱. بدون آنها، شما با یک آشغال عظیم از آجرهای بدون ساختار مواجه خواهید شد. تعریف می کنیم سازمان بهداشت جهانی (کاربر، رستوران) و چی (نظم) درگیر می شود.

مرحله 2: روابط – چه کسی با چه کسی صحبت می کند؟ 💬

حالا که “بازیگران” خود را دارید، بیایید نحوه تعامل آنها را بررسی کنیم. نمایشنامه بدون دیالوگ چیست، درست است؟

2.1 کاربر و سفارش

زمانی که یک کاربر سفارش می دهد، یک نمونه جدید از سفارش دهید. اما اگر کاربر همچنان به این فکر کند که کدام پیتزا را تهیه کند چه؟ آنجاست وضعیت سفارش به ما کمک می کند ردیابی کنیم که آیا سفارش وجود دارد یا خیر در انتظار، در حال پیشرفت، یا تحویل داده شد.

2.2 رستوران و منو

رستوران ها دارای منوهایی هستند (دوه!) که فهرستی از آنهاست اقلام غذایی. هنگامی که کاربر سفارشی را ثبت می کند، از بین این موارد انتخاب می کند.

java
Copy code
class FoodItem {
    private String itemId;
    private String name;
    private double price;

    public FoodItem(String itemId, String name, double price) {
        this.itemId = itemId;
        this.name = name;
        this.price = price;
    }
}

مرحله 3: گردش کار – بیایید جادو را ببینیم! ✨

در اینجا یک جریان معمولی از رویدادها در برنامه تحویل غذا وجود دارد:

  1. کاربر وارد می شود و در را مرور می کند رستوران.
  2. رستوران خود را نشان می دهد منو (فهرست).
  3. کاربر غذا را انتخاب می کند و جای می دهد سفارش دهید.
  4. سیستم تخصیص می دهد سفارش دهید به یک شریک تحویل.
  5. را شریک تحویل سفارش را می گیرد و به روز می کند وضعیت سفارش به عنوان در حال پیشرفت.
  6. پس از تحویل، وضعیت سفارش تبدیل می شود تحویل داده شد.

مرحله 4: نمودار توالی – جریان در عمل 🏄‍♂️

نمودار توالی می تواند به شما کمک کند تا نحوه تعامل اشیاء در طول زمان را تجسم کنید. این به شما گام به گام نشان می دهد که چگونه کاربر، سفارش دهید، رستوران، و شریک تحویل با هم بیایند

sql
Copy code
   +---------+          +------------+          +--------------+         +--------------+
   |   User  |          |  Restaurant |          |   Delivery   |         |   Order      |
   +---------+          +------------+          +--------------+         +--------------+
        |                      |                         |                       |
        |  Browse Menu          |                         |                       |
        |---------------------->|                         |                       |
        |                      |                         |                       |
        |  Place Order          |                         |                       |
        |---------------------->|                         |                       |
        |                      | Prepare Food            |                       |
        |                      |------------------------>|                       |
        |                      |                         | Assign Delivery       |
        |                      |                         |---------------------->|
        |                      |                         |                       |
        |                      |                         | Update Status: InProgress
        |                      |                         |---------------------->|
        |                      |                         |                       |
        |  Get Delivered Order  |                         |                       |
        |<------------------------------------------------|                       |
        |  Update Status: Delivered                       |                       |
        |<-----------------------------------------------------------------------|

مرحله 5: مدیریت خطا – اجازه ندهید چیزها بسوزند 🍳🔥

رسیدگی به خطاها بسیار مهم است زیرا سیستم های واقعی نور خورشید و رنگین کمان نیستند. فرض کنید شریک تحویل به دلیل بسته بودن جاده نمی تواند به رستوران برسد. آیا ما فقط گریه می کنیم؟ نه!

اضافه می کنیم مکانیسم های بازگشتی.

java
Copy code
class DeliveryPartner {
    public void pickOrder(Order order) throws DeliveryException {
        if (roadClosed()) {
            throw new DeliveryException("Road is closed!");
        }
        order.updateOrderStatus(OrderStatus.IN_PROGRESS);
    }

    private boolean roadClosed() {
        // Dummy logic to simulate a road closure
        return true;
    }
}

هنگامی که استثنا وجود دارد، سیستم شما ممکن است به کاربر اطلاع دهد، یک شریک تحویل جدید را مجدداً تعیین کند، یا از رستوران بخواهد سفارش جدیدی را در صورت تأخیر آماده کند.

مرحله 6: بهینه سازی ها و بهبودها 🏗️

اینجا قسمت سرگرم کننده است. پس از راه اندازی سیستم، می توانید به بهبودهایی مانند:

  • ذخیره سازی منوها برای کاهش تماس با پایگاه داده
  • چند رشته ای برای حجم های با سفارش بالا
  • بهینه سازی پایگاه داده مانند نمایه سازی یا اشتراک گذاری برای رسیدگی به میلیون ها کاربر که همزمان سیب زمینی سرخ کرده خود را سفارش می دهند 🍟.
java
Copy code
// Example of caching the menu
class MenuService {
    private Map<String, List<FoodItem>> cachedMenus = new HashMap<>();

    public List<FoodItem> getMenu(String restaurantId) {
        if (!cachedMenus.containsKey(restaurantId)) {
            cachedMenus.put(restaurantId, fetchMenuFromDB(restaurantId));
        }
        return cachedMenus.get(restaurantId);
    }

    private List<FoodItem> fetchMenuFromDB(String restaurantId) {
        // Fetch from DB
        return new ArrayList<>();
    }
}

نتیجه – این قدرت LLD است! 💪

طراحی سطح پایین برنامه نبرد شماست. این سیستم شما را برای بودن آماده می کند مقیاس پذیر، کارآمد، و قوی. در مثال تحویل غذا، طراحی کلاس، تعاملات، رسیدگی به خطاها و حتی بهینه سازی ها را بررسی کردیم. اگر LLD را به درستی دریافت کنید، سیستم شما مانند ماشینی است که به خوبی روغن کاری شده است و آماده است تا با هر چیزی که دنیا به سمت آن می زند، مقابله کند.

بنابراین دفعه بعد که در کدنویسی عمیق هستید، مانند یک معمار فکر کنید. بازیگران خود را بشناسید، دیالوگ های آن ها را بشناسید و نمایش را روان اجرا کنید.

اکنون، پیش بروید و شروع به قرار دادن آن ها کنید سفارشات… منظورم نوشتن آن هاست کلاس ها! 🍕💻

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

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

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

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