به نظرم با اینکه ایدهی منو محور قشنگ و کاربرپسنده، ولی از دید طراحی سیستم و برنامهنویسی سرور، سیستم فعلی منطقیتره و تغییرش ریسک الکیه. چند تا دلیلش رو دقیقتر میگم:
Giftcard عملاً یه Transaction Object جداست
تو سیستم فعلی، هر گلدی که از سایت میاد تبدیل میشه به یه آبجکت مستقل با:
ID مشخص
مقدار ثابت
وضعیت (Unused / Sold / Redeemed)
این از نظر برنامهنویسی خیلی تمیزه، چون هر عملیات فقط روی همون آبجکت انجام میشه، نه روی کل اکانت
سیستم پیشنهادی کاملاً State-based میشه
تو مدلی که گفتی، سرور باید چند تا State رو نگه داره:
پلیر چه گلدی انتخاب کرده
قیمت چی گذاشته
خریدار کیه
منتظر تأیید هست یا نه
این State ها تو Pawn و Dialog خیلی حساسن و با یه DC یا Timeout کل فلو میریزه به هم
مدیریت Cancel و Edge Case ها پیچیده میشه
Cancel زدن، عوض کردن اسم پلیر، آفلاین شدن خریدار، Lag دیتابیس…
اینا تو سیستم کدی تقریباً اهمیتی ندارن، ولی تو سیستم منویی باید براشون کلی Handler نوشته بشه
Race Condition به شکل جدی وارد ماجرا میشه
فرض کن همزمان دو نفر بخوان با یه پلیر معامله کنن یا پلیر همزمان Sell و Redeem بزنه
وقتی گلد یه عدد داخل اکانته، باید قفل نرمافزاری (Lock) بزنی که تو Pawn پیادهسازیش دردسر داره
Giftcard چون واحد جداست، ذاتاً Race-safe تره
Rollback و Fail-safe سختتر میشه
الان اگه یه معامله Fail بشه، کد هنوز Unused میمونه
ولی تو سیستم پیشنهادی، اگه وسط کار پول کم بشه ولی گلد منتقل نشه، باید Rollback دستی بزنی که هم پیچیدهست هم پرریسک
لاگگیری و Debug کردن سختتر میشه
الان لاگ میگه:
Giftcard #12345 Redeemed by X
تمیز، مشخص
ولی تو سیستم جدید باید از روی چندین رکورد بفهمی این عدد گلد دقیقاً از کجا کم یا زیاد شده