پس از سالها پر کردن فرم و انتظار کشیدن، بالاخره مجوز بانکی خود را گرفتهاید. یعنی حالا رسماً میتوانید بانک خودتان را باز کنید، هورا!
اولین اولویتتان راهاندازی سیستمهای فناوری اطلاعات است. پس از یک روز کار سخت، هماکنون میتوانید حساب باز کنید و ببندید و همچنین برداشتها و واریزها را انجام دهید.
چون حوصلهی نوشتن Test را نداشتید، از چند دوست میخواهید که در آزمایش سیستم کمکتان کنند. اما فقط پنج دقیقه بعد، یکی از دوستانتان ادعا میکند که پول از دست داده است! هرچند مطمئنید که کدتان بدون Bug است، شروع میکنید لاگها را بررسی کنید تا بفهمید چه شده است.
آهان، دقیقاً همانطور که حدس میزدید، مقصر خود دوستتان است! او اطلاعات ورود آزمایشیاش را با دوست دیگری به اشتراک گذاشت و با هم توطئه کردند تا بهصورت موازی از همان حساب واریز و برداشت انجام دهند. چه کسی چنین کاری میکند؟
در حالی که شما بحث میکنید که از نظر فیزیکی غیرممکن است کسی بهصورت موازی به حساب خود دسترسی پیدا کند، دوستتان با خودپسندی به شما اطلاع میدهد که قوانین بانکی ملزمتان میکند که از این پشتیبانی کنید. بنابراین، بدون پشتیبانی از بانکداری موازی، سیگنالی برای راهاندازی در کار نیست. آهی میکشید و در ذهن خود یادداشت میکنید که فردا به این موضوع رسیدگی کنید. این کار تاریخ راهاندازی شما را حداقل یک روز دیگر عقب میاندازد، اما خب...
وظیفهی شما پیادهسازی حسابهای بانکیای است که از باز کردن و بستن، برداشت و واریز پول پشتیبانی میکنند.
از آنجا که میتوان از راههای گوناگون به حسابهای بانکی دسترسی داشت (اینترنت، تلفن همراه، کسرهای خودکار)، نرمافزار بانکی شما باید طوری باشد که بتوان بهطور موازی و ایمن از چند ریسمان/فرایند (اصطلاح آن بسته به زبان برنامهنویسی شما متفاوت است) به حسابها دسترسی داشت. برای نمونه، ممکن است واریزها و برداشتهای زیادی بهطور موازی رخ دهند؛ باید مطمئن شوید که میان خواندن موجودی حساب و تنظیم موجودی جدید، «شرایط رقابتی» رخ نمیدهد.
بستن حساب باید ممکن باشد؛ عملیاتی که روی حساب بسته انجام میشود باید با شکست مواجه شود.
تستها برخی عملیات را بهصورت همروند اجرا میکنند.
باید تلاش کنید مطمئن شوید که عملیات روی Account آن را در وضعیت سازگار باقی میگذارند.
برای مثال: چندین goroutine ممکن است بهطور همزمان پول واریز و برداشت کنند، دو برداشت که بهصورت همروند انجام میشوند نباید بتوانند موجودی را منفی کنند.
وقتی بهصورت محلی کار میکنید، میتوانید تست کنید که کدتان همروندی را درست مدیریت میکند و رقابت داده ایجاد نمیکند، تستها را با روشن بودن پرچم -race اجرا کنید.
cd exercism/project/directory/go/bank-account
go test -race
اگر در Go با عملیات همروند تازهکار هستید، ارزش دارد نگاهی به پکیج sync بیندازید، بهطور خاص Mutexها: