סיכום — חלוקה בטוחה
חלק מהיחידה לוגיקה וזרימת התוכנית במסלול ה-GO של Coddy. שיעור 44 מתוך 68.
אתגר
קלבנו מחשבון מתמטי מקיף שמבצע חילוק בטוח באמצעות כמה סוגי שגיאות מותאמים אישית וטיפול נכון בשגיאות. האתגר הזה משלב סוגי שגיאות מותאמים אישית, עטיפת שגיאות ובדיקת שגיאות כדי ליצור מערכת חזקה שמטפלת בעדינות בכשלים שונים בפעולות מתמטיות.
תקבלו שתי קלטים:
- מחרוזת שמכילה פרטי פעולה בפורמט
"operation,num1,num2,precision"(לדוגמה,"divide,10,0,2") - מחרוזת שמכילה הגדרות של המחשבון בפורמט
"calculator_name,mode"(לדוגמה,"ScientificCalc,strict")
עליכם:
- ליצור שני סוגי שגיאות מותאמים אישית:
- מבנה
DivisionErrorעם השדותDividend(float64) ו-Divisor(float64) - מבנה
ValidationErrorעם השדותField(string) ו-Value(float64)
- מבנה
- לממש את המתודה
Error() stringעבורDivisionError, כך שתחזיר:"division error: cannot divide [dividend] by [divisor]" - לממש את המתודה
Error() stringעבורValidationError, כך שתחזיר:"validation error: invalid [field] value [value]" - לנתח את הקלט הראשון על ידי פיצול לפי פסיקים כדי לקבל את הפעולה, num1, num2 ו-precision
- לנתח את הקלט השני על ידי פיצול לפי פסיקים כדי לקבל את שם המחשבון ואת mode
- להמיר את המספרים שבמחרוזות ל-float64 ואת precision ל-int
- ליצור פונקציה
safeDivideשמקבלת שני פרמטרים מסוג float64 ומחזירה (float64, error):- אם המחלק הוא 0, להחזיר 0 ושגיאת
DivisionErrorעם ערכי המחולק והמחלק - אם המחולק שלילי והמצב הוא
"strict", להחזיר 0 ושגיאתValidationErrorעם השדה"dividend"וערך המחולק - אם המחלק שלילי והמצב הוא
"strict", להחזיר 0 ושגיאתValidationErrorעם השדה"divisor"וערך המחלק - אחרת, להחזיר את תוצאת החילוק ואת nil
- אם המחלק הוא 0, להחזיר 0 ושגיאת
- ליצור פונקציה
performCalculationשעוטפת את התוצאה שלsafeDivide:- אם
safeDivideמחזירה שגיאה, לעטוף אותה כך:"calculation failed in [calculator_name]: %w" - אם הפעולה הצליחה, להחזיר את התוצאה ואת nil
- אם
- לקרוא ל-
performCalculationולטפל בתוצאה:- אם אין שגיאה: להדפיס
"Calculation successful: [result_formatted_to_precision_decimal_places]" - אם קיימת שגיאה: להדפיס
"Calculation failed: [error_message]"
- אם אין שגיאה: להדפיס
- להשתמש ב-
errors.Asכדי לבדוק אם סוגי שגיאות מסוימים נמצאים בשגיאה העטופה:- להדפיס
"Checking for division error: [true/false]" - להדפיס
"Checking for validation error: [true/false]"
- להדפיס
- אם נמצאה שגיאת
DivisionError, להדפיס את הפרטים שלה:"Division Error Details:""Dividend: [dividend]""Divisor: [divisor]"
- אם נמצאה שגיאת
ValidationError, להדפיס את הפרטים שלה:"Validation Error Details:""Field: [field]""Value: [value]"
- להציג סיכום סופי:
"Calculator Summary:""Name: [calculator_name]""Mode: [mode]""Operation: [operation]""Input: [num1] [operation_symbol] [num2]"כאשר operation_symbol הוא "/" עבור חילוק"Precision: [precision] decimal places""Status: [Success/Failed]"
השתמשו בחבילה strings כדי לפצל את מחרוזות הקלט לפי פסיקים, בחבילה strconv כדי להמיר מחרוזות למספרים, בחבילה errors עבור errors.As, ובחבילה fmt לעטיפת שגיאות ולעיצוב פלט. האתגר הזה מדגים כיצד סוגי שגיאות מותאמים אישית, עטיפת שגיאות ובדיקת שגיאות נכונה פועלים יחד כדי ליצור מערכות אמינות לטיפול בשגיאות, שמספקות מידע מפורט על סוגים שונים של כשלים.
נסו בעצמכם
package main
import (
"errors"
"fmt"
"strconv"
"strings"
)
func main() {
// קראו את הקלט
var operationInput string
var settingsInput string
fmt.Scanln(&operationInput)
fmt.Scanln(&settingsInput)
// נתחו את קלט הפעולה (operation,num1,num2,precision)
operationParts := strings.Split(operationInput, ",")
operation := operationParts[0]
num1, _ := strconv.ParseFloat(operationParts[1], 64)
num2, _ := strconv.ParseFloat(operationParts[2], 64)
precision, _ := strconv.Atoi(operationParts[3])
// נתחו את קלט ההגדרות (calculator_name,mode)
settingsParts := strings.Split(settingsInput, ",")
calculatorName := settingsParts[0]
mode := settingsParts[1]
// TODO: כתבו את הקוד שלכם למטה
// 1. צרו מבנים מסוג DivisionError ו־ValidationError עם מתודות Error()
// 2. ממשו את הפונקציה safeDivide
// 3. ממשו את הפונקציה performCalculation
// 4. קראו לפונקציה performCalculation וטפלו בתוצאות
// 5. השתמשו ב־errors.As כדי לבדוק סוגי שגיאות מסוימים
// 6. הדפיסו את פרטי השגיאה אם נמצאה
// 7. הציגו סיכום סופי
}כל השיעורים ביחידה לוגיקה וזרימת התוכנית
1בקרת זרימה מתקדמת
switch עם `fallthrough`יציאה מלולאות מקוננותהמשך לולאה מסוימתהצהרת `goto`סיכום – שליטה מתקדמת בלולאות4פרויקט: רשימת משימות פשוטה
הגדרת הפרויקטהוספת משימה7טיפול בשגיאות לעומק
סוגי שגיאות מותאמים אישיתעטיפת שגיאות באמצעות `%w`חילוץ שגיאות באמצעות `errors.Is`חילוץ שגיאות באמצעות `errors.As`הבנת `panic`שימוש ב־`recover`סיכום — חלוקה בטוחה2מבנים ושיטות
הגדרת שיטות במבניםמקבלי ערךמקבלי מצביעבחירת מקבליםשיטות לעומת פונקציותסיכום — התנהגות המבנים5מפות לעומק
מפות של Structsמצביעים כערכים במפהבדיקה אם מפות הן nilהשוואת מפותסיכום - מונה תדירות מילים8פרויקט: ניהול מלאי פשוט
סקירת הפרויקטבדיקת המלאיתרגלו בעצמכם: קומפיילר Go אונליין