در این مسئله باید قسمتهایی از یک اپلیکیشن مدیریت سفارشات رستوران را طبق دستور العمل داده شده پیادهسازی کنید.
این کلاس نشان دهندهی یک آدرس است و دارای دو attribute طول و عرض جغرافیایی ( latitude
و longitude
) از نوع double
و یک written_address
از نوع String
است که آدرس نوشتاری را مشخص میکند و . همچنین دارای متدی به اسم distance_from
است که یک شی Address
دیگر را به عنوان ورودی گرفته و فاصلهی این دو نقطه روی نقشه را با استفاده از طول و عرض جغرافیایی آنها بر حسب کیلومتر به عنوان یک متغیر double
بازگرداند. و همهی اینها باید از خارج کلاس قابل دسترسی باشند.
-
شما باید با نوشتن constructor مناسب از ساختهشدن شیای بدون طول و عرض جغرافیایی یا آدرس نوشتاری جلوگیری کنید.
-
نکته: فاصلهی دو نقطه به کیلومتر از روی طول و عرض جغرافیایی آنها از فرمول زیر محاسبه میشود.
$lo$ نشان دهندهی طول جغرافیایی و$la$ نشاندهندهی عرض جغرافیایی میباشد.
اشیا این کلاس نمایندهی مشتریها در سیستم مدیریت سفارشات رستوران هستند. هر شی این کلاس یک شمارهی مشتری دارد که یک عدد طبیعی حداکثر ۵ رقمی است و پس از ساختهشدن شی قابل تعویض نیست و تنها با متد getCustomerNumber
قابل دسترسی است. همچنین این شماره باید به طور اتوماتیک موقع ساختهشدن شی تنظیم شود و برای هر مشتری جدید ساخته شده متفاوت باشد (میتوانید فرض کنید تعداد مشتریها کمتر از ۱۰۰ هزار نفر است). همچنین برای هر مشتری یک String
اسم باشد که با متد getName
و setName
قابل دسترسی است. و هر مشتری یک Address
دارد که برای آن از کلاس آدرس تعریف شده در بالا استفاده میکنیم. و با getAddress
و setAddress
قابل دسترسیاست.
کلاس حداقل باید یک constructor داشته باشد، که با استفاده از اسم و آدرس یک شی مشتری بسازد. همچین باید در constructor و متدهای setter از دادن ورودی خالی یا null
جلوگیری شود.
هر شی از این کلاس نشاندهندهی یک غذا در منو است. و باید یک class variable
به نام menu
(که یک ArrayList
از غذا است)برای این کلاس داشته باشیم، که هر شی غذا که ساخته میشود به طور اتوماتیک در آن ذخیره شود. هر شی غذا دارای رشتهی name
و عدد صحیح price
است. این دو موقع ساختهشدن شی توسط constructor مقداردهی میشوند ولی بعد از آن قابل تغییر نیستند و با متد getPrice
و getName
صرفا قابل خواندن هستند. (به این فکر کنید که اگر یک متد setter در این سیستم برای قیمت غذاها وجود داشته باشد، چه مشکلی ممکن است به وجود بیاید)
هر شی این کلاس نشان دهندهی یک آیتم سفارش است. هر شی Item
دارای food
است که از کلاس Food
است که در بالا تعریف کردیم. و یک عدد طبیعی count
که نشان دهندهی فی است و همچنین یک description
از نوع String
که توضیحات اضافی در مورد این آیتم از سفارش را داراست. هر ۳ attribute
در constructor مقداردهی میشوند و باید از دادن مقدارهای نامثبت و خالی برای count
و food
جلوگیری شود. اما description
میتواند خالی باشد. همچنین این ۳ پس از ساخته شدن شی فقط با متدهای getFood
و getCount
و getDescription
قابل خوندن هستند و نباید قابل بازنویسی باشند.
این کلاس نشاندهندهی یک فاکتور است. هر فاکتور attributeای به نام state
دارد که اگر صفر باشد نشاندهندهی بودن سفارش در صف آمادهسازی، اگر ۱ باشد نشاندهندهی بودن سفارش در صف ارسال و اگر ۲ باشد نشاندهنده رسیدن سفارش به دست مشتری باشد همچنین اگر -۱ باشد، نشاندهندهی این است که سفارش در حال ثبت است. و با متد getState
قابل خواندن است ولی خارج از کلاس تعویض نمیشود.
یک شی Costumer برای مشتری مربوط به این سفارش (با getCustomer()
صرفا دریافت میشود)، و یک شی LocalDateTime
دارد که در زمان ساختهشدن شی به طور اتوماتیک با زمان حال پر میشود. و بعدا با متد getSubmitiTime
قابل دسترسی است.
-
مشتری، تنها ورودی لازم برای constructor این کلاس است.
-
این کلاس باید یک متد
addItem(Item item)
داشته باشد، که یکitem
که در قسمت قبل تعریف کردیم را بگیرد و به آیتمهای این فاکتور اضافه کند. این متد باید تنها زمانی کار کند، که در حال ثبت سفارش هستیم. در غیر این صورت بایدfalse
برگرداند. اگر آیتم به لیست آیتمهای این سفارش اضافه شد، بایدtrue
برگرداند. -
این کلاس باید یک متد
removeItem(Item item)
داشته باشد، که یکitem
که در قسمت قبل تعریف کردیم را بگیرد و اگر در آیتمهای این فاکتور وجود داشت، آن را حذف کند. (منظور از وجود داشتن این است که itemای با غذای مشابه در itemهای این سفارش وجود داشته باشد). این متد باید تنها زمانی کار کند، که در حال ثبت سفارش هستیم. در صورت نبودن در وضعیت ثبت سفارش یا وجود نداشتن اینitem
در آیتمهای این سفارش باید به نشانهی انجام نشدن عملیات،false
برگرداند. در صورت انجام شدن عملیات بایدtrue
برگرداند. -
متد
nextStage()
وضعیت سفارش را یک مرحله به جلو میبرد. -
متد
getTotalPrice
قیمت کل سفارش را به صورت یک integer
برمیگرداند. دقت کنید که قیمت کل سفارش برابر قیمت کل itemها به علاوهی مالیات است و رو به بالا گرد میشود . نرخ مالیات باید به صورت یکclass variable
در این کلاس به صورت یک متغیرfloat
به نامtax_rate
ذخیره شود و مقدار آن همیشه برابر با$9.4$ درصد و غیرقابل تغییر است. -
جواب را به صورت یک فایل
zip
ارسال کنید، که در آن یک پوشهیrestaurant
وجود دارد و کلاسهای شما در آن پوشه قرار دارند.
نمونهی استفاده از برنامه:
Address address = new Address(0, 0, "Greenwich");
Customer firstCustomer = new Customer("some guy", address);
System.out.printf("customer number: %s\n",firstCustomer.getCustomerNumber());
//add Foods
Food f1 = new Food("pizza", 80000);
Food f2 = new Food("coca cola", 6000);
Food f3 = new Food("Cinnamon Roll", 18000);
Food f4 = new Food("tea", 10000);
Food f5 = new Food("pasta", 55000);
Invoice firstInvoice = new Invoice(firstCustomer);
firstInvoice.addItem(new Item(f1, 1, "with extra pepper"));
//we can also define a function with 2 args for this situations
firstInvoice.addItem(new Item(f5, 1, ""));
firstInvoice.addItem(new Item(f2, 3, null));
System.out.printf("invoice submit time: %s\n",firstInvoice.getSubmitTime().toString());
System.out.printf("invoice total price: %s\n",firstInvoice.getTotalPrice());
خروجی نمونه:
customer number: 1
invoice submit time: 2021-03-12T11:15:55.921507400
invoice total price: 167382
در مثال بالا ۱ پیتزا، ۱ پاستا و ۳ تا نوشابه در فاکتور حساب شده که با احتساب ۹.۴ درصد مالیات ۱۶۷۳۸۲ تومان شده است.