بعد سنوات من ملء الاستمارات والانتظار، حصلت أخيرًا على رخصتك المصرفية. هذا يعني أنك أصبحت الآن مؤهلًا رسميًا لفتح بنكك الخاص، هنيئًا لك!
أولويتك الأولى هي تشغيل أنظمة تقنية المعلومات. وبعد يوم من العمل الشاق، أصبحت قادرًا بالفعل على فتح الحسابات وإغلاقها، وعلى التعامل مع عمليات السحب والإيداع.
ولأنك لم ترغب في تكبّد عناء كتابة الاختبارات، دعوت بعض أصدقائك لمساعدتك في اختبار النظام. لكن بعد خمس دقائق فقط، ادّعى أحد أصدقائك أنه فقد المال! ورغم ثقتك بأن الكود الخاص بك خالٍ من الأخطاء، بدأت تتصفح السجلات للتحقيق.
آه أجل، كما توقعت تمامًا، صديقك هو المخطئ! فقد شارك بيانات اعتماده للاختبار مع صديق آخر، وتآمرا معًا على تنفيذ عمليات إيداع وسحب من الحساب نفسه على التوازي. ومن قد يفعل شيئًا كهذا؟
وبينما تجادل بأنه من المستحيل فعليًا أن يصل أحدهم إلى حسابه على التوازي، يخبرك صديقك بثقة متعالية أن قواعد العمل المصرفي تقتضي أن تدعم ذلك. إذن، لا دعم للعمليات المصرفية المتوازية، ولا إشارة انطلاق. فتُنهِد وتدوّن في ذهنك أن تعمل على هذا غدًا. سيؤخر ذلك تاريخ إطلاقك يومًا آخر على الأقل، ولكن حسنًا...
مهمتك هي تنفيذ حسابات بنكية تدعم الفتح والإغلاق والسحب والإيداع.
بما أن الحسابات البنكية يمكن الوصول إليها بطرق مختلفة (الإنترنت، والهواتف المحمولة، والخصومات التلقائية)، يجب أن يسمح برنامجك البنكي بالوصول إلى الحسابات بأمان من خيوط/عمليات متعددة (تختلف المصطلحات باختلاف لغة البرمجة لديك) في الوقت نفسه. على سبيل المثال، قد تحدث عمليات إيداع وسحب كثيرة في الوقت نفسه؛ عليك أن تضمن عدم وجود حالات تسابق بين قراءة رصيد الحساب وضبط الرصيد الجديد.
يجب أن يكون من الممكن إغلاق الحساب؛ فالعمليات على حساب مُغلق يجب أن تفشل.
يقدّم هذا التمرين التزامن.
لاجتياز الاختبار الأخير قد تجد الكلمة المفتاحية synchronized أو الأقفال مفيدة.
غالبًا ما تكون المشكلات الناتجة عن تشغيل الكود بشكل متزامن متقطعة، لأنها تعتمد على ترتيب تنفيذ الكود. لذلك يشغّل الاختبار الأخير الخيوط عدة مرات لزيادة فرص اكتشاف bug. وهذا يعني أن هذا الاختبار ينبغي أن يفشل إذا لم يكن تنفيذك آمنًا للخيوط، لكن هناك احتمال أن ينجح لمجرد عدم حدوث أي محاولة تعديل متزامنة. من غير المرجح أن يحدث هذا عدة مرات متتالية، لأن ترتيب تنفيذ الكود ينبغي أن يختلف في كل مرة تشغّل فيها الاختبار. لذا إذا شغّلت الاختبار الأخير بضع مرات ونجح في كل مرة، فيمكنك أن تكون مطمئنًا بدرجة معقولة إلى أن تنفيذك صحيح.
سجّل في Exercism لتتعلّم وتتقن Java عبر 26 مفهومًا158 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.