محمدرضا و تیمش مشغول طراحی سامانهای برای مدیریت کیف پول دیجیتال بهنام دیجیوالِت هستند. در نسخهی اولیهی این سامانه قرار است قابلیتهای زیر وجود داشته باشد:
- امکان ایجاد تراکنش و تغییر وضعیت آن
- امکان مشاهدهی لیست تراکنشها
- امکان تسویهحساب
- امکان مشاهدهی موجودی کیف پول
تیم محمدرضا ساختار برنامه را طراحی کردهاند و از شما میخواهند تا پیادهسازی آن را انجام دهید.
جزئیات پروژه
پروژهی اولیه را از این لینک دانلود کنید.
ساختار فایلها
src
└── ir
└── digipay
└── digiwallet
├── model
│ ├── AdminWallet.java
│ ├── Transaction.java
│ ├── TransactionStatus.java
│ ├── TransactionType.java
│ └── Wallet.java
├── repository
│ ├── CrudRepository.java
│ ├── TransactionRepository.java
│ └── TransactionRepositoryImpl.java
├── service
│ ├── AdminWalletService.java
│ └── WalletService.java
├── Application.java
└── DigiWalletSampleTest.java
مدلها
- کیف پول (
Wallet)- این مدل تنها شامل یک شناسه از نوع
Stringاست.
- این مدل تنها شامل یک شناسه از نوع
- کیف پول مربوط به ادمینهای برنامه (
AdminWallet)- این مدل از کلاس
Walletارثبری میکند و هیچ پیادهسازی اضافهای نسبت به مدلWalletندارد.
- این مدل از کلاس
- نوع تراکنش (
TransactionType): این کلاس یکenumاست که بهترتیب شامل دو مقدارDEPOSITوWITHDRAWALاست.- تراکنشهایی که از نوع
DEPOSITهستند، بیانگر واریزهایی هستند که مقصد آنها، کیف پول فعلی است. - تراکنشهایی که از نوع
WITHDRAWALهستند، بیانگر برداشتهایی هستند که از کیف پول به حساب بانکی صاحب کیف پول منتقل میشوند.
- تراکنشهایی که از نوع
- وضعیت تراکنش (
TransactionStatus): این کلاس یکenumاست که بهترتیب شامل سه مقدارCANCELED،PENDINGوACCEPTEDاست. - تراکنش (
Transaction)- این مدل بهترتیب شامل پراپرتیهای زیر است:
long id: شناسهی تراکنشWallet wallet: کیف پول مربوط به تراکنشTransactionType type: نوع تراکنشBigDecimal amount: مبلغ تراکنشDate createdAt: زمان ایجاد تراکنشTransactionStatus status: وضعیت تراکنش با مقدار اولیهیPENDINGDate updatedAt: زمان تغییر وضعیت تراکنش
- همهی پراپرتیها بهجز پراپرتی
updatedAtدر کانستراکتور مقداردهی میشوند. - متد
setStatusرا طوری پیادهسازی کنید که با دریافت یکTransactionStatus، وضعیت تراکنش را به وضعیت واردشده تغییر داده و مقدار پراپرتیupdatedAtرا برابر با یک آبجکت جدید از نوعDateقرار دهد.
- این مدل بهترتیب شامل پراپرتیهای زیر است:
مخزنها
- اینترفیس
CrudRepository<T, ID>- این اینترفیس شامل دو پارامتر جنریک
T(نوع مدل) وID(نوع شناسهی مدل) است. - این اینترفیس شامل تعریف متدهای زیر است:
boolean add(T t): این متد، مدل را به مخزن اضافه میکند؛ به شرط آن که مدل از قبل در مخزن وجود نداشته باشد. اگر مدل از قبل در مخزن موجود باشد، مقدارfalseو در غیر اینصورت، مقدارtrueرا برمیگرداند.List<T> getAll(): این متد، لیست همهی مدلهای ذخیرهشده را بهترتیب درج برمیگرداند.T get(ID id): این متد، مدلی که شناسهی آن برابر باidاست را برمیگرداند. اگر چنین مدلی یافت نشود، مقدارnullرا برمیگرداند.List<T> get(Predicate<T> predicate): این متد، لیست مدلهایی که شرایط دادهشده درpredicateرا دارند بهترتیب درج برمیگرداند.
- این اینترفیس شامل دو پارامتر جنریک
- اینترفیس
TransactionRepository- این اینترفیس از اینترفیس
CrudRepositoryارثبری میکند و صرفاً نوع تراکنشها (کهTransactionاست) و نوع شناسهی آنها (کهLongاست) را مشخص میکند.
- این اینترفیس از اینترفیس
- کلاس
TransactionRepositoryImpl- این کلاس، اینترفیس
TransactionRepositoryرا پیادهسازی میکند و تراکنشهای مربوط به همهی کیف پولها در آن ذخیره میشود. - متدهای این کلاس را مطابق توضیحات اینترفیس
CrudRepositoryپیادهسازی کنید. - در متد
addاگر مبلغ تراکنش کوچکتر یا مساوی صفر باشد، یکIllegalArgumentExceptionباید پرتاب شود.
- این کلاس، اینترفیس
سرویسها
- سرویس
WalletService- از این کلاس برای مدیریت کیف پولها استفاده میشود.
- متد
addTransactionرا طوری پیادهسازی کنید که با دریافت یک تراکنش، با فراخوانی متدaddازtransactionRepository، آن را به لیست تراکنشها اضافه کند. این متد در صورتی که تراکنش از قبل موجود باشد، باید مقدارfalseو در غیر اینصورت، باید مقدارtrueرا برگرداند. - متد
getTransactions(Wallet wallet)را طوری پیادهسازی کنید که لیست همهی تراکنشهایی که مربوط به کیف پول ورودی هستند را بهترتیب درج برگرداند. - متد
getTransactions(Wallet wallet, Predicate<Transaction> predicate)را طوری پیادهسازی کنید که لیست همهی تراکنشهایی که مربوط به کیف پول ورودی هستند و شرایط دادهشده درpredicateرا دارند بهترتیب درج برگرداند. - متد
getBalanceرا طوری پیادهسازی کنید که با دریافت یک کیف پول، موجودی حساب کیف پول را در قالب یکBigDecimalبرگرداند. موجودی حساب برابر با مجموع مبلغDEPOSITهایACCEPTEDمنهای مجموع مبلغWITHDRAWALهایACCEPTEDاست. - متد
setTransactionStatusرا طوری پیادهسازی کنید که با دریافت یک تراکنش و وضعیت جدید، در صورتی که وضعیت تراکنشPENDINGنبود یا وضعیت جدید برابر باPENDINGبود، مقدارfalseرا برگرداند. در غیر اینصورت، اگر تراکنش از نوعWITHDRAWALبود و موجودی کیف پول به اندازهی مبلغ تراکنش نبود، یکIllegalArgumentExceptionپرتاب شود. در غیر اینصورت، وضعیت تراکنش به وضعیت جدید تغییر کند، مقدار پراپرتیupdatedAtتراکنش بهروز شود و مقدارtrueبرگردانده شود.
- سرویس
AdminWalletService- این کلاس از کلاس
WalletServiceارثبری میکند. - متد
getTransactions(Predicate<Transaction> predicate)را طوری پیادهسازی کنید که لیست همهی تراکنشهای مربوط به همهی کیف پولها که شرایط دادهشده درpredicateرا دارند بهترتیب درج برگرداند. - متد
getAllTransactionsرا طوری پیادهسازی کنید که لیست همهی تراکنشهای مربوط به همهی کیف پولها (همهی تراکنشهای موجود در مخزن) را بهترتیب درج برگرداند.
- این کلاس از کلاس
نکات
- لازم نیست که ذخیرهسازی مقدار مدلها persistent باشد (تنها یک بار اجرای برنامه را در نظر بگیرید).
- هر نمونه از مخزن باید دادهها را بهصورت جداگانه در خودش ذخیره کند.
- در صورت نیاز، میتوانید پراپرتیها و متدهای جدیدی به کلاسها (بهجز کلاس
Application) اضافه کنید.
مثال
با اجرای متد main موجود در کلاس Application، خروجی زیر مورد انتظار است:
true
1000
[[Id: 1, Wallet Id: x-y-z, Type: DEPOSIT, Amount: 1000, Status: ACCEPTED]]
[[Id: 1, Wallet Id: x-y-z, Type: DEPOSIT, Amount: 1000, Status: ACCEPTED]]
آنچه باید آپلود کنید
پس از پیادهسازی موارد خواستهشده، یک فایل زیر آپلود کنید که وقتی آن را باز میکنیم، با ساختار زیر مواجه شویم (از سایر فایلها صرفنظر میشود):
.
└── ir
└── digipay
└── digiwallet
├── model
│ └── Transaction.java
├── repository
│ └── TransactionRepositoryImpl.java
├── service
│ ├── AdminWalletService.java
└── └── WalletService.java
ارسال پاسخ برای این سؤال