דפוסי DAO לעומת מאגר
לעתים קרובות, היישומים של מאגר ו- 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 מִמְשָׁק: הנה, השתמשנו ב- UserDaoImpl כדי לשלוח / לאחזר נתונים ממסד הנתונים. עד כה, אנו יכולים לומר כי היישומים של DAO ומאגר נראים דומים מאוד מכיוון ש- מִשׁתַמֵשׁ מחלקה היא תחום אנמי. ומאגר הוא רק שכבה נוספת מעל שכבת הגישה לנתונים (DAO). עם זאת, נראה כי DAO מועמד מושלם לגשת לנתונים, ומאגר הוא דרך אידיאלית ליישום מקרה שימוש עסקי.. כדי להבין בבירור את ההצהרה האחרונה, בואו נשפר את שלנו מִשׁתַמֵשׁ תחום לטיפול במקרה שימוש עסקי. תאר לעצמך שאנחנו רוצים להכין פרופיל מדיה חברתית של משתמש על ידי צבירת ציוצים בטוויטר שלו, פוסטים בפייסבוק ועוד. ראשית, ניצור את צִיוּץ מחלקה עם כמה מאפיינים המכילים את המידע על הציוץ: ואז, בדומה ל UserDao, ניצור את TweetDao ממשק המאפשר אחזור ציוצים: כמו כן, ניצור את TweetDaoImpl מחלקה המספקת את יישום ה- fetchTweets שיטה: כאן נתקשר לממשקי API של טוויטר כדי להביא את כל הציוצים על ידי משתמש באמצעות הדוא"ל שלו. לכן, במקרה זה, DAO מספק מנגנון גישה לנתונים באמצעות ממשקי API של צד שלישי. אחרון, בואו ניצור את UserSocialMedia תת מחלקה שלנו מִשׁתַמֵשׁ בכיתה כדי לשמור רשימה של צִיוּץ חפצים: הנה, שלנו UserSocialMedia class הוא תחום מורכב המכיל את המאפיינים של ה- מִשׁתַמֵשׁ גם דומיין. עכשיו נשדרג את שלנו UserRepositoryImpl בכיתה לספק א מִשׁתַמֵשׁ אובייקט תחום יחד עם רשימת ציוצים: הנה ה UserRepositoryImpl מחלץ נתוני משתמשים באמצעות UserDaoImpl וציוצים של המשתמש באמצעות TweetDaoImpl. לאחר מכן, הוא מצטבר את שתי קבוצות המידע ומספק אובייקט תחום של ה- UserSocialMedia כיתה שנוחה למקרה השימוש העסקי שלנו. לָכֵן, מאגר מסתמך על DAOs לגישה לנתונים ממקורות שונים. באופן דומה, אנו יכולים לשפר את שלנו מִשׁתַמֵשׁ דומיין לשמור רשימת פוסטים בפייסבוק. עכשיו, כשראינו את הניואנסים של דפוסי DAO ו- Repository, בואו נסכם את ההבדלים ביניהם: כמו כן, אם יש לנו תחום אנמי, המאגר יהיה רק DAO. בנוסף, דפוס המאגר מעודד תכנון מונחה תחום, ומספק הבנה קלה של מבנה הנתונים גם לחברי צוות שאינם טכניים. במאמר זה בחנו את ההבדלים בין דפוסי DAO למאגר. ראשית, בחנו יישום בסיסי של דפוס ה- DAO. לאחר מכן, ראינו יישום דומה באמצעות דפוס המאגר. אחרון בדקנו מאגר המשתמש במספר DAOs, ומשפר את יכולות הדומיין לפתור מקרה שימוש עסקי. לכן, אנו יכולים להסיק כי דפוס המאגר מוכיח גישה טובה יותר כאשר אפליקציה עוברת מלהיות ממוקדת נתונים לעסקי. כרגיל, כל יישומי הקוד זמינים ב- GitHub.מחלקה ציבורית UserRepositoryImpl מיישמת UserRepository {פרטי UserDaoImpl userDaoImpl; @Override משתמש ציבורי מקבל (מזהה ארוך) {משתמש משתמש = userDaoImpl.read (מזהה); משתמש חוזר; } @ הוספה על ביטול חלל ציבורי (משתמש משתמש) {userDaoImpl.create (משתמש); } // ...}
4. תבנית מאגר עם מספר רב של DAOs
4.1. צִיוּץ
כיתה ציבורית ציוץ {דוא"ל מחרוזת פרטי; פרטי מחרוזת tweetText; תאריך תאריך פרטי נוצר; // גטרים וקובעים}
4.2. TweetDao ו TweetDaoImpl
ממשק ציבורי TweetDao {רשימה fetchTweets (דוא"ל מחרוזת); }
מחלקה ציבורית TweetDaoImpl מיישמת את TweetDao {@Override Public List fetchTweets (דוא"ל מחרוזת) {List tweets = new ArrayList (); // התקשר ל- API של Twitter והכין ציוצים להחזרת אובייקטים של Tweet; }}
4.3. להגביר מִשׁתַמֵשׁ תְחוּם
מחלקה ציבורית UserSocialMedia מרחיב משתמש {ציוצים של רשימה פרטית; // גטרים וקובעים}
4.4. UserRepositoryImpl
מחלקה ציבורית UserRepositoryImpl מיישמת UserRepository {פרטי UserDaoImpl userDaoImpl; TweetDaoImpl פרטי tweetDaoImpl; @Override משתמש ציבורי מקבל (מזהה ארוך) {UserSocialMedia user = (UserSocialMedia) userDaoImpl.read (id); רשימת ציוצים = tweetDaoImpl.fetchTweets (user.getEmail ()); user.setTweets (ציוצים); משתמש חוזר; }}
5. השוואת שני הדפוסים
6. מסקנה