סיכום – מחשבון צורות
חלק מהיחידה תכנות מונחה עצמים במסלול ה-GO של Coddy. שיעור 33 מתוך 107.
אתגר
קלבואו נבנה מחשבון צורות שמאגד את כל המושגים הקשורים לממשקים מהפרק הזה. תיצרו מערכת שבה ניתן לעבד צורות גאומטריות שונות באופן אחיד באמצעות ממשק משותף, וכך להדגים את העוצמה של פולימורפיזם ב-Go.
תארגנו את הקוד בשלושה קבצים:
shape.go: הגדירו ממשקShapeעם שתי מתודות:Area() float64ו-Perimeter() float64. צרו גם פונקציה בשםDescribeShapeשמקבלת כלShapeומחזירה מחרוזת מעוצבת שמציגה גם את השטח וגם את ההיקף שלו.shapes.go: צרו שתי רשומות שמממשות את הממשקShape:Rectangleעם השדותWidthו-HeightCircleעם השדהRadius
Area()ו-Perimeter(), וגם מתודתString()(שמממשת אתfmt.Stringer) ומחזירה תיאור קריא של הצורה.main.go: קראו נתונים של צורות מהקלט, צרו את הצורות המתאימות והשתמשו בפונקציהDescribeShapeשלכם כדי להציג מידע על כל אחת מהן. הדפיסו גם כל צורה ישירות כדי להדגים את הממשקStringer.
הקלטים הבאים יסופקו:
- שורה 1: רוחב המלבן (מספר ממשי)
- שורה 2: גובה המלבן (מספר ממשי)
- שורה 3: רדיוס המעגל (מספר ממשי)
בחישובים, השתמשו ב-3.14159 בתור הערך של pi. היקף המעגל הוא 2 * pi * radius.
המתודות String() שלכם צריכות להחזיר:
- מלבן:
Rectangle(Width x Height) - מעגל:
Circle(Radius: R)
הפונקציה DescribeShape שלכם צריכה להחזיר:
Area: [area], Perimeter: [perimeter]עצבו את כל הערכים מסוג מספר ממשי עם שתי ספרות אחרי הנקודה העשרונית באמצעות %.2f.
לדוגמה, עבור 4, 3 ו-5, הפלט שלכם צריך להיות:
Rectangle(4.00 x 3.00)
Area: 12.00, Perimeter: 14.00
Circle(Radius: 5.00)
Area: 78.54, Perimeter: 31.42הדפיסו תחילה כל צורה (באמצעות המתודה String() שלה), ואז את התיאור שלה שמוחזר מ-DescribeShape. עבדו תחילה על המלבן, ואז על המעגל.
נסו בעצמכם
package main
import (
"fmt"
)
func main() {
// קרא את ערכי הקלט
var width, height, radius float64
fmt.Scanln(&width)
fmt.Scanln(&height)
fmt.Scanln(&radius)
// TODO: צור Rectangle עם הרוחב והגובה הנתונים
// TODO: צור Circle עם הרדיוס הנתון
// TODO: הדפס את המלבן (באמצעות המתודה String())
// TODO: הדפס את תיאור המלבן באמצעות DescribeShape()
// TODO: הדפס את העיגול (באמצעות המתודה String())
// TODO: הדפס את תיאור העיגול באמצעות DescribeShape()
}
כל השיעורים ביחידה תכנות מונחה עצמים
1יסודות OOP ב-Go
קבצים חיצונייםסביבת העבודה והמודולים של Goחבילות וייבואשמות מיוצאים לעומת שמות לא מיוצאיםמבוא ל-OOP ב-GoStructs כמחלקותהגדרת מתודות עבור Structsמקבלי Pointer לעומת Valueאתחול Structפונקציות Constructorחזרה – מחשבון פשוט4ממשקים
מבוא לממשקיםמימוש משתמעממשק כחוזהממשק ריק (any)אימות טיפוסמתג טיפוסיםהרכבת ממשקיםממשקי Stringer ו-Errorסיכום – מחשבון צורות7כימוס
שדות מיוצאים לעומת שדות לא מיוצאיםכימוס ברמת החבילהמתודות Getter ו-Setterהסתרת מידע ב-Goסיכום – רשומות תלמידים10Generics (Go 1.18 ומעלה)
מבוא ל־Genericsפרמטרים של טיפוסיםאילוצי טיפוסיםמבנים גנרייםפתרון עוקף למתודות גנריותסיכום – אוסף גנרי2העמקה בסוגים וב-Structs
סוגים בסיסיים ומורכביםהגדרות של סוגים מותאמים אישיתתגיות StructStructs אנונימייםStructs מקונניםערכי אפס וברירות מחדלסיכום – ספר אנשי קשר5קומפוזיציה במקום ירושה
למה ב-Go אין ירושהיסודות הטמעת Structקידום מתודותהטמעת כמה Structsהטמעה לעומת אגרגציההסתרת מתודות מוטמעותסיכום – היררכיית עובדים8טיפול בשגיאות ו-OOP
ממשק errorסוגי שגיאות מותאמים אישיתעטיפת שגיאות (fmt.Errorf)שגיאות Sentinelerrors.Is() ו-errors.As()Panic, Defer ו-Recoverסיכום – מנתח קבצים11ספרייה סטנדרטית ותכנות מונחה עצמים
io.Reader ו-io.Writersort.Interfaceהממשק fmt.Stringerencoding/json עם מבניםהממשק http.Handlerסיכום – מודלים של REST API3מצביעים וזיכרון
יסודות המצביעים ב-Goמצביעים למבניםהעברה לפי ערך לעומת לפי הפניההפונקציה new()איסוף אשפה ב-Goסיכום - בונה רשימה מקושרת6פולימורפיזם ב-Go
פולימורפיזם באמצעות ממשקיםטיפוס ברווז ב-Goכללי התאמה לממשקאוספים פולימורפייםהזרקת תלויותסיכום - מעבד תשלומים9מקביליות ו-OOP
יסודות GoroutinesChannels ותקשורתChannel עם חוצץ לעומת ללא חוצץפקודת Selectsync.Mutex ו-sync.RWMutexsync.WaitGroupתכנון Struct בטוח לשימוש במקבילסיכום - מאגר עובדים12מושגים מתקדמים בתכנות מונחה עצמים
דפוס האפשרויות הפונקציונליותדפוס Builder ב-Goשרשור מתודותכינויי טיפוסים לעומת הגדרותיסודות Reflectionסקירה כללית של יצירת קודתרגלו בעצמכם: קומפיילר Go אונליין