منطق السحب
جزء من قسم البرمجة كائنية التوجه في رحلة C على Coddy. الدرس 25 من 61.
التحدي
سهلحسابك المصرفي ينمو! لنضف الآن إمكانية سحب الأموال. بخلاف الإيداعات، تفرض عمليات السحب قيدًا إضافيًا. لا يمكنك سحب أموال أكثر مما لديك. يجب أن تتحقق withdraw function من balance قبل السماح بالمعاملة.
بالاعتماد على مشروع Bank Account الحالي، ستوسّع الوحدة بإضافة وظيفة السحب. هنا تتألق آلية التغليف حقًا. يمكن لـ function الوصول إلى balance المخفي للتحقق من كفاية الأموال، وهو أمر لا يمكن للكود الخارجي القيام به مباشرةً.
ستعمل باستخدام ثلاثة ملفات:
account.h: أضف prototype جديدًا لـwithdraw. تأخذ هذه function مؤشرًا إلى Account ومبلغًا من نوعdouble، وتُرجعint(القيمة 1 في حالة success، والقيمة 0 إذا فشلت عملية السحب). أبقِ جميع التصريحات الحالية الخاصة بـcreate_accountوdestroy_accountوdeposit.account.c: Implement functionwithdraw. يجب أن تنجح عملية السحب only عند تحقق شرطين: يجب أن يكون المبلغ موجبًا (أكبر من الصفر)، AND يجب أن يمتلك الحساب أموالًا كافية (balance >= amount). إذا تحقق الشرطان، اطرح المبلغ من balance وأرجع 1. وإلا، أرجع 0 without modifying balance.main.c: اعرض سير العمل الكامل للإيداع وwithdraw. أنشئ حسابًا، ونفّذ إيداعًا لإنشاء balance، ثم اختبر عمليات السحب: الناجحة وغير الناجحة.
ستتلقى أربع مُدخلات: account ID (عدد صحيح)، وdeposit amount (لإنشاء الأموال الأولية)، وsuccessful withdrawal amount (أقل من أو يساوي المبلغ المُودَع)، وfailed withdrawal amount (أكبر من balance المتبقي).
في ملفك الرئيسي، أنشئ حسابًا واطبع تأكيدًا. أودِع الأموال الأولية واطبع النتيجة. ثم نفّذ عملية السحب الناجحة واطبع ما إذا كانت قد نجحت. وأخيرًا، حاول تنفيذ عملية السحب التي يُفترض أن تفشل (بسبب عدم كفاية الأموال) واطبع النتيجة. أتلف الحساب وأكّد اكتمال التنظيف.
اطبع الناتج بهذا التنسيق:
Account 1001 created
Deposit 500.00: 1
Withdraw 200.00: 1
Withdraw 400.00: 0
Account destroyedحيث إن 1001 هو account ID، و500.00 هو مبلغ الإيداع، و200.00 هو successful withdrawal، و400.00 هو failed withdrawal (لأنه لا يتبقى سوى 300.00 بعد عملية السحب الأولى). نسّق جميع المبالغ باستخدام منزلتين عشريتين عبر %.2f.
تُظهر withdraw function قوة التغليف. إذ يمكنها التحقق من balance المخفي داخليًا لاتخاذ القرارات، في حين لا يملك الكود الخارجي أي وسيلة لتجاوز عملية التحقق هذه أو الاطلاع على balance مباشرةً.
جرّب بنفسك
#include <stdio.h>
#include "account.h"
int main() {
int account_id;
scanf("%d", &account_id);
double valid_amount;
scanf("%lf", &valid_amount);
double invalid_amount;
scanf("%lf", &invalid_amount);
Account* account = create_account(account_id);
printf("Account %d created\n", account_id);
int result_invalid = deposit(account, invalid_amount);
printf("Deposit %.2f: %d\n", invalid_amount, result_invalid);
int result_valid = deposit(account, valid_amount);
printf("Deposit %.2f: %d\n", valid_amount, result_valid);
destroy_account(account);
printf("Account destroyed\n");
return 0;
}جميع دروس البرمجة كائنية التوجه
1أساسيات البرمجة التركيبية
ملفات الترويسةحواجز التضمينملفات المصدرالدوال الساكنةمراجعة: آلة حاسبة تركيبية4التغليف (Encapsulation)
مفهوم الـ Opaque Pointersتعريف الـ Opaque Structsالـ Getters والـ Settersالتحقق من البيانات في الـ Settersملخص: الصندوق السري2الكائنات والأساليب
الـ Structs ككائناتمؤشر 'Self'صحة استخدام Constالمؤشر مقابل القيمةالأساليب المساعدةملخص: Point Manager5مشروع: حساب بنكي بسيط
إعداد المشروعتنفيذ الحساب3دورة حياة الكائن
نمط المنشئ (Constructor Pattern)نمط الهادم (Destructor Pattern)تهيئة الـ Stackالنسخ العميق (Deep Copy)مراجعة: String Wrapper6الوراثة عبر التركيب
تضمين الـ Structقاعدة العضو الأولالوصول إلى أعضاء الأبعملية الـ Upcastingمراجعة: هرمية الأشكال9مشروع: رسّام الأشكال
نظرة عامة على المشروعتنفيذ الدائرةتنفيذ المستطيلاستخدام تعدد الأشكالحاوية الأشكالتدرّب بنفسك: مترجم C عبر الإنترنت