de_DEen_USes_ESfa_IRhi_INid_IDpt_PT

مقدمه

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

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


برگه راهنمای سریع نمودار کلاس UML

بخش ۱: بلوک‌های سازنده (نحو و راهنما)

قبل از ورود به مطالعه موردی، باید واژگان مورد استفاده در نمودارهای UML را تعیین کنیم.

۱. ساختار کلاس و دسترسی‌پذیری

یک کلاس با یک مستطیل که به سه بخش تقسیم شده است، نمایش داده می‌شود:

  • بالا:نام کلاس (مثلاً FlightBooking).

  • وسط:ویژگی‌ها/ویژگی‌های داده‌ای (مثلاً + nameProperty: String).

  • پایین:روش‌ها/عملیات (مثلاً + isActive(): boolean).

محدودکننده‌های دسترسی:

  • + عمومی:قابل دسترسی توسط هر کلاس دیگری.

  • - خصوصی:فقط درون همان کلاس قابل دسترسی است.

  • # محافظت‌شده:قابل دسترسی درون کلاس و زیرکلاس‌های آن.

  • ~ بسته:قابل دسترسی فقط درون همان بسته.

۲. انواع ویژه کلاس

  • رابط‌ها (<<interface>>):قراردادهایی که روش‌ها را بدون پیاده‌سازی تعریف می‌کنند. با یک جعبه سبز (در این برگه راهنما) یا نماد استاندارد نمایش داده می‌شوند.

    • مثال: UserRepoبا + method(): void.

  • کلاس‌های انتزاعی (<<abstract>>):کلاس‌های پایه‌ای که نمی‌توان مستقیماً آن‌ها را نمونه‌سازی کرد. ممکن است شامل روش‌های انتزاعی باشند.

    • مثال: Componentبا + render(): void // abstract.

  • آرایه‌های نام‌گذاری‌شده (Enumeration):مجموعه‌ای از ثابت‌های نام‌گذاری‌شده.

    • مثال: JobStatus.

مثال نمودار کلاس سیستم سفارش

 

@startuml
skinparam classAttributeIconSize 0
skinparam shadowing false

‘ — رابط‌ها —’
interface PaymentGateway {
+ process(amount: double): boolean
}

‘ — کلاس‌های انتزاعی —’
abstract class Order {
# orderId: String
# totalAmount: double
+ {abstract} calculateTax(): double
+ getSummary(): String
}

‘ — کلاس‌ها —’
class PhysicalOrder {
– shippingWeight: double
+ calculateTax(): double
}

class DigitalOrder {
– downloadLink: String
+ calculateTax(): double
}

class OrderItem {
– productName: String
– price: double
– quantity: int
}

class PayPalGateway {
+ process(amount: double): boolean
}

‘ — روابط —’
Order <|– PhysicalOrder
Order <|– DigitalOrder

Order *– “1..*” OrderItem : contains
Order ..> PaymentGateway : uses

PaymentGateway <|.. PayPalGateway

@enduml


بخش ۲: روابط و چندتایی

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

۱. انواع هم‌پیوندی

  • ارث‌بری (تعمیم‌یافتگی):خط توپر به همراه مثلث توخالی. رابطه «یک نوع از».

    • مثال: خودرو و موتورسیکلت از وسایل نقلیه.

  • پیاده‌سازی:خط چین به همراه مثلث توخالی. یک کلاس، قرارداد یک رابط را برآورده می‌کند.

    • مثال: خودرو پیاده‌سازی می‌کند قابل رانندگی.

  • ترکیب (مالکیت قوی):خط توپر به همراه الماس توپر. «بخش» نمی‌تواند بدون «کل» وجود داشته باشد.

    • مثال: رستوران (کل) مالک منو (بخش). اگر رستوران تعطیل شود، منو نیز از بین می‌رود.

  • تجمع:خط توپر به همراه یک الماس توخالی. رابطه‌ای «دارای-یک» که در آن بخش‌ها می‌توانند به‌طور مستقل وجود داشته باشند.

    • مثال: سفارشتجمع‌کننده رستوران (رستوران حتی اگر سفارش حذف شود، وجود دارد).

