1.37k likes | 1.68k Views
עיצוב תוכנה מבוסס עצמים סדנאות תשס"ח-תשס"ט. פתיחת חלק השני של השתלמות 10.09.08 מרצים ד"ר יבגני קנל אניטה קספו. תכונית ההשתלמות. חלק א' – 28 שעות מ- 06.02.2008 עד 30.04.2008 חלק ב' – 28 שעות מ- 10.09.08 עד 26.11.08 אתר מלווה קורס
E N D
עיצוב תוכנה מבוסס עצמים סדנאות תשס"ח-תשס"ט פתיחת חלק השני של השתלמות 10.09.08 מרצים ד"ר יבגני קנל אניטה קספו עיצוב תוכנה מבוסס עצמים באר-שבע 2008
תכונית ההשתלמות • חלק א' – 28 שעות • מ- 06.02.2008 עד 30.04.2008 • חלק ב' – 28 שעות • מ- 10.09.08 עד 26.11.08 • אתר מלווה קורס http://www.orianit.edu-negev.gov.il/anitaksp נא להיכנס להירשם באתר - הדיונים בפורום סגורים לאורחים סדנה ב-"עיצוב תוכנה מבוסס עצמים" באר-שבע 2008
תכונית ההשתלמות • ההשתלמות מוגדרת – ל-56 שעות עם ציון • דרישות ההשתלמות: • שיעורי בית , שיוכנסו לאתר המלווה לאחר כל מפגש – ישלחו אל יבגני במייל. • בעיה מלווה יבוצעו בזוגות ויוצגו במחצית השנייה של ההשתלמות. • כל משתלמם יכתוב שאלה חדשה לכל פרק. ובעזרת כל המשתתפים יבנה מאגר שאלות. סדנה ב-"עיצוב תוכנה מבוסס עצמים" באר-שבע 2008
לוח זמנים • 10.09.08 – חזרה לכיתה. מיסודות - לעיצוב. המלצות לתכנון. מבוא, פרקים 1,2,3. • 17.09.08 – רקורסיה (פרק 4), יעילות (פרק 5) • 24.09.08 – עץ בינארי (פרק 10) • 22.10.08 – מפה – סוג חדש של אוסף נתונים. • 29.10.08 – • 12.11.08 – • 26.11.08 – סדנה ב-"עיצוב תוכנה מבוסס עצמים" באר-שבע 2008
לוח הזמנים של המפגשים • 5:45 – 4:30 – הרצאה פרונטאלית תיאוריה • 6:30 – 5:45 – תרגול ישוום התיאוריה • 6:45 – 6:30 – הפסקה • 7:45 – 6:45 – הרצאה ו/או דיון סדנה ב-"עיצוב תוכנה מבוסס עצמים" באר-שבע 2008
מה לא לימדנו? (כלל או מספיק...) סדנה ב-"עיצוב תוכנה מבוסס עצמים" באר-שבע 2008
מה נצטרך ללמד? האם נספיק? סדנה ב-"עיצוב תוכנה מבוסס עצמים" באר-שבע 2008
מה נצטרך ללמד? האם נספיק? (המשך) מבחנים מתכונות טיולים, פעילויות... מחלות, שביתות... סדנה ב-"עיצוב תוכנה מבוסס עצמים" באר-שבע 2008
לוח זמנים שנתי תשס"ט המלצה סדנה ב-"עיצוב תוכנה מבוסס עצמים" באר-שבע 2008
חזרה והשלמה • רענון אלגוריתמים וטכניקות שונות • יישור קו ויצירת שפה משותפת • דגש על לימוד עצמי – API/MSDN • בניית מחלקות שרות – עבודה עם מספר קבצים בו-זמנית, הכנה לעצמים. סדנה ב-"עיצוב תוכנה מבוסס עצמים" באר-שבע 2008
מחלקות מוכנות • JavaAPI – אוסף הממשקים של המחלקות המוכנות לשימוש • דוגמה: המחלקה String • לרוב יש צורך לייבא את המחלקות המוכנות באמצעות הפקודה import • קיימת ספרייה unit4 המכילה מחלקות עזר לצורך יחידת לימוד זו. סדנה ב-"עיצוב תוכנה מבוסס עצמים" באר-שבע 2008
מחלקות מוכנות • MSDN – אוסף הממשקים של המחלקות המוכנות לשימוש • דוגמה: המחלקה string • לרוב יש צורך לייבא את המחלקות המוכנות באמצעות הפקודה using • קיימת ספרייה Unit4 המכילה מחלקות עזר לצורך יחידת לימוד זו סדנה ב-"עיצוב תוכנה מבוסס עצמים" באר-שבע 2008
חזרה והשלמה • מערך חד-מימדי • מחרוזת • צב גראפי • דלי גראפי סדנה ב-"עיצוב תוכנה מבוסס עצמים" באר-שבע 2008
חזרה והשלמה -מערך נושאים לחזרה: • יצירה ומילוי מערך • ספירת איברים לפי תנאי • סיכם איברים לפי תנאי • בעיות מקסימום ומינימום • בעיות "האם קיים איבר שמקיים תנאי..." מול בעיות "האם מערך כולו מקיים תנאי..." • חיפוש, מיון • מיזוג, השוות מערכים • מערך כפרמטר • פעולות המחזירות מערך. סדנה ב-"עיצוב תוכנה מבוסס עצמים" באר-שבע 2008
יסודות 2 – תוכנית לימודים חזרה והשלמה -מחרוזת • פרק 3: תווים ומחרוזות6) שעות ( • התאמה ל-C# וג`אווה • מטרת הפרק • להקנותכלים לפתרון בעיות לעיבוד טקסט. • פירוט התכנים • מחרוזות; יחס סדר מילוני; ייצוג מחרוזות כמערכי תווים; בניית אלגוריתמיםעבור מחרוזות. • שימוש בפעולות פשוטות של המחלקה : String • אורך מחרוזת, השוואת מחרוזות, העתקת מחרוזות, מחיקת מחרוזות, שרשור מחרוזות, מציאת תת-מחרוזת. סדנה ב-"עיצוב תוכנה מבוסס עצמים" באר-שבע 2008
מחרוזות • הטיפוס String הוא טיפוס בנוי בשפה. המחלקה מוגדרת כ-final זאת אומרת שאי-אפשר לבנות מחלקה ש"יורשת" מ-String סדנה ב-"עיצוב תוכנה מבוסס עצמים" באר-שבע 2008
מה שזה לא !! • הטיפוס String מוגדר מראש כטיפוס לכל דבר. • עצם מטיפוס String אינו מערך של תווים!! (ניתן להמיר מן האחד לשני.) • עצם מטיפוס String הוא קבוע שאי-אפשר לשנות על ידי פנייה לתווים בודדים!! • עיבוד מחרוזות מתבצע ע"י פירוק לתת-מחרוזות והרכבה בשרשור. • קיים טיפוס StringBuffer הדומה למחרוזות המוכרות מ-Pascal ו-C. לא נהוג להשתמש בו. סדנה ב-"עיצוב תוכנה מבוסס עצמים" באר-שבע 2008
הצהרה ויצירה • הצהרה על משתנה מטיפוס String String s; • אתחול s=“Hello”; • הצהרה ואתחול String s=“Hello”; סדנה ב-"עיצוב תוכנה מבוסס עצמים" באר-שבע 2008
מחרוזת – פעולות בסיסיות כל פלט ב-JAVA הוא למעשה פלט של מחרוזת אחת! • פלט System.out.println(s); • הצבה String s1=“aa”; String s2=s1; • שרשור String s3=s1+s2; s1+=s2; String s1="abc"; String s2=s1; String s3="ABC"; s1+=s3; System.out.println(s1); System.out.println(s2); System.out.println(s3); abcABC abc ABC סדנה ב-"עיצוב תוכנה מבוסס עצמים" באר-שבע 2008
כל פלט ב-JAVA הוא למעשה פלט של מחרוזת אחת! שרשור • פעולת השרשור מוגדרת על ידי האופרטור +. • שרשור מייצר עצם חדש: s = s + “***” + t + “\n”; • כל ערךעובר המרה אוטומטית למחרוזת כאשר +מופיע: int count = …; System.out.println(“Count is = “ + count); four=22 String s=“four=“+2+2; סדנה ב-"עיצוב תוכנה מבוסס עצמים" באר-שבע 2008
שימוש בקלט/פלט סטנדרטי אין קלט מסוים לתווים!char c=input.next().charAt(0); סדנה ב-"עיצוב תוכנה מבוסס עצמים" באר-שבע 2008
ערכים של משתנה מהטיפוס String הם עצמים. • בשפה אף מוגדרות פעולות בונות עבור עצמים מן הטיפוס String, למרות שלא חייבים להשתמש בהן. סדנה ב-"עיצוב תוכנה מבוסס עצמים" באר-שבע 2008
שיטות שימושיות ליצירת מחרוזת • יצירת מחרוזת ריקה String s=new String(); • יצירת מחרוזת זהה למחרוזת אחרת s1 String s=new String(s1); • יצירת מחרוזת ממערך תווים String s=new String(charArr); • יצירת מחרוזת מחלק של מערך תווים String s=new String(charArr, 3, 5); סדנה ב-"עיצוב תוכנה מבוסס עצמים" באר-שבע 2008
ניהול הזיכרון עבור משתנים וקבועים String s0; s0="aaa"; String s1="aaa"; if(s1==s0)System.out.println("yes"); else System.out.println("no"); String s2="aaa"; if(s1==s2)System.out.println("yes"); else System.out.println("no"); String s3=new String(s1); if(s1==s3)System.out.println("yes"); else System.out.println("no"); String s4=in.nextLine(); if(s1==s4)System.out.println("yes"); else System.out.println("no"); yes yes no “aaa” no סדנה ב-"עיצוב תוכנה מבוסס עצמים" באר-שבע 2008
s1 s3 s4 s2 “aaa” ניהול הזיכרון עבור משתנים וקבועים String s0; s0="aaa"; String s1="aaa"; if(s1==s0)System.out.println("yes"); else System.out.println("no"); String s2="aaa"; if(s1==s2)System.out.println("yes"); else System.out.println("no"); String s3=new String(s1); if(s1==s3)System.out.println("yes"); else System.out.println("no"); String s4=in.nextLine(); if(s1==s4)System.out.println("yes"); else System.out.println("no"); s0 yes “aaa” yes no “aaa” “aaa” no סדנה ב-"עיצוב תוכנה מבוסס עצמים" באר-שבע 2008
מחרוזות על עצמים מן הטיפוס String ניתן להפעיל פעולות המוגדרות בטיפוס.למשל: indexOf, substring, length, replace… סדנה ב-"עיצוב תוכנה מבוסס עצמים" באר-שבע 2008
מחרוזות ומה עם פעולות? • מאחר ומחרוזות הן עצמים, כאשר מפעילים עליהן פעולות המוגדרות בטיפוס String, משתמשים בתחביר הפעלת פעולה על עצם. כלומר:על העצם ... הפעל את הפעולה ... רשימת פרמטרים ) ( שם העצם . שם הפעולה String s1 = “abcde”; int p = s1.indexOf(‘d’); סדנה ב-"עיצוב תוכנה מבוסס עצמים" באר-שבע 2008
הפעולה int length() • לכל מחרוזת קיימת פעולה length(), המחזירה את האורך של המחרוזת. String s=“ABCD”; System.out.println(s.length()); 4 String s=“”; System.out.println(s.length()); 0 String s; System.out.println(s.length()); Error: variable s might not have been initialized String s=null; System.out.println(s.length()); NullPointerException סדנה ב-"עיצוב תוכנה מבוסס עצמים" באר-שבע 2008
מחרוזת לעומת מערך (length) • שים לב!! • מחרוזת היא עצם שעליה מוגדרת פעולה ללא פרמטרים length(). if (s.length() > 0) …. • לכל מערך קיימת תכונהlength. int[] a = new int[10]; for (int i = 0; i < a.length; i++) סדנה ב-"עיצוב תוכנה מבוסס עצמים" באר-שבע 2008
גישה לתווים בודדים char charAt(int index) • ניתן לקרוא תווים בודדים לפי מיקומם for (int i = 0; i < s.length(); i++) if (s.charAt(i) == ‘*’) count++; מספור מתחיל מ-0! String s=“aaa”; System.out.println(s.charAt(s.length())); StringIndexOutOfBoundsException: String index out of range: 3 • אך אי-אפשר לשנות אותם: String s="aaa"; s.charAt(1)='b'; Error: unexpected type required: variable found : value סדנה ב-"עיצוב תוכנה מבוסס עצמים" באר-שבע 2008
שליפת קבוצת תווים • void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin) String s="We love Java"; int start=3, end=7; char[] dst=new char[end-start]; s.getChars(start,end,dst,0); for(int i=0;i<dst.length;i++) System.out.println(dst[i]); l o v e String s="We love Java"; char[] ch=s.toCharArray(); • char[] toCharArray() s.length() == ch.length סדנה ב-"עיצוב תוכנה מבוסס עצמים" באר-שבע 2008
ממערך תווים– למחרוזת • public staticString valueOf(char[] data, int start, int count) • public staticString valueOf(char[] data) char [] a={'W','e',' ','l','o','v','e',' ','J','a','v','a'}; String sd=String.valueOf(a); System.out.println(sd); We love Java פעולת מחלקה סדנה ב-"עיצוב תוכנה מבוסס עצמים" באר-שבע 2008
מחרוזת --> מערך --> מחרוזת כתוב תוכנית אשר קולטת מחרוזת וממיינת את התווים שבה לפי סדר המילוני We love Java String s=in.nextLine(); System.out.println(s); char [] temp=s.toCharArray(); Arrays.sort(temp); s=String.valueOf(temp); System.out.println(s); We love Java JWaaeelovv סדנה ב-"עיצוב תוכנה מבוסס עצמים" באר-שבע 2008
השוואות בין מחרוזות המחלקה String מספקת מספר מתודות לביצוע השוואה בין אובייקט מטיפוס String מסוים לאובייקט אחר מטיפוס String. public boolean equals(String otherString) מחזירה true אם המחרוזת שמיוצגת על ידי otherString זהה למחרוזת שמיוצגת על ידי האובייקט שממנו מתודה זו הופעלה. public boolean equalsIgnoreCase(String otherString) מחזירהtrue אם המחרוזת שמיוצגת על ידי otherString זהה למחרוזת שמיוצגת על ידי האובייקט שממנו מתודה זו הופעלה. בביצוע ההשוואה אין התחשבות בהבדלים שבין אותיות קטנות וגדולות. public int compareTo(String otherString) מחזירה 0 אם שתי המחרוזות זהות, משמע: ערכן זהה.(הערך מחושב על פי ערך התווים בחישוב עפ"י טבלת ה-Unicode). מחזירה ערך שלילי אם המחרוזת הנתונה בעלת ערך נמוך מהאחרת. מחזירה ערך חיובי אם המחרוזת הנתונה בעלת ערך גבוה מהאחרת סדנה ב-"עיצוב תוכנה מבוסס עצמים" באר-שבע 2008
s1 הבדל בין == ו-equal מאחר וערך של משתנה מטיפוס String הוא עצם, אזי למעשה הערך איננו העצם אלא הוא המצביע אל העצם. בהתאם לכך הפלט של קטע התכנית הבא יהיה No String s1 = “abcde”; String s2 = “abc”; s2 = s2 + “de”; if (s1 == s2) System.out.println(“Yes”); else System.out.println(“No”); “abcde” “de” s2 “abc” “abcde” No סדנה ב-"עיצוב תוכנה מבוסס עצמים" באר-שבע 2008
הבדל בין == ו-equal • אם רוצים להתייחס אל השוואה לקסיקוגראפית כדי לקבל פלט Yes - יש להשתמש בפעולה equals המוגדרת בטיפוס String. String s1 = “abcde”; String s2 = “abc” + “de”; if (s1.equals(s2)) System.out.println(“Yes”); else System.out.println(“No”); סדנה ב-"עיצוב תוכנה מבוסס עצמים" באר-שבע 2008
השוואות בין מחרוזות • equals מחזיר boolean (true/false - זהות/לא זהות) • compareTo משווה שתי מחרוזות לפי סדר מילוני lexicographic. הפונקציה מחזירה int: סדנה ב-"עיצוב תוכנה מבוסס עצמים" באר-שבע 2008
פלט ידוע. מהו הקלט? import java.util.*; public class test42{ static Scanner reader=new Scanner(System.in); public static void main(String[] args){ String s1="abc"; String s2=reader.next(); System.out.println(s1.compareTo(s2)); }} ? -3 d… ae… abf… abcabc abc123 ? ? ? abc סדנה ב-"עיצוב תוכנה מבוסס עצמים" באר-שבע 2008
השוואת מחרוזות - פעולות נוספות • public boolean startsWith(String prefix) • מחזירה true אם המחרוזת הנתונה מתחילה במחרוזת האחרת (prefix) • public boolean endsWith(String suffix) • מחזירה true אם המחרוזת שמיוצגת על ידי האובייקט מסתיימת במחרוזת האחרת (suffix). • public boolean regionMatches(int thisBgn, • String otherStr, int otherStr, int length) • מחזירה true אם שתי המחרוזות זהות בטווח המצוין. ההשוואה נעשית החל ממספר האינדקס thisBgn במחרוזת שמייצג האובייקט לאורך length תווים. במחרוזת האחרת ההשוואה נעשית החל מהתו שמספר האינדקס שלו הוא otherStr. מתודה זו מתחשבת בהבדלים של אותיות קטנות/גדולות. סדנה ב-"עיצוב תוכנה מבוסס עצמים" באר-שבע 2008
מציאת תווים ותת-מחרוזות כל אחת מהמתודות מחזירה את מיקום התו או תת המחרוזתהמבוקשים במחרוזת עפ"י האינדקס המקובל: מ-0עד length-1 אם התו או תת המחרוזת המבוקשת לא נמצאים במחרוזת שמייצג האובייקט אז מוחזר הערך .–1 • public int indexOf(char ch) • מתודה שמחזירה את מספר האינדקס אשר בו נמצא התו ch במחרוזת שמייצג האובייקט. החיפוש אחרי התו מתחיל מתחילתה של המחרוזת, ומספר האינדקס של התו הראשון, שנמצא זהה לתו ch, מוחזר. • public int lastIndexOf(char ch) • מתודה שמחזירה את מספר האינדקס אשר בו נמצא התו ch במחרוזת שמייצג האובייקט. החיפוש אחרי התו מתחיל מסופה של המחרוזת, והמיקום של התו הראשון שנמצא זהה לתו ch מוחזר. סדנה ב-"עיצוב תוכנה מבוסס עצמים" באר-שבע 2008
מציאת תווים ותת-מחרוזות public int indexOf(char ch, int begin) מתודה שמחזירה את מספר האינדקס אשר בו נמצא התו ch במחרוזת שמייצג האובייקט. החיפוש אחריו מתחיל ממספר האינדקס שנשלח אל המתודה, מ- begin, ומספר האינדקס של התו הראשון שנמצא זהה לתו ch מוחזר. public int lastIndexOf(char ch, int fromIndex) מתודה זו מחפשת את התו ch במחרוזת שממנה היא מופעלת החל מאינדקס fromIndex לכיוון התחלתה. התו הראשון שהמתודה מוצאת כזהה לתו ch מוחזר על ידה. סדנה ב-"עיצוב תוכנה מבוסס עצמים" באר-שבע 2008
מציאת תווים ותת-מחרוזות • public int indexOf(String str) • מתודה זו מחפשת מתחילתה של המחרוזת שהאובייקט מייצג את המחרוזת str. מספר האינדקס שבו היא נמצאת מוחזר על ידי המתודה. • public int indexOf(String str, int begin) • מתודה זו מחפשת במחרוזת שהאובייקט מייצג את המחרוזת str החל מהמקום שמספר האינדקס שלו הוא begin לכיוון סופה. • public int lastIndexOf(String str) • מתודה זו מחפשת במחרוזת שמייצג האובייקט את המחרוזת שמיוצגת על ידי str. החיפוש מתחיל מסופה של המחרוזת לכיוון התחלתה. מספר האינדקס שהחל ממנו str נמצאת לראשונה מוחזר על ידי המתודה. • public int lastIndexOf(String str, int fromIndex) • מתודה זו מחפשת במחרוזת שמייצג האובייקט את המחרוזת שמיוצגת על ידי str. החיפוש מתחיל ממיקום fromIndex לכיוון התחלתה של המחרוזת. מספר האינדקס שהחל ממנו str נמצאת לראשונה מוחזר על ידי המתודה. סדנה ב-"עיצוב תוכנה מבוסס עצמים" באר-שבע 2008
"שינוי במחרוזת" חשוב לזכור, כי אף אחת מהמתודות ששייכות למחלקה String, לא משנה את המחרוזת שמיוצגת על ידי האובייקט. כל אחת מהמתודות שייסקרו בחלק זה מחזירה הפניה לאובייקט חדש מטיפוס String אשר מהווה תוצאה של שינויים למחרוזת שמייצג האובייקט שממנו המתודה הופעלה. סדנה ב-"עיצוב תוכנה מבוסס עצמים" באר-שבע 2008
"שינוי במחרוזת" • public String replace (char oldChar, char newChar) • מתודה זו מחזירה הפנייה לאובייקט חדש מטיפוס String אשר מייצג מחרוזת תווים שמתקבלת מהמחרוזת, שמייצג האובייקט שממנו המתודה הופעלה, לאחר שכל תו שזהה לתו oldChar מוחלף בתו newChar. • public String toLowerCase() • מתודה זו מחזירה הפנייהלאובייקט חדש מטיפוס String אשר מתאר את מחרוזת תווים שמתקבלת מהמחרוזת שמייצג האובייקט כאשר מחליפים את כל אחת מהאותיות הגדולות לאות קטנה. • public String toUpperCase() • מתודה זו מחזירה הפנייה לאובייקט חדש מטיפוס String אשר מתאר את מחרוזת התווים שמתקבלת מהמחרוזת שמייצג האובייקט כאשר מחליפים את כל האותיות הקטנות לאותיות גדולות. • public String trim() • מתודה זו מחזירה הפנייה לאובייקט חדש מטיפוס String שמתאר מחרוזת תווים שמתקבלת מהמחרוזת שמייצג האובייקט לאחר שכל תווי הריווח שמופיעים בתחילת המחרוזת ובסופה נמחקים. סדנה ב-"עיצוב תוכנה מבוסס עצמים" באר-שבע 2008
"שינוי במחרוזת" String s = new String("We love Java"); System.out.println(s); s.toLowerCase(); System.out.println(s); s.toUpperCase(); System.out.println(s); s.replace(' ','*'); System.out.println(s); We love Java We love Java We love Java We love Java סדנה ב-"עיצוב תוכנה מבוסס עצמים" באר-שבע 2008
"שינוי במחרוזת" String s="We love Java"; System.out.println(s); String s1=s.toLowerCase(); System.out.println(s1); s=s.toUpperCase(); System.out.println(s); s=s.replace(' ','*'); System.out.println(s); We love Java we love java WE LOVE JAVA WE*LOVE*JAVA סדנה ב-"עיצוב תוכנה מבוסס עצמים" באר-שבע 2008
החלפת רצף תווים בתוך מחרוזת String s="We love Java"; System.out.println(s); We love Java s=s.replace("Java", in.nextLine()); System.out.println(s); We love C# C# s=s.replace(" ",""); System.out.println(s); מחיקה? WeloveC# Error: cannot find symbol symbol : method replace(char,java.lang.String) location: class java.lang.String s=s.replace('e',"ee"); System.out.println(s); סדנה ב-"עיצוב תוכנה מבוסס עצמים" באר-שבע 2008
שליפה תת-מחרוזת • public String substring(int begin) • מתודה זו מחזירה הפנייה לאובייקט חדש מטיפוס String שמייצג תת מחרוזת למחרוזת שמייצג האובייקט. תת המחרוזת שמוחזרת מורכבת מכל התווים שהחל מהתו שמספר האינדקס שלו begin ועד לסופה של המחרוזת שמייצג האובייקט. • public String substring(int begin, int end) • מתודה זו מחזירה הפנייה לאובייקט חדש מטיפוס String שמייצג תת מחרוזת למחרוזת שמייצג האובייקט. תת המחרוזת שמוחזרת מורכבת מכל התווים החל מהתו שמספר האינדקס שלו begin (כולל) ועד לתו שמספר האינדקס שלו end (לא כולל). סדנה ב-"עיצוב תוכנה מבוסס עצמים" באר-שבע 2008
מה קורה באמת? כאשר הקומפיילר נתקל בשורה כדוגמת: String s=“abc” + “def” + “ghi”; האופן שבו השורה מטופלת הוא כדלקמן: String s=(((new StringBuffer(“abc”)) . append(“def”)). append(“ghi”)). toString() סדנה ב-"עיצוב תוכנה מבוסס עצמים" באר-שבע 2008
די דיינו? ואם לא? • אבל מה קורה כאשר נרצה להגדיר פעולה משלנו שתפעל על מחרוזות? • למשל: פעולה הפועלת על מחרוזת ומחזירה את מספר המופעים של תו מסוים בתוך מחרוזת. • מאחר והטיפוס String הוא טיפוס בנוי בשפה, איננו יכולים להרחיב את אוסף הפעולות שלו. המשמעות היא: • עלינו להגדיר את הפעולה כפעולה סטטית (static). • הפעולה תקבל את המחרוזת כפרמטר. סדנה ב-"עיצוב תוכנה מבוסס עצמים" באר-שבע 2008