Web Analytics
Privacy Policy Cookie Policy Terms and Conditions שיחה:פולימורפיזם (תוכנה) - ויקיפדיה

שיחה:פולימורפיזם (תוכנה)

מתוך ויקיפדיה, האנציקלופדיה החופשית

הי ! אני ויקפד ירוק יחסית .. ניראה לי שאני רוצה לאמץ את הערך הזה .. אולי העלתי אותו קצת מוקדם מידי לאויר .. חסר לי קצת ידע לגבי: - איך לשייך לקטגוריות. - איך לכתוב קוד C++ באנגלית שיופיע בצד שמאל יפה. - איך לכתוב C++ כך שה- ++ היה לפני ה - C. - בכלל קצת שיפשוף וקפדי לגבי איפה לשים קישורים ואיפה לו.

למה אני מספר את כל זה ?

א. כדי להתנצל קצת.

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

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

בברכת עולם חופשי - אורי מוסנזון 03:37, 13 דצמ' 2004 (UTC)

פעלת בסדר גמור. למידה תוך כדי כתיבה היא שיטה מקובלת כאן. חסר לי קישור של הערך לתכנות מונחה עצמים. דוד שי 04:05, 13 דצמ' 2004 (UTC)
ראשית, ערך יפה מאוד, אם כי חסר לי פירוט גדול יותר של דוגמאות למימוש בפועל של פולימורפיזמים בתכנות. שנית, שיניתי קצת את הניסוח של האלגוריתמים, כדי שלא יהיה לא בלשון זכר ולא בלשון נקבה. זאת כי א) נראה די צורם שזה בלשון נקבה (למרות הכוונות הטובות) כשסגנון הפנייה המקובל בויקיפדיה הוא בלשון זכר דווקא, וב) לטעמי האישי הכי טוב להימנע מפנייה מינית מפורשת כשאין בכך צורך, ודיבור בלשון רבים ציווי פותר את הבעיה. אתה מוזמן לתקן חזרה אם זה מפריע לך (או לומר לי ואני אתקן חזרה). גדי אלכסנדרוביץ' 05:13, 13 דצמ' 2004 (UTC)
אני חושב שהאינטואיציה שלך לגבי פניה למינים היא נכונה, נסיתי להיות קצת פוסט פמיניסטי אבל זה לא היה לעניין.
כן, אני רוצה להוסיף דוגמאות מעשיות וקוד קונקרטי , ראה "הצילו" להבין מה מונע אותי .. אורי מוסנזון 19:24, 13 דצמ' 2004 (UTC)

תוכן עניינים

[עריכה] לא רמות הפשטה אלא מערכות הפשטה

