AzLearn

تجميع فاتورة صغيرة

Small Price Summary

تطبيق ~20 دقيقة

تجميع فاتورة صغيرة — Small Price Summary

بعد المتغيرات والأنواع والدوال والتحكم في التدفق، نحتاج تمريناً يربطها في شيء يشبه كود العمل اليومي: حساب ملخص طلب.

سنبدأ من أرقام بسيطة، ثم نغلف الحسابات في دوال صغيرة، ثم نطبع نتيجة واضحة.

فكرة الدرس ليست أن تحفظ معادلة الخصم، بل أن ترى كيف يتحول وصف بسيط مثل “احسب قيمة الطلب ثم اطرح الخصم” إلى كود مقروء. في المشاريع الحقيقية ستقابل هذا الشكل كثيراً: سعر، كمية، ضريبة، خصم، شحن، ثم سطر أو تقرير يراه المستخدم. كل قيمة لها نوع، وكل حساب له مكان، وكل دالة يجب أن تحمل اسماً يشرح النية.

انتبه أيضاً إلى أن هذا الدرس يستخدم float64 للتبسيط التعليمي. في أنظمة البيع الحقيقية نفضل غالباً تمثيل المال بوحدات صحيحة مثل الهللات حتى نتجنب مفاجآت الأرقام العشرية. لكنك الآن تتعلم الأساسيات، لذلك سنبقي المثال صغيراً ونركز على القراءة، التحويل بين الأنواع، وتقسيم الكود إلى دوال.

الخطوة 1: ابدأ بالبيانات

main.go

لاحظ التحويل float64(quantity). في Go لا يتم خلط int و float64 تلقائياً؛ أنت تختار التحويل بوضوح.

هذا الوضوح مقصود. لو سمحت اللغة بخلط الأنواع تلقائياً، فقد تمر أخطاء صغيرة دون أن تراها. عندما تكتب التحويل بنفسك فأنت تقول للقارئ: “أعرف أن الكمية عدد صحيح، وأريد استخدامها داخل حساب عشري”. هذا مهم جداً في كود الفواتير لأن الخطأ في النوع قد يتحول إلى خطأ في الرقم النهائي.

الخطوة 2: انقل الحساب إلى دالة

الدالة تجعل النية أوضح، وتجعل الحساب قابلاً لإعادة الاستخدام.

main.go

القاعدة العملية هنا: إذا استطعت تسمية الحساب باسم واضح، فغالباً يستحق دالة صغيرة. اسم subtotal أفضل من تكرار unitPrice * float64(quantity) في أكثر من مكان. الدالة الصغيرة تسهّل الاختبار لاحقاً، وتقلل احتمال أن يغير مطور الحساب في موضع وينسى موضعاً آخر.

الخطوة 3: أضف خصماً بشرط واضح

سنطبق خصماً إذا تجاوز الإجمالي 100 ريال. لا تجعل الشرط مخفياً داخل الطباعة؛ ضعه في دالة باسم واضح.

main.go

لاحظ أننا أرجعنا قيمة الخصم، لا الإجمالي بعد الخصم. هذا قرار تصميم صغير لكنه مفيد: دالة discount مسؤولة عن حساب الخصم فقط، وmain أو دالة أعلى منها مسؤولة عن تركيب الملخص النهائي. عندما تبقى المسؤوليات صغيرة، يصبح تغيير قاعدة الخصم لاحقاً أسهل. مثلاً لو تغيرت القاعدة إلى 15% فوق 300 ريال، ستعدل دالة واحدة دون لمس الطباعة.

الخطوة 4: اجعل الطباعة ملخصاً واحداً

النتيجة التي يحتاجها المستخدم ليست تفاصيل تقنية. يحتاج سطراً مفهوماً.

main.go

أخطاء شائعة قبل التحدي

أول خطأ هو الاعتماد على القيم داخل الرأس بدلاً من تمريرها للدوال. الدالة الجيدة لا تحتاج أن تعرف اسم المنتج أو مصدر البيانات؛ تأخذ مدخلات واضحة وترجع نتيجة واضحة. ثاني خطأ هو استخدام Println عندما تحتاج تنسيقاً ثابتاً للأرقام. في الفواتير نريد رقمين بعد الفاصلة، لذلك fmt.Printf مع %.2f أنسب. ثالث خطأ هو جعل الشرط غامضاً: if total > 100 يختلف عن if total >= 100، والفرق قد يظهر عند قيمة 100 بالضبط.

قبل حل التمرين، افحص السلسلة ذهنياً: هل حسبت الإجمالي قبل الخصم؟ هل حسبت مبلغ الخصم لا النسبة فقط؟ هل طرحت الخصم من الإجمالي؟ هل استخدمت نفس ترتيب القيم في Printf؟ هذه الأسئلة الصغيرة تمنع معظم أخطاء هذا النوع من البرامج.

تمرين موجه

أكمل الدوال بحيث تطبع النتيجة المطلوبة. ابدأ بالحسابات الصغيرة ثم اربطها في main.

تحدي — Challenge

خلاصة

بناء ملخص سعر صغير يجمع أكثر من مهارة أساسية في Go: تعريف المتغيرات، اختيار النوع المناسب، التحويل الصريح، كتابة دوال قصيرة، واستخدام شرط واضح. عندما تقرأ كودك بعد الانتهاء يجب أن تستطيع شرح كل سطر بجملة عمل بسيطة: “احسب الإجمالي”، “احسب الخصم”، “اطبع المستحق”. إذا احتجت شرحاً طويلاً لسطر واحد، فهذه إشارة إلى أن السطر يحتاج اسماً أو دالة.