דפוסי DAO לעומת מאגר

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

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

במאמר זה נדון בהבדלים בין דפוסי DAO למאגר.

2. תבנית DAO

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

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

בואו נבדוק יישום פשוט של דפוס ה- DAO.

2.1. מִשׁתַמֵשׁ

ראשית, בואו ניצור בסיסי מִשׁתַמֵשׁ מחלקת תחום:

משתמש בכיתה ציבורית {פרטי מזהה ארוך; שם משתמש מחרוזת פרטי; פרטי מחרוזת firstName; דוא"ל מחרוזת פרטי; // גטרים וקובעים}

2.2. UserDao

לאחר מכן, ניצור את UserDao ממשק המספק פעולות CRUD פשוטות עבור מִשׁתַמֵשׁ תְחוּם:

ממשק ציבורי UserDao {void create (משתמש משתמש); משתמש קרא (מזהה ארוך); עדכון ריק (משתמש משתמש); מחיקה בטלה (מחרוזת שם משתמש); }

2.3. UserDaoImpl

אחרון, ניצור את UserDaoImpl כיתה המיישמת את UserDao מִמְשָׁק:

מחלקת ציבור UserDaoImpl מיישמת את UserDao {EntityManager entityManager הסופי הפרטי; @ ביטול בטל ציבורי ליצור (משתמש משתמש) {entityManager.persist (משתמש); } @Override משתמש ציבורי קרא (מזהה ארוך) {return entityManager.find (User.class, id); } // ...}

כאן, לשם הפשטות, השתמשנו ב- JPA EntityManager ממשק לאינטראקציה עם אחסון בסיסי ולספק מנגנון גישה לנתונים מִשׁתַמֵשׁ תְחוּם.

3. תבנית מאגר

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

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

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

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

בואו נבחן יישום פשוט של דפוס המאגר עבור ה- מִשׁתַמֵשׁ תְחוּם.

3.1. UserRepository

ראשית, בואו ניצור את UserRepository מִמְשָׁק:

ממשק ציבורי UserRepository {User get (מזהה ארוך); void add (משתמש משתמש); עדכון ריק (משתמש משתמש); בטל הסרה (משתמש משתמש); }

הנה, הוספנו כמה שיטות נפוצות כמו לקבל, לְהוֹסִיף, עדכון, ו לְהַסִיר לעבוד עם אוסף החפצים.

3.2. UserRepositoryImpl

לאחר מכן, ניצור את UserRepositoryImpl בכיתה המספקת יישום של UserRepository מִמְשָׁק:

מחלקה ציבורית UserRepositoryImpl מיישמת UserRepository {פרטי UserDaoImpl userDaoImpl; @Override משתמש ציבורי מקבל (מזהה ארוך) {משתמש משתמש = userDaoImpl.read (מזהה); משתמש חוזר; } @ הוספה על ביטול חלל ציבורי (משתמש משתמש) {userDaoImpl.create (משתמש); } // ...}

הנה, השתמשנו ב- UserDaoImpl כדי לשלוח / לאחזר נתונים ממסד הנתונים.

עד כה, אנו יכולים לומר כי היישומים של DAO ומאגר נראים דומים מאוד מכיוון ש- מִשׁתַמֵשׁ מחלקה היא תחום אנמי. ומאגר הוא רק שכבה נוספת מעל שכבת הגישה לנתונים (DAO).

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

4. תבנית מאגר עם מספר רב של DAOs

כדי להבין בבירור את ההצהרה האחרונה, בואו נשפר את שלנו מִשׁתַמֵשׁ תחום לטיפול במקרה שימוש עסקי.

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

4.1. צִיוּץ

ראשית, ניצור את צִיוּץ מחלקה עם כמה מאפיינים המכילים את המידע על הציוץ:

כיתה ציבורית ציוץ {דוא"ל מחרוזת פרטי; פרטי מחרוזת tweetText; תאריך תאריך פרטי נוצר; // גטרים וקובעים}

4.2. TweetDao ו TweetDaoImpl

ואז, בדומה ל UserDao, ניצור את TweetDao ממשק המאפשר אחזור ציוצים:

ממשק ציבורי TweetDao {רשימה fetchTweets (דוא"ל מחרוזת); }

כמו כן, ניצור את TweetDaoImpl מחלקה המספקת את יישום ה- fetchTweets שיטה:

מחלקה ציבורית TweetDaoImpl מיישמת את TweetDao {@Override Public List fetchTweets (דוא"ל מחרוזת) {List tweets = new ArrayList (); // התקשר ל- API של Twitter והכין ציוצים להחזרת אובייקטים של Tweet; }}

כאן נתקשר לממשקי API של טוויטר כדי להביא את כל הציוצים על ידי משתמש באמצעות הדוא"ל שלו.

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

4.3. להגביר מִשׁתַמֵשׁ תְחוּם

אחרון, בואו ניצור את UserSocialMedia תת מחלקה שלנו מִשׁתַמֵשׁ בכיתה כדי לשמור רשימה של צִיוּץ חפצים:

מחלקה ציבורית UserSocialMedia מרחיב משתמש {ציוצים של רשימה פרטית; // גטרים וקובעים}

הנה, שלנו UserSocialMedia class הוא תחום מורכב המכיל את המאפיינים של ה- מִשׁתַמֵשׁ גם דומיין.

4.4. UserRepositoryImpl

עכשיו נשדרג את שלנו UserRepositoryImpl בכיתה לספק א מִשׁתַמֵשׁ אובייקט תחום יחד עם רשימת ציוצים:

מחלקה ציבורית UserRepositoryImpl מיישמת UserRepository {פרטי UserDaoImpl userDaoImpl; TweetDaoImpl פרטי tweetDaoImpl; @Override משתמש ציבורי מקבל (מזהה ארוך) {UserSocialMedia user = (UserSocialMedia) userDaoImpl.read (id); רשימת ציוצים = tweetDaoImpl.fetchTweets (user.getEmail ()); user.setTweets (ציוצים); משתמש חוזר; }}

הנה ה UserRepositoryImpl מחלץ נתוני משתמשים באמצעות UserDaoImpl וציוצים של המשתמש באמצעות TweetDaoImpl.

לאחר מכן, הוא מצטבר את שתי קבוצות המידע ומספק אובייקט תחום של ה- UserSocialMedia כיתה שנוחה למקרה השימוש העסקי שלנו. לָכֵן, מאגר מסתמך על DAOs לגישה לנתונים ממקורות שונים.

באופן דומה, אנו יכולים לשפר את שלנו מִשׁתַמֵשׁ דומיין לשמור רשימת פוסטים בפייסבוק.

5. השוואת שני הדפוסים

עכשיו, כשראינו את הניואנסים של דפוסי DAO ו- Repository, בואו נסכם את ההבדלים ביניהם:

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

כמו כן, אם יש לנו תחום אנמי, המאגר יהיה רק ​​DAO.

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

6. מסקנה

במאמר זה בחנו את ההבדלים בין דפוסי DAO למאגר.

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

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

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

כרגיל, כל יישומי הקוד זמינים ב- GitHub.


$config[zx-auto] not found$config[zx-overlay] not found