מבוא ל- JaVers

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

במאמר זה נבחן את ה- ג'ברס סִפְרִיָה.

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

2. תלות של Maven

כדי להתחיל תן לנו להוסיף את ליבת הליבה תלות Maven שלנו pom.xml:

 org.javers javers-core 3.1.0 

אנו יכולים למצוא את הגרסה האחרונה ב- Maven Central.

3. איתור שינויים במדינת POJO

נתחיל בפשטות אדם מעמד:

אדם בכיתה ציבורית {מזהה שלם פרטי; שם מחרוזת פרטי; // גטרים סטנדרטיים / בונים}

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

אנו יכולים להשוות את שני האובייקטים הללו באמצעות ה- לְהַשְׁווֹת() שיטה מה- ג'ברס מעמד:

@Test ציבור בטל givenPersonObject_whenApplyModificationOnIt_thenShouldDetectChange () {// נתון Javers javers = JaversBuilder.javers (). Build (); אדם אדם = אדם חדש (1, "תוכנית מיכאל"); אדם personAfterModification = אדם חדש (1, "Michael Java"); // כאשר Diff diff = javers.compare (person, personAfterModification); // ואז ChangeChange change = diff.getChangesByType (ValueChange.class) .get (0); assertThat (diff.getChanges ()). hasSize (1); assertThat (change.getPropertyName ()). isEqualTo ("שם"); assertThat (change.getLeft ()). isEqualTo ("תוכנית מייקל"); assertThat (change.getRight ()). isEqualTo ("מייקל ג'אווה"); }

4. איתור שינוי מצב ברשימת האובייקטים

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

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

שינוי זה יכול להיות לא רצוי משום מה ואנחנו רוצים לבדוק את השינויים שהתרחשו ברשימה זו. JaVers מאפשר לנו לעשות זאת באמצעות CompareCollections () שיטה:

@Test ציבורי בטל givenListOfPersons_whenCompare_ThenShouldDetectChanges () {// נתון Javers javers = JaversBuilder.javers (). Build (); Person personThatWillBeRemoved = אדם חדש (2, "קישור תומאס"); רשימת oldList = Lists.asList (אדם חדש (1, "תוכנית מייקל"), personThatWillBeRemoved); רשימת newList = Lists.asList (אדם חדש (1, "מייקל לא תוכנית")); // כאשר Diff diff = javers.compareCollections (oldList, newList, Person.class); // ואז assertThat (diff.getChanges ()). hasSize (3); ValueChange valueChange = diff.getChangesByType (ValueChange.class) .get (0); assertThat (valueChange.getPropertyName ()). isEqualTo ("שם"); assertThat (valueChange.getLeft ()). isEqualTo ("תוכנית מייקל"); assertThat (valueChange.getRight ()). isEqualTo ("תוכנית מייקל לא"); ObjectRemoved objectRemoved = diff.getChangesByType (ObjectRemoved.class) .get (0); assertThat (objectRemoved.getAffectedObject (). get (). שווה (personThatWillBeRemoved)) .isTrue (); ListChange listChange = diff.getChangesByType (ListChange.class) .get (0); assertThat (listChange.getValueRemovedChanges (). size ()). isEqualTo (1); }

5. השוואת גרפי אובייקטים

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

אנו יכולים למצוא בקלות את סוג השינוי שחל:

@Test public void givenListOfPerson_whenPersonHasNewAddress_thenDetectThatChange () {// given Javers javers = JaversBuilder.javers (). Build (); PersonWithAddress person = חדש PersonWithAddress (1, "טום", Arrays.asList (כתובת חדשה ("אנגליה"))); PersonWithAddress personWithNewAddress = PersonWithAddress חדש (1, "טום", Arrays.asList (כתובת חדשה ("אנגליה"), כתובת חדשה ("ארה"ב"))); // כאשר Diff diff = javers.compare (person, personWithNewAddress); רשימת objectsByChangeType = diff.getObjectsByChangeType (NewObject.class); // ואז assertThat (objectsByChangeType) .hasSize (1); assertThat (objectsByChangeType.get (0) .equals (כתובת חדשה ("ארה"ב"))); }

באופן דומה, יתגלה הסרת כתובת:

@Test הציבור בטל givenListOfPerson_whenPersonRemovedAddress_thenDetectThatChange () {// נתון Javers javers = JaversBuilder.javers (). Build (); PersonWithAddress person = חדש PersonWithAddress (1, "טום", Arrays.asList (כתובת חדשה ("אנגליה"))); PersonWithAddress personWithNewAddress = PersonWithAddress חדש (1, "טום", Collections.emptyList ()); // כאשר Diff diff = javers.compare (person, personWithNewAddress); רשימת objectsByChangeType = diff.getObjectsByChangeType (ObjectRemoved.class); // ואז assertThat (objectsByChangeType) .hasSize (1); assertThat (objectsByChangeType.get (0) .equals (כתובת חדשה ("אנגליה"))); }

6. מסקנה

במאמר מהיר זה, השתמשנו בספריית JaVers, ספרייה שימושית שנותנת לנו ממשקי API לזיהוי שינויים במצב באובייקטים שלנו. לא רק שהוא יכול לזהות את השינוי באובייקט POJO פשוט, אלא גם לזהות שינויים מורכבים יותר באוספי האובייקטים, או אפילו גרפי אובייקטים.

כמו תמיד, הקוד זמין ב- GitHub.


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