التعداد

يكون التقسيم المنطقي إما:

  1. منفصلاً: (إما أ وإما ب)
  2. متداخلاً: (أ أو ب أو كلاهما)

ويتحقق في لغات البرمجة بالتعداد (Enumeration) حيث يكون للانفصال (StrEnum) وللتداخل (Flag) وربما ليس ظاهرًا من هذه التسميات ما تدل عليه؛ لكن ليس هذا موضع البسط فلن نتكلم عن ذلك. ونشرع فيما يفيد.

تعداد الأقسام المنفصلة

الانفصال (Mutual Exclusion) هو امتناع الجمع بين الاحتمالات. فلا يكون الاتجاه شمالاً وجنوبًا في نفس الوقت، ولا اليوم سبتًا وجمعةً في نفس الوقت، ولا الشيء مهمًّا وغير مهم في نفس الوقت،و هلم جرا.

تقسيم منفصل: م تتفرع إلى ح وط ون؛ ح إلى ج وخ؛ ط إلى ض وظ وص؛ ظ إلى س وش.

لتعريف هذا التقسيم نعرِّف أصنافًا بكلمة (class) ونضيف لها StrEnum بين القوسين، كما هو موضَّح في القطعة التالية (وهذه الأصناف لا رابط بينها وإنما أردنا بيان كيفية وصف التقسيم الثنائي):

عرض الخيارات

ويصلح بعد التعريف أن تعرض الخيارات -بترتيب تعريفها- بحلقة التكرار for على هذا النحو:

ثم يختار المستخدم أحدها، فيأتي اختياره نصًّا فنحوله إلى أحدها:

تعداد الأحوال وتقييد الانتقال بينها

مما يركب منه التقسيم المنفصل: ما يمكن من أحوال.

مثلاً إذا كانت هذه أحوال الطلب:

يقود الانتقال

فيمكن تحديد الانتقال الجائز بتعريف قاموس يربط بين كل حال ومجموعة الحالات الممكنة منه:

صياغة النوع هي: dict[OrderStatus, set[OrderStatus]].

التحقق من القيود

ثم نطبق منطق التحقق بالدالة is_possible هكذا:

تعداد الأقسام المتداخلة

التداخل (Overlap) هو جواز الجمع بين الاحتمالات.

مخطط فن لثلاث دوائر متداخلة، مع تقاطع مشترك بينها جميعًا.

نستعمل Flag بدلاً من StrEnum لتحقيق التقسيم المتداخل في بايثون على هذا النحو:

ويمكن تركيب الأنواع بنيها باستعمال auto ثم يتأتى لنا إما:

  • بعلامة (أو) |
  • أو بعلامة متمّم الخيار ~ على أحدها (مثل: NONE في المثال)

التحقق من معيَّن

نفترض أن قاعدة بيانات المستخدم الذي سجل دخوله، يحمل هذين الوصفين (وقد تم تعيينهما للمتغير editor_access هنا). ثم نريد التحقق أولاً مما إذا كانت له صلاحية الكتابة إن أراد الكتابة:

وكذلك في الحذف:

مثال عملي يجمع النوعين من التعداد

نمثل اشتراك المستخدم بباقة واحدة من Tier، وبميزات من Feature يمكن الجمع بينها. يوضح المخطط كيف تختار دالة describe الوصف الذي تطبعه:

في المثال سنختار الباقة الاحترافية مع التحليلات (ANALYTICS) والواجهة التجريبية؛ فتكون النتيجة الفئة Y، لأن التحليلات لا تدخل في الشروط التي نفحصها.

سنضع الشروط في دالة describe تستقبل الباقة والميزات، وتطبع وصف الاشتراك.