Skip to content

Latest commit

 

History

History
73 lines (57 loc) · 9.25 KB

description.md

File metadata and controls

73 lines (57 loc) · 9.25 KB

در این مسئله باید قسمت‌هایی از یک اپلیکیشن مدیریت سفارشات رستوران را طبق دستور العمل داده شده پیاده‌سازی کنید.

کلاس Address

این کلاس نشان دهنده‌ی یک آدرس است و دارای دو attribute طول و عرض جغرافیایی ( latitude و longitude) از نوع double و یک written_address از نوع String است که آدرس نوشتاری را مشخص می‌کند و . همچنین دارای متدی به اسم distance_from است که یک شی Address دیگر را به عنوان ورودی گرفته و فاصله‌ی این دو نقطه روی نقشه را با استفاده از طول و عرض جغرافیایی آنها بر حسب کیلومتر به عنوان یک متغیر double بازگرداند. و همه‌ی اینها باید از خارج کلاس قابل دسترسی باشند.

  • شما باید با نوشتن constructor مناسب از ساخته‌شدن شی‌ای بدون طول و عرض جغرافیایی یا آدرس نوشتاری جلوگیری کنید.

  • نکته: فاصله‌ی دو نقطه به کیلومتر از روی طول و عرض جغرافیایی آنها از فرمول زیر محاسبه می‌شود. $lo$ نشان‌ دهنده‌ی طول جغرافیایی و $la$ نشان‌دهنده‌ی عرض جغرافیایی می‌باشد.

$$ \theta = lo_1 - lo_2 $$ $$ d = Sin(rad(la_1)) .Sin(rad(la_2)) + Cos(rad(la_1).Cos(rad(la_2)).Cos(rad(\theta)) $$ $$ distance = degree(Cos^{-1}(d))\times 60 \times 1.1515 \times 1.609344 $$

کلاس Customer

اشیا این کلاس نماینده‌ی مشتری‌ها در سیستم مدیریت سفارشات رستوران هستند. هر شی این کلاس یک شماره‌ی مشتری دارد که یک عدد طبیعی حداکثر ۵ رقمی‌ است و پس از ساخته‌شدن شی قابل تعویض نیست و تنها با متد getCustomerNumber قابل دسترسی است. همچنین این شماره باید به طور اتوماتیک موقع ساخته‌شدن شی تنظیم شود و برای هر مشتری جدید ساخته شده متفاوت باشد (می‌توانید فرض کنید تعداد مشتری‌ها کمتر از ۱۰۰ هزار نفر است). همچنین برای هر مشتری یک String اسم باشد که با متد getName و setName قابل دسترسی است. و هر مشتری یک Address دارد که برای آن از کلاس آدرس تعریف شده در بالا استفاده می‌کنیم. و با getAddress و setAddress قابل دسترسی‌است.

کلاس حداقل باید یک constructor داشته باشد، که با استفاده از اسم و آدرس یک شی مشتری بسازد. همچین باید در constructor و متد‌های setter از دادن ورودی خالی یا null جلوگیری شود.

کلاس Food

هر شی از این کلاس نشان‌دهنده‌ی یک غذا در منو است. و باید یک class variableبه نام menu (که یک ArrayList از غذا است)برای این کلاس داشته باشیم، که هر شی‌ غذا که ساخته می‌شود به طور اتوماتیک در آن ذخیره شود. هر شی غذا دارای رشته‌ی name و عدد صحیح price است. این دو موقع ساخته‌شدن شی توسط constructor مقداردهی می‌شوند ولی بعد از آن قابل تغییر نیستند و با متد getPrice و getName صرفا قابل خواندن هستند. (به این فکر کنید که اگر یک متد setter در این سیستم برای قیمت غذا‌ها وجود داشته باشد، چه مشکلی ممکن است به وجود بیاید)

کلاس Item

هر شی این کلاس نشان دهنده‌ی یک آیتم سفارش است. هر شی Item دارای food است که از کلاس Food است که در بالا تعریف کردیم. و یک عدد طبیعی count که نشان دهنده‌ی فی است و همچنین یک description از نوع String که توضیحات اضافی در مورد این آیتم از سفارش را داراست. هر ۳ attribute در constructor مقداردهی می‌شوند و باید از دادن مقدار‌های نامثبت و خالی برای count و food جلوگیری شود. اما description می‌تواند خالی باشد. همچنین این ۳ پس از ساخته شدن شی فقط با متدهای getFood و getCount و getDescription قابل خوندن هستند و نباید قابل بازنویسی باشند.

کلاس Invoice

این کلاس نشان‌دهنده‌ی یک فاکتور است. هر فاکتور 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

در مثال بالا ۱ پیتزا، ۱ پاستا و ۳ تا نوشابه در فاکتور حساب شده که با احتساب ۹.۴ درصد مالیات ۱۶۷۳۸۲ تومان شده است.