- طراح سوال: انجمن جاواکاپ
از شما خواسته شده است طبق توضیحات زیر، یک پیادهسازی مقدماتی از سامانه ثبت نسخه دارویی را به زبان جاوا انجام دهید. ابتدا بستهی ir.nimbo را دانلود کرده و محتوای آن را ببینید.
این سامانه دو هدف اصلی دارد. ثبت نسخه به صورت اینترنتی و جستوجوی دارو
تلاش کنید برنامهی خود را تمیز و اصولی پیادهسازی کنید.
جستوجوی دارو:
برای این منظور در کلاس DrugRepository
به عنوان مخزن داروها (Drug
)، دو متد برای جستوجو در بین داروها قرار دارد که شما باید آنها را پیادهسازی کنید:
- متد
findDrugByExactName
: در بین داروهای موجود در مخزن جستوجو میکند و دارویی که نامش دقیقا برابر با پارامتر ورودی است را بر میگرداند. (کوچک و بزرگ بودن حروف مهم است). - متد
search
: زمانی که نام دارویی را به صورت دقیق نمیدانیم و تنها بخشی از نام دارو را میدانیم، از این متد میتوان برای پیدا کردن نام دقیق دارو استفاده کرد. به این صورت که بخشهایی از نام دارو را که نمیدانیم، به جایش علامت%
میگذاریم. مثلا اگر بدانیم نام داروی مورد نظر ما شامل رشتهیphen
میباشد و ابتدا یا انتهاش ممکن است حروف دیگری هم وجود داشته باشد، پارامتر ورودی متد را به صورت%phen%
وارد میکنیم. خروجی این متد، یک لیست شامل نام کلیهی داروهایی خواهد بود که با رشتهی ورودی مطابقت دارند (کوچک و بزرگ بودن حروف مهم نیست).
ثبت نسخه:
به این منظور، دو سرویس زیر باید پیادهسازی شوند. این سرویسها در کلاس PrescriptionService
قرار دارند و به صورت زیر باید عمل کنند:
۱. سرویس primaryRegisteration
:
با ثبت نسخه (Prescription
) و ارایهی یک موقعیت مکانی (Location
) دلخواه به برنامه، نزدیکترین داروخانه (Pharmacy
) به آن موقعیت مکانی که تمامی آیتمهای موجود (PrescriptionItem
) در آن نسخه را دارد (موجودی داروخانه باید بیشتر یا مساوی تعداد داروی مورد نظر باشد)، پیدا کرده و برگرداند.
- اگر از تاریخ نسخه بیش از ۳۰ روز گذشته باشد، یعنی تاریخ انقضای نسخه گذشته است و باید استثنایی با پیام زیر پرتاب شود:
Prescription is expired.
- اگر هیچ داروخانهای پیدا نشد که تمام آیتمهای موجود در نسخه را داشته باشد، باید استثنایی با پیام زیر پرتاب شود:
No Pharmacy Found. Try Later...
- برای محاسبهی فاصلهی بین دو موقعیت مکانی، یک شی از نوع واسط
LocationService
در اختیارتان قرار داده خواهد شد و با فراخوانی متدdistance
از آن، میتوانید مقدار فاصله بین دو موقعیت مکانی را بدست آورید.
۲. سرویس finalRegisteration
:
این سرویس با گرفتن یک داروخانه و یک نسخه در پارامترهای ورودی، باید موجودی داروهای موجود در نسخه را در آن داروخانه بهروز کند:
- موجودی داروها در داروخانه را با توجه به تعدادی که در نسخه ذکر شده، کاهش دهد.
- اگر موجودی یک دارو به صفر برسد، آن دارو باید از لیست داروهای داروخانه حذف شود و در نهایت هزینهی نسخه را محاسبه کرده و برگرداند.
توضیحات تکمیلی:
نسخه (Prescription):
- هر نسخه دارای تعدادی آیتم دارویی (
PrescriptionItem
) است که نام و تعداد هر آیتم در آن ذکر شده است. - هر نسخه دارای یک تاریخ است.
- هر نسخه دارای یک موقعیت مکانی است که برای پیدا کردن نزدیکترین داروخانه به آن موقعیت مکانی، مورد استفاده قرار میگیرد.
مخزن دارو (DrugRepository):
- کلیهی داروها در این مخزن نگهداری میشوند و داروهای موجود در داروخانهها، حتما زیرمجموعهای از داروهای موجود در مخزن است.
- داروها بر اساس نامشان یکتا هستند.
- این کلاس باید Singleton باشد و تنها نمونه (instance) آن باید توسط متد
getInstance
برگردانده شود.
داروخانه (Pharmacy):
- هر داروخانه دارای تعدادی دارو با مقدار موجودی (
inventory
) مشخص است. - همچنین موقعیت مکانی داروخانه نیز مشخص است (طول و عرض جغرافیایی)
- با استفاده از متد
addDrug
باید بتوان یک دارو با مقدار موجودی مورد نظر را به لیست داروهای داروخانه (drugs) اضافه کرد (شما پیادهسازی کنید). دارویی که همچنان در داروخانه موجود است، به عنوان پارامتر به این متد داده نمیشود. - با استفاده از متد
removeDrug
باید بتوان یک دارو را از لیست داروهای داروخانه حذف کرد (شما پیادهسازی کنید). - با استفاده از متد
getDrugInventory
باید بتوان مقدار موجودی دارویی که در پارامتر ورودی داده شده است را به دست آورد (شما پیادهسازی کنید). - با استفاده از متد
getDrugCount
تعداد کل داروهای موجود در داروخانه به دست میآید (شما پیادهسازی کنید).
دارو (Drug):
- هر دارو دارای یک قیمت اولیه (
basePrice
) است. - هر دارویی ممکن است از نوع بیمهشده (Insured) و یا آزاد (Uninsurd) باشد. بنابراین برای دو زیرکلاس
InsuredDrug
وUninsurdDrug
، متدgetPrice
باید به گونهای پیادهسازی شود که قیمت داروهای تحت پوشش بیمه، ۳۰% کمتر محاسبه شود و قیمت داروهای آزاد، بدون تغییر و برابر باbasePrice
باشد.
نکته:
- در فایلهای ارسالی، مجاز به تغییر امضا (signature) متد نیستید اما میتوانید یک یا چند متد جدید اضافه کرده و در پیادهسازی خود استفاده کنید. تغییر امضای متد شامل مواردی مانند تغییر نوع و تعداد پارامترهای ورودی، تغییر نوع بازگشتی، تغییر نام متد، اضافه کردن throws declaration و ...
- به کلاسهایی که سازندهی پارامتردار (
Parameterized Constructor
) دارند، نباید سازندهی دیگری اضافه شود.
مثال:
فایل Program.java را دانلود کرده و در کنار فایلهایی که پیادهسازی کردهاید قرار داده و اجرا کنید. با اجرای آن، باید خروجی زیر در کنسول چاپ شود:
Before:
3
2
After:
null
1
دقت کنید در این مثال، هدف تنها اجرای finalRegisteration
بوده است، بنابراین از یک پیادهسازی سادهلوحانه و غیرواقعی از LocationService
استفاده شده است.
آنچه باید آپلود کنید: یک فایل زیپ شامل بستهی ir.nimbo است. به صورتی که وقتی فایل زیپ را باز میکنیم، دقیقا شاخهی ir را ببینیم که درون آن شاخهی nimbo قرار دارد. در داخل شاخهی nimbo هفت فایل زیر باید وجود داشته باشد:
UninsurdDrug.java InsuredDrug.java Drug.java DrugRepository.java Pharmacy.java Prescription.java PrescriptionService.java
ارسال پاسخ برای این سؤال