שאלה על Design Pattern

הוליסטי

New member
שאלה על Design Pattern

אני רוצה המלצה לDP מסוים. לשם התחלה רק אציין שהקוד בג'אווה ואני משתמש בתפיסת Exception. הבעיה: יש לי שני COLLECTIONS שעל כל אחד מהם אני צריך לבצע בדיקות (שנתפסות בEXCEPTIONS). (יהיו לי יותר COLLECTIONS). הבדיקות הן מאוד דומות (עד ממש זהות). הנה הקוד של המתודה: הסיבה לשימוש בEXCEPTIONS היא מערכתית. מתודות הבדיקה זורקות את הEXCEPTIONS ואני פשוט צריך להתלבש עליהן. אין אפשרות לשנות את אותן מתודות ודרך העבודה שלהן. ברור לי שצריך DP. השאלה איזה? אשמח לכל דעה ועצה.
public Collection<String> aaa(Collection<ServiceDTO> allServiceDtos) throws ServiceLocatorException, FinderException { final Collection<String> problemsColl = new ArrayList<String>(); final Collection<ServiceDTO> addDtosCollection = getAddDtos(allServiceDtos); final Collection<ServiceDTO> updateDtosCollection = getUpdateDtos(allServiceDtos); try { validateDtosCollection(addDtosCollection); } catch (CatalogException ce) { problemsColl.add(ce.getErrorDescription()); } try { checkInternalPortValidity(addDtosCollection); } catch (CatalogException ce) { problemsColl.add(ce.getErrorDescription()); } try { validatePortRange(addDtosCollection, false); } catch (CatalogException ce) { problemsColl.add(ce.getErrorDescription()); } for (ServiceDTO serviceToAdd : addDtosCollection) { try { checkServiceValidityForAdd(serviceToAdd); } catch (CatalogException ce) { problemsColl.add(ce.getErrorDescription()); } } try { checkInternalPortValidity(updateDtosCollection); } catch (CatalogException ce) { problemsColl.add(ce.getErrorDescription()); } try { validatePortRange(updateDtosCollection, true); } catch (CatalogException ce) { problemsColl.add(ce.getErrorDescription()); } for (ServiceDTO serviceToUpdate : updateDtosCollection) { try { checkServiceValidityForAdd(serviceToUpdate); } catch (CatalogException ce) { problemsColl.add(ce.getErrorDescription()); } } return problemsColl; }​
 

gewitter

New member
עצה מהירה

החזרה הכי ברורה כאן היא ביצוע בדיקה כלשהי על אוסף כלשהו בתוך try-catch ואיסוף ה-Exceptions לאוסף חדש. אתה יכול להפוך את הבדיקות השונות למימוש ממשק Validation נניח, עם מתודה validate, וליצור אובייקט חדש שיקרא ל-validate בתוך try-catch וכו'.
interface Validation { void validate(Collection collection) throws CatalogException; // Add generics. } class ProblemsCollector { private Validation[] validations; public ProblemsCollector(Validation[] validations) { this.validations = validations; } public Collection<String> validate(Collection collection) { // Add generics yourself. Collection<String> result = new ArrayList<String>(); for (Validation validation: validations) { try { validation.validate(collection); } catch (CatalogException ce) { result.add(ce.getErrorDescription()); } } return result; } } // ... Somewhere inside "aaa" method Validation[] validations = new Validation[] { new Validation() { public void validate(Collection collection) { validateDtosCollection(collection); } }, new Validation() { public void validate(Collection collection) { checkInternalPortValidity(collection); } }//, etc. }; ProblemsCollector pc = new ProblemsCollector(validations); Collection<String> addDtosProblems = pc.validate(addDtosCollection); // ... the same for other collections. // Merge the problem-collections.​
בעצם הכי נכון כדי לשמר בדיוק את אותה פונקציונליות שיש לך כרגע, להעביר את problemsColl בתור פרמטר ולתת ל-validate להשתמש בו במקום ליצור חדש. בטח יש עוד בעיות בקוד שלא שמתי לב אליהן.
 

gewitter

New member
בעיה אישית שתמיד יש לי עם הפתרון

הוא לא חוסך הקלדה, בגלל שיטת הקלאס האנונימי. אבל זה כן מונע שיכפול של תפיסת ה-exceptions. בנוסף, בגלל ששאלת על DP, אפשר לקרוא לזה Command.
 
למעלה