ההגדרה של הערך והדוגמאות מתייחסים ל-"הכללה" המושגת בדרך-כלל בתכנות מונחה-עצמים על-ידי ירושה. אומנם יש כאן רב-צורתיות אולם מסוג מסיום בלבד - "הינו" או "IS A" - המתייחס ליחס ירושה (extends ב-java). פולימורפיזם מתייחס לרב-צורתיות של העצם בהתייחס למערכות הפשטה שונות. פולימורפיזם מושג על-ידי ירושה מרובית ו/או מימוש של מספר מימשקים. בצורה זו העצם יכול לשאת תפקיד שונה במערכות יחסים שונות על-ידי כך שהוא עוטה עליו את המימשק המתאים. למשל עצם מסוג Car העונה גם למימשק UIControl משתלב במערכת ה-GUI (מצייר את עצמו וכו"), עונה למימשק Serializable ומקבל שרותים כגון שמירה לקובץ והעברה בין נדבכים (tiers) מרכיבים תשתיתיים, וכיוצא באלה.

לפיכך בהגדרה המקורית הייתי מציע להחליף "רמות הפשטה" ב-"מערכות הפשטה".

[עריכה] פידבק

הייתי שמח מאד לקבל פידבק על הערך. אני יודע שהוא עדיין חסר מאד ומתלבט מה להוסיף. החלטתי כבר להוסיף הסבר על מימוש של פולימורפיזם בזמן ריצה ע"י virtual table בתוספת איורים סכמטיים, אבל מה עד ? דוגמאות בשפות אחרות ? האם זה חשוב או שהרעיון חוזר על עצמו ? תמונה:oril.pngאורי מוסנזון 11:21, 1 פבר' 2005 (UTC)

"פולימורפיזם (בעברית: "רב צורתיות") הוא מנגנון המאפשר הפעלה של פונקציה מתוך התייחסות מופשטת לאובייקט. הפונקציה שמופעלת אופיינית לסוג האובייקט המסויים אליו התייחסו", לפני כניסה לערך הקורא צריך לצלוח את המשפטים האלו, וזו משימה לא קלה. הייתי גם מוותר על הדוגמה מתהליך גרהם שמידט. ההסבר עם המכונית והחלפת הגלגל מצוין. שש"ז 12:20, 1 פבר' 2005 (UTC)
לטעמי (אם כי אני סטודנט למתמטיקה) הדוגמא של הוקטורים גם היא מצויינת, ויותר מזה - מדגימה גם מקום שבו ייתכן שימוש מעשי בפולימורפיזמים. בשום פנים ואופן לא להוריד (מה גם שרוב הסטודנטים למדעי המחשב ידעו מהו וקטור ומהו תהליך גרהאם שמידט). גדי אלכסנדרוביץ' 12:27, 1 פבר' 2005 (UTC)
אני חולק מאוד על דעתך בעניין גרהם שמיט. סה"כ בניגוד להחלפת הגלגל, זו כן דוגמה שאפשר לעשות בשפת תכנות, ונותנת לערך קשר למשהו אמיתי. eman 12:29, 1 פבר' 2005 (UTC)
אבל לא כל מי שמתעניין מונחה עצמים הוא סטודנט למדעי המחשב... כשמסבירים לדובר עברית מילה באנגלית לא צריך להשתמש באמצע בסינית, לטעמי.
בקשר למשפטים הקשים בהתחלה, יכל להיות ש-שש"ז צודק אבל מצד שני אני חושב שהמשפטים הראשונים בערך אינציקלופדי אמורים להגדיר את המושג ללא כניסה לפרטים. לאחר מכן צריכים לבוא הפרטים והאינטואיציות. לא מצאתי דרך לעשות זאת ע"י משפטים אחרים בהתחלה. אנשטיין אמר פעם שכל דבר יש להסביר באופן הפשוט ביותר אבל לא באופן פשטני (אין לי את הציטוט המדויק). אם יש לכם הצעות להעביר את הרעיון בצורה פשוטה יותר אבל לא פשטנית, אשמח לראות. בקשר לדוגמת גרהם שמידט, אני מסכים עם גדי ו - eman . לדעתי טוב שיהיו דוגמאות ממיספר תחומים שונים. עם קוראים מסויימים חסרים את הרקע להבין את חלקן, זה לא נורא. אולי כדאי להוסיף הערה, שהדוגמה רק ממחישה את הרעיון ואיננה הכרחית להבנת המושג. תמונה:oril.pngאורי מוסנזון 20:36, 1 פבר' 2005 (UTC)
לפי דעתי כל סטודנט במדעי הטבע או ההנדסה בשנה א' צריך להיתקל במושג הזה בקורס לאלגברה ברמה כלשהי בשנה א'. eman 22:54, 1 פבר' 2005 (UTC)

[עריכה] על ההבדל בין פולימורפיזם והמנגנונים להשגתו

אורי היקר, כל הכבוד על היוזמה הברוכה!

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

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

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

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

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

keep on the good work!

--דן צפריר 16:06, 13 אפר' 2005 (UTC)

ברוך הבא יקירי, טוב לראות אותך כאן! שים לב שויקיפדיה היא ויקי - כל אחד יכול לערוך את הערך. הפיסקה הראשונה אותה ביקרת הוספה ע"י מלח השמים ובדף השיחה שלו תמצא התנגדות שכתבתי לפיסקה זו (דומה לשלך).נסה לבדוק את "גרסאות קודמות" שם תמצא פיסקה אלטרנטיבית שלי. יש גם מנגנון diff בין גרסאות. בויקי כמו בויקי, כל אחד יכל לערוך, גם אתה. אשמח עם תשנה את הפיסקה הראשונה. אני עצמי מתלבט קשות בקשר אליה. תמונה:oril.pngאורי מוסנזון 16:18, 13 אפר' 2005 (UTC)
קשלה לי להאמין שזה יקרה :) נדמה לי שאסתפק בהערתי זו ואשאיר את היתר בידך... --דן צפריר 10:49, 17 אפר' 2005 (UTC)
ניתן לכתוב פולימורפיזם כאשר מה שמשתנה זה הפקודות. למשל יש לך טיפוס של מסמך ואילו הפקודות עליו משתנות ע"י הורשה. טרול רפאים 16:24, 13 אפר' 2005 (UTC)
בפולימורפיזם, "מה שמשתנה" זה תמיד "הפקודות". כל העניין בפולימורפיזם זה לדעת מה הן הפקודות הנכונות אותן יש להפעיל (וכשאני אומר "לדעת", אני מתכוון שהמנוע של השפה צריך לדעת). ברם, "הפקודות", לדג' של המסמך עליו אתה מדבר, משתנות כיוון שהטיפוס של המסמך משתנה. אתה מדמיין שאתה כותב: ref.function, מה שלמעשה קרה הוא שקראת ל- function עם ארגומנט אחד (ref), וע"פ הטיפוס *האמיתי* של ref, המנוע של השפה יודע להכריע לאיזו function בדיוק יש לקרוא. במילים אחרות, this הוא הארגומנט הראשון של כל פונקציה וירטואלית, אשר לפי טיפוסו (האמיתי, הקונקרטי) השפה יודעת להכריע לאיזה פונקציה לקרוא. שורה תחתונה: הפקודות משתנות בגלל שהטיפוס משתנה ואין דבר כזה "הפקודות עליו משתנות" --- לא, הטיפוס השתנה ולכן הפקודות השתנו בהתאמה. --דן צפריר 10:49, 17 אפר' 2005 (UTC)
אגב, אורי, מן הסתם יש להבהיר אי הבנה זו כבר בהגדרה: אנשים תמיד שוכחים ש- this הוא הארגומנט הראשון ולפי טיפוסו נקבע לאיזה פונקציה קוראים.--דן צפריר 10:49, 17 אפר' 2005 (UTC)
האמירה שזה מגנון הכללה איננה מדויקת, ב-Perl אינך צריך לעשות דבר בשביל לקבל פולימורפיזם, למעשה אין הפרדה ב-Perl בין האובייקטים השונים ולכן מקבלים את התוצאה הזאת. טרול רפאים 16:24, 13 אפר' 2005 (UTC)
"האמירה" מדיוקת ביותר! וגם ב- Perl עליך (או על מי שכתב את האוביקטים בהם אתה משתמש) לעשות הרבה יותר מאשר "שום דבר". אין קסם ב- Perl. פולימורפיזם ב- Perl עובד בדיוק כמו בירושה של Java או ++ C (כלומר ע"י פוינטרים לפונקציות). עליך (או על הכותב של הספרייה) לממש גירסה של פעולה לכל טיפוס --דן צפריר 10:49, 17 אפר' 2005 (UTC)
זה לא נכון, אין ב-Perl טבלת פוינטרים כמו שיש ב-C++. מה שקורא זה שהקומפלייר עושה חיפוש טקטסטואלי על רשימת הפונקציות שהוא מחזיק (ולא רק על אלו שקשורות לאובייקט). התהליך הוא גלובלי, לא מקומי. טרול רפאים 16:10, 17 אפר' 2005 (UTC)
מה יהיה איתך, טרול? ראשית, אתה טועה בקשר ל- perl שבהחלט עובדת עם פוינטרים לפונקציות (לדג', נניח שיש לך סברוטינה בשם f אזי fref = \&f$ זה הפוינטר שלה ואתה יכול להפעילה כך: ()<-fref$ ; ראה פרק 6 ב- "perl programming" ספר הגמל). ודאי שפולימורפיזם ב- perl ממומש כך (ולא ע"י חיפוש טקסטואלי) שכן יוצרי השפה הם בחורים די אינטליגנטים (ראה את קוד המקור של perl שכתוב ב- C ובו רפרנס לסברוטינה של perl מתרגם במיידי לפוינטר לפונקציה של C).
אבל שנית, והרבה יותר חשוב, גם אם היית צודק בטענתך, זה רק היה מחזק את ההגדרה הנ"ל של פולימורפיזם: זהו מנגנון הכללה המאפשר לך לכתוב אלגוריתם אחד שעובד בעבור הרבה צורות (טיפוסים). ואין זה משנה איך בדיוק העסק ממומש (פוינטר לפונקציה או חיפוש טקסטואלי בזמו ריצה, אוtemplate, או void*). כל אלו הם *אמצעים* להשגת *המטרה*: שהיא, כאמור, כתיבת אלגוריתם מוכלל פעם אחת בלבד, במקום שיכפול הקוד בעבור כל צורה.--דן צפריר 10:17, 20 אפר' 2005 (UTC)
ולכל המפקפקים: ההגדרה של Bjarne Stroustroup (עמ' 347 ב- "The C++ Programming Language 3rd. ed"):
Code implementing the template is identical for all parameter types, as is most code using the template. An abstract class defines an interface. Much code for different implmentations of the abstract class can be shared in class heirarchies, and most code using the abstract class doesn't depend on its implementation. From a design perspective, the two approaches are so close that they deserve a common name. Since both allow an algorithm to be expressed once and applied to a variety of types, people sometimes refer to both as polymorphic. To distinguish them, what virtual functions provide is called run-time polymorphism, and what templates offer is called compile-time polymorphism
--דן צפריר 11:07, 20 אפר' 2005 (UTC)
השאלה היא מה ה-Key של הפונקציה, כמובן שב-Perl לא מחפשים בטקסט עצמו אלא בטבלת הפונקציות (במיוחד שהתוכנית מקומפלת בהתחלה!). ה-Key שם הוא טקסטואלי ובוודאי שזה עובד ככה שעושים ירושה ב-Perl. טרול רפאים 16:12, 2 מאי 2005 (UTC)

[עריכה] תודה, מלח

ושוב אני נפעם לגלות את רמת הדיסלקציה שלי. טוב שיש אנשים כמוך. מי ייתן והם יקבלו את ההכרה לה הם ראויים.תמונה:oril.pngאורי מוסנזון 16:03, 5 מאי 2006 (IDT)

מצטער, לא מצליח להתאפק. זה כנראה עדיין בוער בעצמותיתמונה:oril.pngאורי מוסנזון 16:04, 5 מאי 2006 (IDT)
האם לא סימנתי את עריכתי כעריכה משנית? מלח השמים שיחה 19:26, 5 מאי 2006 (IDT)
THIS WEB:

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - be - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - closed_zh_tw - co - cr - cs - csb - cu - cv - cy - da - de - diq - dv - dz - ee - el - eml - en - eo - es - et - eu - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gd - gl - glk - gn - got - gu - gv - ha - haw - he - hi - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mg - mh - mi - mk - ml - mn - mo - mr - ms - mt - mus - my - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - rm - rmy - rn - ro - roa_rup - roa_tara - ru - ru_sib - rw - sa - sc - scn - sco - sd - se - searchcom - sg - sh - si - simple - sk - sl - sm - sn - so - sq - sr - ss - st - su - sv - sw - ta - te - test - tet - tg - th - ti - tk - tl - tlh - tn - to - tokipona - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu

Static Wikipedia 2008 (no images)

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - bcl - be - be_x_old - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - co - cr - crh - cs - csb - cu - cv - cy - da - de - diq - dsb - dv - dz - ee - el - eml - en - eo - es - et - eu - ext - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gan - gd - gl - glk - gn - got - gu - gv - ha - hak - haw - he - hi - hif - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kaa - kab - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mdf - mg - mh - mi - mk - ml - mn - mo - mr - mt - mus - my - myv - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - quality - rm - rmy - rn - ro - roa_rup - roa_tara - ru - rw - sa - sah - sc - scn - sco - sd - se - sg - sh - si - simple - sk - sl - sm - sn - so - sr - srn - ss - st - stq - su - sv - sw - szl - ta - te - tet - tg - th - ti - tk - tl - tlh - tn - to - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu -

Static Wikipedia 2007:

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - be - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - closed_zh_tw - co - cr - cs - csb - cu - cv - cy - da - de - diq - dv - dz - ee - el - eml - en - eo - es - et - eu - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gd - gl - glk - gn - got - gu - gv - ha - haw - he - hi - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mg - mh - mi - mk - ml - mn - mo - mr - ms - mt - mus - my - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - rm - rmy - rn - ro - roa_rup - roa_tara - ru - ru_sib - rw - sa - sc - scn - sco - sd - se - searchcom - sg - sh - si - simple - sk - sl - sm - sn - so - sq - sr - ss - st - su - sv - sw - ta - te - test - tet - tg - th - ti - tk - tl - tlh - tn - to - tokipona - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu

Static Wikipedia 2006:

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - be - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - closed_zh_tw - co - cr - cs - csb - cu - cv - cy - da - de - diq - dv - dz - ee - el - eml - en - eo - es - et - eu - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gd - gl - glk - gn - got - gu - gv - ha - haw - he - hi - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mg - mh - mi - mk - ml - mn - mo - mr - ms - mt - mus - my - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - rm - rmy - rn - ro - roa_rup - roa_tara - ru - ru_sib - rw - sa - sc - scn - sco - sd - se - searchcom - sg - sh - si - simple - sk - sl - sm - sn - so - sq - sr - ss - st - su - sv - sw - ta - te - test - tet - tg - th - ti - tk - tl - tlh - tn - to - tokipona - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu