پروژه جاوا – چگونه یک سیستم مدیریت پارکینگ ساده بسازیم
سلام به همه! خوب است که با یک آموزش دیگر بازگردید - این بار در جاوا، یکی از محبوب ترین زبان های برنامه نویسی امروزی.
جاوا توسط توسعهدهندگان و شرکتها برای ساخت برنامههای قدرتمندی که اهداف مختلفی را انجام میدهند، استفاده میشود. ماهیت شی گرا جاوا نوشتن کدهای تمیز، ماژولار و قابل استفاده مجدد را بسیار آسان می کند.
اگر هنوز با جاوا راحت نیستید، منابع بسیار خوبی به صورت آنلاین وجود دارد که می تواند به شما در شروع کار کمک کند. می توانید این مجموعه از منابع را که توسط یکی از کارکنان freeCodeCamp ما جمع آوری شده است، تحلیل کنید. در اینجا یک دوره آموزشی جاوا برای مبتدیان آمده است . و در اینجا یک آموزش مفید دیگر وجود دارد که به شما کمک می کند تا روی اصول اولیه کار کنید. هیچ وقت دیر نیست!
در این آموزش قصد داریم یک اپلیکیشن خط فرمان ساده برای سیستم پارکینگ بسازیم. ابتدا با الزامات شروع می کنم، سپس کلاس های مورد نیاز را فهرست می کنم و گردش کار برنامه را توضیح می دهم. پس از این، من به شما نشان خواهم داد که چگونه هر عملکرد را پیاده سازی کنید.
در اینجا چیزی است که ما پوشش خواهیم داد:
نحوه راه اندازی پروژه
شما باید جاوا 8 را در سیستم خود نصب کنید. اگر این کار را نکردید، آن را از اینجا دانلود کنید و این راهنمای نصب را دنبال کنید. همچنین، کد ویژوال استودیو را نصب کنید و پسوند زبان پشتیبانی برای جاوا را در VS Code اضافه کنید.
نیازی به راه اندازی اتصال پایگاه داده، سرور خارجی یا فریم ورک نیست. ما از یک ساختار داده در حافظه برای ذخیره داده ها استفاده خواهیم کرد. همچنین، ما قرار نیست یک رابط کاربری ایجاد کنیم، زیرا تمرکز فقط بر روی منطق تجاری است.
با خارج شدن از راه، ما آماده شروع کار هستیم.
الزامات پروژه
هدف ما ایجاد یک اپلیکیشن برای سیستم پارکینگ است. از آنجایی که همه پروژه ها را متفاوت تصور می کنند، ممکن است ویژگی های زیادی به ذهن شما خطور کند.
اما قبل از ورود به پیاده سازی، ابتدا باید الزامات خاصی را تعیین کنیم. همیشه مهم است که ابتدا با الزامات اولیه شروع کنیم، پس این کاری است که ما در اینجا انجام خواهیم داد.
در اینجا فهرست ی از تمام الزامات آمده است:
یک پارکینگ باید دارای شناسه پارکینگ، تعداد طبقات و تعداد اسلات در هر طبقه باشد.
هر شیار در پارکینگ دارای نوعی وسیله نقلیه است که می تواند در آنجا پارک کند. انواع معتبر خودرو، دوچرخه و کامیون هستند. شما می توانید هر نوع وسیله نقلیه ای را بنا به نیاز خود وارد کنید. شما همچنین می توانید تصمیم بگیرید که کدام اسلات باید به هر نوع برود. در اینجا، من اولین شیار هر طبقه را به یک کامیون، دو طبقه بعدی را برای دوچرخه و استراحت را برای ماشین ها اختصاص می دهم.
هنگامی که یک وسیله نقلیه وارد پارکینگ می شود، برنامه نوع وسیله نقلیه، شماره ثبت و رنگ آن را می گیرد. همچنین می توانید جزئیات بیشتری مانند نام وسیله نقلیه، نام راننده و غیره داشته باشید.
پس از آن، یک اسلات به وسیله نقلیه اختصاص داده می شود. استراتژی انتخاب می تواند هر چیزی باشد که شما می خواهید. در اینجا، ما پایین ترین طبقه و قدیمی ترین اسلات موجود را انتخاب می کنیم.
هنگامی که به وسیله نقلیه یک اسلات اختصاص داده می شود، برنامه باید یک بلیط را پس دهد. بلیط باید یک رشته از فرم <parking lot id>_<floor no>_<slot no> باشد. به عنوان مثال، وسیله نقلیه پارک شده در طبقه 2، شیار 5 PR123_2_5 خواهد بود.
برای بازکردن خودرو، کاربر باید بلیط معتبر ارائه دهد. پس از آن، وسیله نقلیه از شیار خارج می شود.
برنامه باید بتواند تعداد اسلات های موجود و فهرست ی از اسلات های موجود و غیرقابل دسترس را برای یک نوع وسیله نقلیه خاص نمایش دهد.
کلاس های جاوا
بیایید بفهمیم که چگونه برنامه را طراحی می کنیم. از آنجایی که یک برنامه خط فرمان است، ما فقط قصد داریم منطق تجاری یک پارکینگ را بنویسیم و خروجی ها را روی یک کنسول نمایش دهیم.
ما کلاس های جداگانه ای خواهیم داشت که نهادهای برنامه ما را نشان می دهد: Vehicle
و Slot
. سپس، ما یک ParkingLot
ایجاد می کنیم کلاسی که شامل منطق تجاری اصلی برنامه ما است. کلاس درایور اصلی ما برای همه عملکردها با این کلاس تعامل خواهد داشت.
حالا بیایید کلاس های خود را تعریف کنیم. هر کلاس یک سازنده برای مقداردهی اولیه فیلدهای خود خواهد داشت.
کلاس خودرو:
type
، registration
، color
(همه از نوع رشته ای هستند)
کلاس اسلات:
type
(رشته)
vehicle
(Vehicle): نوع وسیله نقلیه پارک شده در اسلات
ticketId
(رشته): شناسه بلیط اختصاص داده شده به وسیله نقلیه پارک شده در این شکاف، در ابتدا null.
کلاس پارکینگ:
زمینه های :
parkingLotId
(رشته)
slots
(List<List<Slot>>): این فهرست ی از تمام اسلات های موجود در پارکینگ است. فهرست فهرست ها نشان دهنده شکاف ها در چندین طبقه است. طبقات و شیارها بر اساس فهرست فهرست شماره گذاری می شوند.
سازنده : ParkingLot(parkingLotId, nfloors, noOfSlotsPerFlr)
مواد و روش ها :
parkVehicle(type, regNo, color)
: تمام پارامترهای یک وسیله نقلیه را می گیرد، یک اسلات اختصاص می دهد و بلیط را برمی گرداند.
unPark(ticketId)
: شناسه بلیط را می گیرد و وسیله نقلیه را از اسلات خارج می کند
getNoOfOpenSlots(type)
: تعداد اسلات ها را برای نوع وسیله نقلیه برمی گرداند
displayOpenSlots(type)
: همه اسلات های باز را برای نوع خودرو نمایش می دهد
displayOccupiedSlots(type)
: تمام اسلات های اشغال شده را برای نوع خودرو نمایش می دهد
این شامل منطق اصلی کسب و کار ما از جمله روش هایی است که در معرض مشتری قرار می گیرد، یعنی روش اصلی در مورد ما. منطق اولیه سازی داخل سازنده در مقایسه با کلاس Vehicle
و Slot
متفاوت است.
در قسمت پیاده سازی با این کلاس ها بیشتر آشنا می شوید.
گردش کار برنامه
اکنون که کلاس های خود را تعریف کرده ایم، بیایید گردش کار برنامه خود را درک کنیم.
هنگامی که یک وسیله نقلیه وارد پارکینگ می شود، سیستم جزئیات وسیله نقلیه را می گیرد و به دنبال شکاف موجود می گردد. اگر یک اسلات باز پیدا کرد، آن شکاف را به وسیله نقلیه اختصاص میدهد و یک بلیط برمیگرداند.
این کار توسط متد parkVehicle()
انجام می شود. اگر شکافی در دسترس نباشد، روش یک پیام خطا چاپ می کند.
حالا اگر وسیله نقلیه بخواهد پارک کند باید بلیط را نشان دهد. سیستم بلیط را تجزیه می کند، متوجه می شود که وسیله نقلیه در کدام شکاف پارک شده است و شکاف را آزاد می کند. متد unPark()
بلیط را می گیرد و اسلات مربوطه را آزاد می کند.
حالا بیایید وارد کد شویم.
نحوه ساخت اپلیکیشن
بیایید ابتدا کلاس های Vehicle
و Slot
خود را با فیلدهایی که قبلا ذکر شد بنویسیم:
حالا بیایید کلاس ParkingLot
را پیاده سازی کنیم. ما در مورد فیلدها و متدهایی که کلاس شامل خواهد شد بحث کرده ایم. بیایید ابتدا فیلدها را بنویسیم.
public class ParkingLot { String parkingLotId; List<List<Slot>> slots; ... constructor and methods ... }
من گام به گام به شما نشان خواهم داد که چگونه هر عملکرد را پیاده سازی کنید.
کلاس را راه اندازی کنید
کلاس ParkingLot
را از طریق سازنده راه اندازی کنید. اینجا جایی است که ما پارکینگ خود را می سازیم. همانطور که قبلا ذکر شد، پارکینگ دارای تعداد طبقات و تعداد اسلات در هر طبقه خواهد بود.
ParkingLot(String parkingLotId, int nfloors, int noOfSlotsPerFlr) { ... code here ... }
با تنظیم شناسه پارکینگ شروع کنید.
this.parkingLotId=parkingLotId;
سپس، تمام اسلات ها را مقداردهی اولیه کنید. در هر طبقه، اسلات اول به کامیون، دو طبقه بعدی به دوچرخه و بقیه برای ماشین ها می رود.
slots = new ArrayList<>(); for(int i=0;i<nfloors;i++){ slots.add(new ArrayList<>()); List<Slot> floorSlots = slots.get(i); floorSlots.add(new Slot("truck")); floorSlots.add(new Slot("bike")); floorSlots. add(new Slot("bike")); for(int j=3;j<noOfSlotsPerFlr;j++){ slots.get(i).add(new Slot("car")); } }
در اینجا، ما مقداردهی اولیه ساده را برای هر شی Slot
در فهرست انجام داده ایم.
خودرو را پارک کنید
بیایید اکنون متد parkVehicle()
را پیاده سازی کنیم.
public String parkVehicle(String type, String regNo, String color) { ... Implementation here ... }
ابتدا یک آبجکت Vehicle
با جزئیات داده شده ایجاد کنید.
Vehicle vehicle = new Vehicle(type, regNo, color);
کل فهرست اسلات ها را حلقه بزنید و اولین شکاف خالی را پیدا کنید. برای تعیین اینکه آیا یک اسلات خالی است یا نه، تحلیل کنید که آیا شیار می تواند نوع وسیله نقلیه داده شده را بگیرد و آیا فیلد خودروی اسلات خالی است (به این معنی که خالی است).
for(int i=0; i<slots.size();i++){ for(int j=0;j<slots.get(i).size(); j++){ Slot slot = slots.get(i).get(j); if(slot.type == type && slot.vehicle == null) { ... assign the slot here ... } } }
برای اختصاص دادن این اسلات به وسیله نقلیه، کافی است فیلد vehicle
را روی شی Vehicle
که در بالا ایجاد کردیم تنظیم کنید. سپس، با استفاده از شماره طبقه و اسلات، یک بلیط تولید و برگردانید.
slot.vehicle=vehicle; slot.ticketId=generateTicketId(i+1, j+1); return slot.ticketId;
private String generateTicketId(int flr, int slno){ return parkingLotId + "_" + flr + "_" + slno; }
این متد نیازی به نمایش خارج از کلاس ندارد، پس خصوصی است.
اگر شکافی در دسترس نیست، null را برگردانید یا یک استثنا قرار دهید. این کار را بعد از پایان حلقه for انجام دهید.
System.out.println("NO slot available for given type"); return null;
خودرو را باز کنید
برای باز کردن پارک خودرو، شناسه بلیط را تجزیه کنید تا شماره طبقه و محل پارک خودرو را بدست آورید.
public void unPark(String ticketId){ String[] extract = ticketId.split("_"); int flr_idx=Integer.parseInt(extract[1])-1; int slot_idx=Integer.parseInt(extract[2])-1; ... }
منطق تجزیه را با یک try-catch احاطه کنید در صورتی که کاربر شناسه بلیط نامعتبر را ارسال کند.
با شماره کف و شیار، شکافی را که خودرو در آن پارک شده است پیدا کنید و خودرو را لغو کنید.
for(int i=0; i<slots.size();i++){ for(int j=0;j<slots.get(i).size(); j++){ if(i==flr_idx && j==slot_idx) { Slot slot = slots.get(i).get(j); slot.vehicle=null; slot.ticketId=null; System.out.println("Unparked vehicle"); } } }
نمایش اطلاعات پارکینگ
ما سه روش برای نمایش اطلاعات پارکینگ به اشکال مختلف تعریف کرده ایم.
تعداد اسلات های باز را برای یک نوع وسیله نقلیه برگردانید.
int getNoOfOpenSlots(String type){ int count=0; for(List<Slot> floor: slots){ for(Slot slot: floor){ if(slot.vehicle == null && slot.type.equals(type)) count++; } } return count; }
در اینجا، روی تمام اسلات ها حلقه می زنیم و دو شرط را تحلیل می کنیم. ابتدا تحلیل می کنیم که آیا فیلد vehicle
خالی است یا خیر. و سپس تحلیل می کنیم که آیا نوع اسلات با نوع وسیله نقلیه درخواستی مشتری مطابقت دارد یا خیر.
سپس به سادگی تعداد اسلات های خالی برای نوع داده را برمی گردانیم.
نمایش تمام شیارهای باز برای نوع خودرو:
void displayOpenSlots(String type){ for(int i=0;i<slots.size();i++){ for(int j=0;j<slots.get(i).size();j++){ Slot slot=slots.get(i).get(j); if(slot.vehicle == null && slot.type.equals(type)) System.out.println("Floor " + (i+1) + " slot " + (j+1)); } } }
این یک پیشرفت نسبت به عملکرد قبلی است. به جای شمارش، شکاف های خالی واقعی را با کف و شیار شماره برمی گردانیم.
نمایش تمام اسلات های اشغال شده برای نوع خودرو:
void displayOccupiedSlots(String type){ for(int i=0;i<slots.size();i++){ for(int j=0;j<slots.get(i).size();j++){ Slot slot=slots.get(i).get(j); if(slot.vehicle != null && slot.type.equals(type)) System.out.println("Floor " + (i+1) + " slot " + (j+1)); } } }
در اینجا، شرایط مخالف را برای قسمت vehicle
تحلیل می کنیم. اگر پوچ نباشد، آن شیار توسط وسیله نقلیه اشغال می شود. سپس تحلیل می کنیم که آیا نوع وسیله نقلیه با نوع درخواستی مطابقت دارد یا خیر و سپس شماره کف و شیار را نمایش می دهیم.
با این، ما اجرای اساسی خود را از یک پارکینگ داریم. وقت آن است که هر یک از عملکردها را آزمایش کنیم.
نحوه تست اپلیکیشن
از آنجایی که ما رابط کاربری یا چارچوب آزمایشی نداریم، میخواهیم هر عملکرد را به صورت دستی از روی کد درایور آزمایش کنیم. درست مانند هر برنامه جاوا، برنامه ما نیز از روش اصلی شروع می شود.
ابتدا یک شی ParkingLot
ایجاد می کنیم. هر یک از عملکردهای پارکینگ از طریق این شی قابل دسترسی خواهند بود.
int nFloors=4; int nSlotsPerFloor=6; ParkingLot parkingLot = new ParkingLot("PR1234", nFloors, nSlotsPerFloor);
این یک پارکینگ با 4 طبقه و 6 اسلات در هر طبقه، در مجموع 24 اسلات ایجاد می کند.
parkingLot.getNoOfOpenSlots("car") String ticket1 = parkingLot.parkVehicle("car", "MH-03", "red"); String ticket2 = parkingLot.parkVehicle("car", "MH-04", "purple"); parkingLot.displayOccupiedSlots("car");
ابتدا تعداد اسلات های باز موجود برای یک ماشین را نمایش می دهیم. سپس دو ماشین پارک می کنیم و بلیط ها را می گیریم. پس از پارک، اسلات های اشغال شده را نمایش می دهیم.
برای اجرای برنامه روی دکمه run در بالا سمت راست کلیک کنید.
در اینجا، می توانید ببینید اولین اسلات های موجود به خودرو اختصاص داده شده است.
اکنون، وسیله نقلیه دوم را باز کرده و اسلات های اشغال شده را نمایش دهید.
parkingLot.unPark(ticket2); parkingLot.displayOccupiedSlots("car");
بیایید اکنون یک کامیون پارک کنیم. اسلات های موجود برای کامیون را نمایش دهید، کامیون را پارک کنید و اسلات های اشغال شده را نمایش دهید.
parkingLot.displayOpenSlots("truck"); parkingLot.parkVehicle("truck", "MH-01", "black"); parkingLot.displayOccupiedSlots("truck");
سه کامیون دیگر پارک می کنم و سپس یکی دیگر را پارک می کنم. از آنجایی که اسلات کامیون دیگری در دسترس نیست، پیام زیر را نشان می دهد:
حوزه آینده
در این مقاله یک اپلیکیشن خط فرمان بسیار ابتدایی برای پارکینگ ایجاد کرده ایم. این برنامه فقط یک کار را انجام می دهد - اختصاص دادن و حذف یک وسیله نقلیه از محل پارکینگ. اما چیزهای زیادی وجود دارد که می توانید به این برنامه اصلی اضافه کنید:
تا جایی که امکان دارد از کپسولاسیون استفاده کنید. از نظر فنی، این نباید در آینده تحت شعاع قرار گیرد. من در اینجا از کپسولاسیون استفاده نکرده ام زیرا فقط می خواستم روی طراحی و بخش منطقی تمرکز کنم. اما در حین کار بر روی برنامه های واقعی، به یاد داشته باشید که تمام فیلدها را کپسوله کنید و از طریق دریافت کننده ها و تنظیم کننده ها به آنها دسترسی داشته باشید.
برای سناریوهایی که در آن اسلات در دسترس نیست، نوع وسیله نقلیه مجاز نیست، یا بلیط نامعتبر است، مدیریت استثنایی مناسب را اجرا کنید.
می توانید انواع بیشتری از وسایل نقلیه را به پارکینگ اضافه کنید و از استراتژی متفاوتی برای اختصاص انواع اسلات استفاده کنید.
برای پیدا کردن اولین اسلات موجود می توانید از یک استراتژی متفاوت استفاده کنید.
شما می توانید تمام منطقی را که در اینجا بحث کرده ایم به عنوان یک سرویس پشتیبان در معرض نمایش قرار دهید و همچنین یک رابط کاربری برای پارکینگ خود با یک پایگاه داده ایجاد کنید.
می توانید کد را در GitHub از اینجا پیدا کنید.
نتیجه
در این پست یک برنامه خط فرمان ساده با جاوا از روی نیازمندی ها ایجاد کردیم. از فهرست نیازمندی ها، طراحی اپلیکیشن را مشخص کردیم و کلاس های مورد نیاز را تعریف کردیم. سپس، گردش کار برنامه خود را درک کردیم.
پس از نهایی کردن طراحی و گردش کار، وارد مرحله اجرا شدیم. این نرم افزار ساده نمونه ای از نحوه ترسیم الزامات و بر اساس آن الزامات، طراحی و گردش کار برنامه خود بود.
قبل از نوشتن کد، باید بدانید که از چه کلاس هایی استفاده می کنید و هدف هر کلاس چیست. این درست است مهم نیست که چقدر برنامه کوچک یا بزرگی می خواهید بسازید. امیدوارم این به پروژه های آینده شما کمک کند.
اگر نمی توانید مطالب را درک کنید یا توضیح را رضایت بخش نمی دانید، نظرات خود را در زیر کامنت کنید. ایده های جدید همیشه قدردانی می شوند! با خیال راحت با من در توییتر ارتباط برقرار کنید. تا آن زمان، خداحافظ!
منابع مفید
workat.tech منابع فراوانی در مصاحبههای شکستخورده در شرکتهای برتر مبتنی بر محصول دارد. این پست از یکی از این منابع الهام گرفته شده است.
در اینجا یک کتاب راهنمای جاوا برای مبتدیان وجود دارد که بسیاری از مفاهیم اساسی را به شما آموزش می دهد.
و در اینجا یک کتاب راهنمای جاوا پیشرفته تر است که مفاهیم برنامه نویسی شی گرا پیشرفته تری را پوشش می دهد.
ارسال نظر