۲. راهنمای چندگانگی

اعداد در انتهای خطوط نشان‌دهنده کاردینالیته هستند:

  • 1: دقیقاً یکی.

  • 0..1: صفر یا یکی (اختیاری).

  • 1..*: یکی یا بیشتر (لیست اجباری).

  • *: بسیاری (صفر یا بیشتر).

مثال مفاهیم وراثت، پیاده‌سازی، ترکیب و تجمع

@startuml
« رابط‌ها و کلاس‌های پایه
interface Drivable {
+ drive()
}
کلاس انتزاعی Vehicle {
+ startEngine()
}
« کلاس‌ها
class Car {
}
class Motorcycle {
}
class Restaurant {
– name: String
}
class Menu {
}
class Order {
}
« روابط
« ۱. وراثت (عمومی‌سازی)
Vehicle <|– Car
Vehicle <|– Motorcycle
« ۲. پیاده‌سازی
Drivable <|.. Car
« ۳. ترکیب (مالکیت قوی)
Restaurant *– Menu : owns
« ۴. تجمّع
Order o– Restaurant : involves
« مثال‌های چندگانگی
« رستوران دارای یک یا چند منو است (۱..*)
« سفارش شامل صفر یا یک رستوران است (۰..۱)
Restaurant “1” *– “1..*” Menu
سفارش «۱» o– «۰..۱» رستوران
@enduml

بخش ۳: مطالعه موردی واقعی: پلتفرم یکپارچه تحویل غذا

این بخش نمودار مرکزی موجود در راهنمای سریع را تحلیل کرده و معماری یک برنامه تحویل غذا را تشریح می‌کند.

۱. سلسله‌مراتب کاربر (ارث‌بری و ترکیب)

سیستم با یک کلاس عمومی «کاربر» آغاز می‌شود که به عنوان «انتزاعی» علامت‌گذاری شده است. این اطمینان می‌دهد که هیچ شیء عمومی «کاربر» ایجاد نمی‌شود، بلکه فقط انواع خاص ایجاد می‌گردند.

  • ارث‌بری: مشتری و «راننده» کلاس «کاربر.

  • » را به ارث می‌برند. ترکیب:

    • مشتری دارای یک «آدرس ارسال» است (مالکیت قوی).

    • راننده دارای «جزئیات وسیله نقلیه» است (مالکیت قوی).

۲. اکوسیستم رستوران و منو

این بخش تو در تو شدن عمیق و مجموعه‌ها را به نمایش می‌گذارد.

  • پیاده‌سازی رابط: رستوران پیاده‌سازی می‌کند <<رابط>> قابل‌مکان‌یابی، اطمینان از اینکه هر رستوران داده‌های مکانی دارد.

  • زنجیره ترکیب:

    • رستوران (۱) مالکیت قوی دارد منو (1).

    • منو شامل دسته‌بندی منو (1..*).

    • دسته‌بندی منو شامل قلم منو (*).

    • توجه: این ساختار تضمین می‌کند که یک قلم منو بدون یک دسته‌بندی وجود ندارد، و دسته‌بندی نیز بدون یک منو وجود ندارد.

۳. پردازش سفارش و پرداخت‌ها

  • ساختار سفارش:

    • سفارش دارای رابطه‌ای با رستوران (تجمع).

    • سفارش مالکیت قوی دارد قلم خط سفارش (1..*).

    • سفارش دارای یک پرداخت (0..1)، که نشان می‌دهد پرداخت در مرحله اولیه ایجاد اختیاری است.

  • استراتژی پرداخت (چندریختی):

    • سیستم از یک رابط استفاده می‌کند<<interface>> پرداخت‌پرداز.

    • کلاس‌های عینیStripeProcessor و PayPalProcessor این رابط را پیاده‌سازی می‌کنند. این امکان را به سیستم می‌دهد تا درگاه‌های پرداخت را بدون تغییر هستهسفارش منطق تغییر دهد.

