Visitor Pattern

משתמש122

New member
Visitor Pattern

כיצד אני פותר מצב בו המתודה ב-visitor שלי מקבלת יותר מארגומנט אחד? כלומר המימוש של accept באלמנטים עצמם אמור לקבל בנוסף ל-visitor ארגומנט נוסף כדי להפעיל את ה-visit שלו. דוגמא מהרשת:
interface Visitor { void visit(Gladiolus g); void visit(Runuculus r); void visit(Chrysanthemum c); } // The Flower hierarchy cannot be changed: interface Flower { void accept(Visitor v); } class Gladiolus implements Flower { public void accept(Visitor v) { v.visit(this);} } class Runuculus implements Flower { public void accept(Visitor v) { v.visit(this);} } class Chrysanthemum implements Flower { public void accept(Visitor v) { v.visit(this);} } // Add the ability to produce a string: class StringVal implements Visitor { String s; public String toString() { return s; } public void visit(Gladiolus g) { s = "Gladiolus"; } public void visit(Runuculus r) { s = "Runuculus"; } public void visit(Chrysanthemum c) { s = "Chrysanthemum"; } }​
אזי בתוך כל אחד ממממשי ה-Flower, למשל Gladiolus אמור להתקבל ארגומנט נוסף למתודה visit. (כמובן שהחתימה שבתוך Visitor תשתנה בהתאם) אותו ארגומנט יתקבל ע"י קלאס נוסף שיפעיל את הקריאה ל-accept על אותו האלמנט. מקווה שאני ברור ושהפיתרון הוא בחזקת "אל תיתפס לדוגמה". לעניות דעתי ישנה בעייתיות באופן הנ"ל, שכן כל חתימה שונה ב-visitor מחייבת מתודה accept שונה במידה והעברת הפרמטרים נעשית כך, ואולי אין בכך בעיה? תודה.
 

arnonrgo

New member
על הvisitor

תלוי מה אתה צריך לעשות אבל בגדול אפשרות אחת היא להוסיף את הפרמטר על הvisitor ( שהvisitor לא יהיה מודע למשמעות של הפרמטר) ארנון
 

משתמש122

New member
לא הבנתי...

את הפרמטר אני צריך להוסיף למתודה של ה-visitor, בכדי הוא יוכל להשתמש בו לטובת מניפולציה כלשהי על ה-visitable (מה שנקרא בדוגמא Flower), לכן יש משמעות וחשיבת לפרמטר. השאלה היא האם זה לגיטימי לשנות את החתימה של אותו ה-accept? האם אין כאן הפרה לכאורה של הדיזיין או יתרה מזה, באם יש מתודה נוספת ב-visitor עם חתימה שונה, האם זה דורש accept() נוסף תואם בכל אחד מה-Flowers בהתאמה? פשוט לא יצא לי לפגוש דוגמא כזאת, למשל שה-VISITOR מכיל בתוך מתודה כזאת למשל:
void visit(Gladiolus g, String s);​
כמובן שאותה חתימה תהיה עבור שאר המחלקות. תודה.
 

arnonrgo

New member
כמה דברים

1. איןמשמעות לשאלה "האם אין כאן הפרה של הדיסיין" patternsים נועדו לתת כלים כדי לפתור בעיות הן לא מטרה בפני עצמם ובכל מקרה הם בסיס לעבודה שאפשר לשנות אותו עפ"י הצורך 2. מה שאני רשמתי היא להוסיף מתודה בממשק של הvisitor כך שאפשר יהיה לקנפג אותו - זה לא מתאים לבעיה כפי שאתה מתאר מפני שאז הvisitor ממשיך עם הקונפיגורציה האחרונה שנקבע עד שישנו אותה 3. מה שאתה מציע נראה לי פתרון סביר לדרישה שלך - מה שכן לא הייתי נכנס למספר חתימות של הvisitor בלי סיבה טובה - כמו שציינת זה אכן דורש accept נוסף מפני שאתה לא יודע באיזו צורה יקראו לך ארנון
 
למעלה