יישום מכונות מדינה פשוטות באמצעות Java Enums

1. סקירה כללית

במדריך זה נבחן את מכונות המדינה וכיצד ניתן ליישם אותן בג'אווה באמצעות Enums.

נסביר גם את היתרונות של יישום זה לעומת שימוש בממשק ובמעמד קונקרטי לכל מדינה.

2. Java Enums

Java Enum הוא סוג מיוחד של מחלקה המגדיר רשימת קבועים. זה מאפשר יישום בטוח מסוג וקוד קריא יותר.

לדוגמה, נניח שיש לנו מערכת תוכנת משאבי אנוש שיכולה לאשר בקשות חופשה שהוגשו על ידי עובדים. בקשה זו נבחנת על ידי ראש הצוות, שמסלים אותה למנהל המחלקה. מנהל המחלקה הוא האחראי לאישור הבקשה.

האומנות הפשוטה ביותר המחזיקה במדינות בקשת חופשה היא:

enum public LeaveRequestState {הוגש, הסלים, אושר}

אנו יכולים להתייחס לקבועים של אנום זה:

LeaveRequestState state = LeaveRequestState.Submitted;

Enums יכולים להכיל גם שיטות. אנו יכולים לכתוב שיטה מופשטת באנומה, שתאלץ כל מופע enum ליישם שיטה זו. זה חשוב מאוד ליישום מכונות מדינה, כפי שנראה בהמשך.

מאחר שג'אווה מרחיבה את השיעור באופן מרומז java.lang.Enum, הם לא יכולים להאריך שיעור אחר. עם זאת, הם יכולים ליישם ממשק, בדיוק כמו כל מחלקה אחרת.

הנה דוגמה לאנומה המכילה שיטה מופשטת:

enum ציבורי LeaveRequestState {הוגש {@Override ציבורי מחרוזת responsiblePerson () {להחזיר "עובד"; }}, הסלמה {@Override Public String responsiblePerson () {להחזיר "ראש צוות"; }}, אושרה {@Override ציבור מחרוזת אחראי () (להחזיר "מנהל מחלקה"; }}; תקציר ציבורי מחרוזת האחראי (); }

שימו לב לשימוש בנקודה-פסיק בסוף קבוע האנומר האחרון. נקודה-פסיק נדרשת כשיש לנו שיטה אחת או יותר בעקבות הקבועים.

במקרה זה, הרחבנו את הדוגמה הראשונה עם a אדם אחראי() שיטה. זה אומר לנו את האחראי לביצוע כל פעולה. לכן, אם ננסה לבדוק את האחראי על ה- הסלים המדינה, זה ייתן לנו "ראש צוות":

LeaveRequestState state = LeaveRequestState.Escalated; assertEquals ("ראש צוות", state.responsiblePerson ());

באותו אופן, אם נבדוק מי אחראי לאישור הבקשה, זה ייתן לנו "מנהל מחלקה":

LeaveRequestState state = LeaveRequestState.Approved; assertEquals ("מנהל המחלקה", state.responsiblePerson ());

3. מכונות מדינה

מכונת מדינה - המכונה גם מכונת מצב סופית או אוטומט סופי - היא מודל חישובי המשמש לבניית מכונה מופשטת. מכונות אלה יכולות להיות במצב אחד בלבד בכל זמן נתון. כל מדינה היא מצב של המערכת שמשתנה למצב אחר. שינויים במצב זה נקראים מעברים.

זה יכול להסתבך במתמטיקה עם דיאגרמות וסימונים, אבל הדברים הרבה יותר קלים לנו המתכנתים.

תבנית המדינה היא אחד מדפוסי העיצוב הידועים של GoF. דפוס זה שואל את המושג מהמודל במתמטיקה. זה מאפשר לאובייקט להכיל התנהגויות שונות לאותו אובייקט, בהתבסס על מצבו. אנו יכולים לתכנת את המעבר בין מדינות ולהגדיר בהמשך מצבים נפרדים.

כדי להסביר את הרעיון טוב יותר, נרחיב את הדוגמה לבקשת חופשה ליישום מכונת מדינה.

4. Enums כמכונות מדינה

אנו נתמקד ביישום אנומטי של מכונות מדינה בג'אווה. יישומים אחרים אפשריים, ונשווה אותם בחלק הבא.

הנקודה העיקרית של יישום מכונות המדינה באמצעות enum היא איננו צריכים להתמודד עם קביעת המדינות במפורש. במקום זאת, אנו יכולים פשוט לספק את ההיגיון כיצד לעבור ממצב אחד למצב אחר. בואו ונצלול ממש ב:

enum ציבור LeaveRequestState {הוגש {@Override ציבורי LeaveRequestState nextState () {חזרה הסלים; } @ עקוף ציבורי מחרוזת האחראי () {להחזיר "עובד"; }}, הסלמה {@Override public LeaveRequestState nextState () {return אושרה; } @Override ציבור מחרוזת אחראי () {להחזיר "ראש צוות"; }}, אושרה {@Override public LeaveRequestState nextState () {להחזיר את זה; } @ עקוף ציבורי מחרוזת אחראי () {להחזיר "מנהל מחלקה"; }}; תקציר ציבורי LeaveRequestState nextState (); תקציר ציבורי מחרוזת האחראי (); }

בדוגמה זו, מעברי מכונות מדינה מיושמים בשיטות המופשטות של האנומר. ליתר דיוק, באמצעות nextState () בכל קבוע של אנום אנו מציינים את המעבר למצב הבא. במידת הצורך נוכל ליישם גם א previousState () שיטה.

להלן מבחן לבדיקת היישום שלנו:

LeaveRequestState state = LeaveRequestState.Submitted; state = state.nextState (); assertEquals (LeaveRequestState.Escalated, state); state = state.nextState (); assertEquals (LeaveRequestState.Approved, state); state = state.nextState (); assertEquals (LeaveRequestState.Approved, state);

אנו מתחילים את בקשת החופשה ב הוגש מצב התחלתי. לאחר מכן אנו מאמתים את מעברי המדינה באמצעות ה- nextState () שיטה שיישמנו לעיל.

ציין זאת מאז אושר הוא המצב הסופי, שום מעבר אחר לא יכול לקרות.

5. יתרונות יישום מכונות מדינה באמצעות Java Enums

יישום של מכונות מדינה עם ממשקים ושיעורי יישום יכול להיות כמות משמעותית של קוד לפיתוח ותחזוקה.

מכיוון ש- enum של Java הוא, בצורתו הפשוטה ביותר, רשימה של קבועים, אנו יכולים להשתמש ב- enum כדי להגדיר את המדינות שלנו. ומכיוון שאנומה יכולה להכיל גם התנהגות, אנו יכולים להשתמש בשיטות לספק יישום המעבר בין מדינות.

קיום כל ההיגיון באיזור פשוט מאפשר פיתרון נקי וישר.

6. מסקנה

במאמר זה בדקנו מכונות מדינה וכיצד ניתן ליישם אותן בג'אווה באמצעות Enums. נתנו דוגמא ובדקנו אותה.

בסופו של דבר, דנו גם ביתרונות השימוש באנומות ליישום מכונות מדינה. כחלופה לממשק ולפתרון היישום, enums מספקים יישום נקי וקל יותר להבנה של מכונות המדינה.

כמו תמיד, כל קטעי הקוד המוזכרים במאמר זה נמצאים במאגר GitHub שלנו.