4. کلاس انتزاعی در مقابل رابط (مثال خودرو)

بخش بالا سمت راست برگه راهنما یک اشتباه رایج را روشن می‌کند:

  • کلاس انتزاعی (خودرو): خودرو و موتورسیکلت از خودرو به‌دست می‌آورند. این بدان معناست که آن‌ها داده‌ها/ساختار اصلی مشترکی دارند (مثلاًنوع موتور, چرخ‌ها).

  • رابط (قابل‌رانندگی): خودرو پیاده‌سازی می‌کند قابل رانندگی. این به این معناست که خودرو رفتار خاصی دارد (drive()) که موتورسیکلت ممکن است نداشته باشد (یا ممکن است به صورت متفاوتی پیاده‌سازی شود).


بخش ۴: تجسم با PlantUML

در زیر کد PlantUML برای تولید ساختار اصلی «پلتفرم یکپارچه تحویل غذا» که در مطالعه موردی توصیف شده است، آورده شده است. می‌توانید این کد را در هر ویرایشگر PlantUML کپی کنید تا نمودار را مشاهده کنید.

@startuml
' Skinparams for styling to match the cheatsheet vibe
skinparam classAttributeIconSize 0
skinparam linetype ortho
skinparam shadowing false

' --- LEGEND / STEREOTYPES ---
interface "Drivable" as Drivable {
  + drive(): void
}

interface "Locatable" as Locatable {
  + getCoordinates(): Coordinate
}

interface "PaymentProcessor" as PaymentProcessor {
  + process(amount: double): boolean
}

abstract class "User" as User {
  # id: int
  # name: String
  # email: String
  + login(): void
}

abstract class "Vehicle" as Vehicle {
  # model: String
  # year: int
}

class "Car" as Car
class "Motorcycle" as Motorcycle
class "Customer" as Customer
class "Driver" as Driver
class "Restaurant" as Restaurant
class "Menu" as Menu
class "MenuCategory" as MenuCategory
class "MenuItem" as MenuItem
class "Order" as Order
class "OrderLineItem" as OrderLineItem
class "Payment" as Payment
class "StripeProcessor" as StripeProcessor
class "PayPalProcessor" as PayPalProcessor

' --- RELATIONSHIPS ---

' Vehicle Hierarchy
Vehicle <|-- Car
Vehicle <|-- Motorcycle
Car ..|> Drivable : Implements

' User Hierarchy
User <|-- Customer
User <|-- Driver

' Customer/Driver Compositions
Customer *-- "1" ShippingAddress : Strong Ownership
Driver *-- "1" VehicleDetails : Strong Ownership

' Restaurant Ecosystem
Restaurant ..|> Locatable : Implements
Restaurant "1" *-- "1" Menu : Composition
Menu "1" *-- "1..*" MenuCategory : Collection
MenuCategory "1" *-- "*" MenuItem : Collection

' Order Ecosystem
Order "1" o-- "1" Restaurant : Aggregation
Order "1" *-- "*" OrderLineItem : Composition
Order "1" --> "0..1" Payment

' Payment Processors
PaymentProcessor <|.. StripeProcessor
PaymentProcessor <|.. PayPalProcessor

' Specific Associations (Self Association Example from legend)
class "Employee" as Employee
Employee --> "reports to" Employee

@enduml

نتیجه‌گیری

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

با پایبندی دقیق به قواعد نحو مربوط به تعداد (1, , 1..) و مالکیت (ترکیب در برابر تجمّع)، تیم‌ها می‌توانند از دام‌های معماری مانند رکوردهای داده‌ی یتیم یا طراحی‌های سخت‌گیرانه‌ای که گسترش آن‌ها دشوار است، پیشگیری کنند. چه در حال طراحی یک سیستم ورود ساده باشید و چه یک بازارگاه چندفروشنده، یک نمودار کلاس UML به‌خوبی طراحی‌شده همچنان مؤثرترین ابزار برای انتقال چشم‌انداز شما باقی می‌ماند.