Enum تلميحات ونصائح

اذا كان لديك enumerator لتحديد حالات عنصر, قد تجد من المفيد مراعاة هذه القواعد:

  • إجعل اسم الحالة ذا معنى محدد.
  • وإجعل قيمته ( في كثير من الحالات ) مضاعفات الخمسة.
  • وأخيرا, تجنب ان تكون المسميات بالنفي.

مثال:

لديك فاتورة لها مسارات عمل كالتالي:

  • عند انشاء الفاتورة ولم تدفع …..
  • عند سداد الفاتورة …….
  • عند انتهاء مهلة السداد ……
  • عند وجود مشكله يتم الغاء الفاتورة….

وعليه, قد ينتج بناء على المسارات السابقة حالات ٤ ( اختصارا ) هي غير مدفوعة, مدفوعة, منتهية, أو ملغاة.

from enum import Enum
class Status(Enum):
    UNPAID = 1
    PAID = 2
    EXPIRED = 3
    CANCELED = 4

الحالة الأولى في المثال مشكل فيها انها تداخل مع الحالتين ملغاة و منتهية,

ولكي يتضح الخلل في هذه التسمية خذ هذا النص كمتطلب:

“يجب ارسال تنبيه للعميل لمراجعة كل الفواتير الغير مدفوعة”

هذه الجملة “واضح” ان العميل سيتلقى تنبيه لمراجعة الفواتير المنتهية والملغاة والغير مدفوعة.

لكن لو عدلنا كلمة في الجملة وكانت كالتالي:

“يجب ارسال تنبيه للعميل لسداد كل الفواتير الغير مدفوعة”

قد يبدو بديهيا أن المقصود هو كل الفواتير غير المدفوعة “واللتي يمكن سدادها” لكن “بديهيا” كلمة نسبية.

وإن صحت التسمية “غير مدفوعة” فما المانع من التسميات “غير ملغاة” و “غير منتهية”. مما يقودك لأن تضطر إلى ان تجعل للفاتورة حالة دفع, حالة الغاء, حالة سريان,,,,, مما يعني ان كل حالة ستكون في حقل خاص … 😮‍💨

bill.payment_status = PAID
bill.expire_status = NOT_EXPIRED
bill.cancel_status = NOT_CANCELED

🥹🤓

حسنا, اذا استبدلنا الحالة “غير مدفوعة” بـ “جديدة” فتكون الجملة بالشكل التالي:

“يجب ارسال تنبيه للعميل لسداد كل الفواتير الجديدة”

الآن الحالات الاربع تصبح:

جديدة [ قيمتها ١٠]

مدفوعة [ قيمتها ٢٠]

منتهية [ قيمتها ٣٠ ]

ملغاة [ قميتها ٤٠ ]

from enum import Enum
class Status(Enum):
    NEW = 10
    PAID = 20
    EXPIRED = 30
    CANCELED = 40

الآن الفاتورة الجديدة لن يكون لها معنا "بديها" يستنبط من سياق الجملة

لنفرض الآن وجود مسار جديد خاص بالاسترداد بحيث تكون حالة الفاتورة مستردة. قد تجد ان هذه الحالة تكون بعد دفع الفاتورة مباشرة "فقط" سيكون هذا التعديل متوافق مع مخططات سير الفاتورة

from enum import Enum
class Status(Enum):
    NEW = 10
    PAID = 20
    REFUND = 25
    EXPIRED = 30
    CANCELED = 40

هذا والله الموفق 🤓