Menu
Coddy logo textTech

מתודות Getter ו-Setter

חלק מהיחידה תכנות מונחה עצמים במסלול ה-GO של Coddy. שיעור 49 מתוך 107.

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

ב-Go, המוסכמה לגבי פונקציות גישה (getters) פשוטה: משתמשים בשם השדה עם אות ראשונה גדולה. לא מוסיפים את הקידומת "Get", אלא פשוט משתמשים ב-Balance(), ולא ב-GetBalance():

type BankAccount struct {
    balance int  // לא מיוצא
}

// Getter - מחזיר את הערך
func (b *BankAccount) Balance() int {
    return b.balance
}

// Setter - משנה את הערך לאחר אימות
func (b *BankAccount) SetBalance(amount int) {
    if amount >= 0 {
        b.balance = amount
    }
}

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

func (b *BankAccount) Deposit(amount int) bool {
    if amount <= 0 {
        return false
    }
    b.balance += amount
    return true
}

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

challenge icon

אתגר

קל

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

תארגנו את הקוד שלכם בשני קבצים:

  • temperature.go: צרו struct בשם Temperature עם שדה celsius לא מיוצא (float64). ממשו את השיטות הבאות:
    • Celsius() - getter שמחזירה את הטמפרטורה הנוכחית בצלזיוס
    • SetCelsius(value float64) - setter שמקבלת רק ערכים השווים לאפס המוחלט או גבוהים ממנו (-273.15). אם הערך נמוך מסף זה, הטמפרטורה צריכה להישאר ללא שינוי.
    • Fahrenheit() - מחזירה את הטמפרטורה לאחר המרתה לפרנהייט באמצעות הנוסחה: (celsius * 9/5) + 32
    • SetFahrenheit(value float64) - ממירה את הקלט מפרנהייט לצלזיוס ושומרת אותו, אך רק אם ערך הצלזיוס שהתקבל שווה ל-273.15- או גבוה ממנו
    הוסיפו גם בנאי NewTemperature(celsius float64) *Temperature שיוצר טמפרטורה מאותחלת לערך הנתון (הניחו שהקלט לבנאי תקין).
  • main.go: קראו ערכי טמפרטורה מהקלט והדגימו את שיטות ה-getter וה-setter. צרו טמפרטורה, הציגו את ערכיה בשתי היחידות, ואז נסו להגדיר ערכים חדשים והציגו את התוצאות.

הקלטים הבאים יסופקו:

  • שורה 1: ערך התחלתי בצלזיוס
  • שורה 2: ערך צלזיוס חדש להגדרה
  • שורה 3: ערך פרנהייט חדש להגדרה

עצבו את כל פלטי הטמפרטורה עם שתי ספרות אחרי הנקודה העשרונית. הדפיסו את הרצף הבא:

  1. לאחר היצירה: C: [celsius] F: [fahrenheit]
  2. לאחר הגדרת צלזיוס: C: [celsius] F: [fahrenheit]
  3. לאחר הגדרת פרנהייט: C: [celsius] F: [fahrenheit]

לדוגמה, עבור 25, -300 ו-212, הפלט שלכם צריך להיות:

C: 25.00 F: 77.00
C: 25.00 F: 77.00
C: 100.00 F: 212.00

שימו לב שהערכים בשורה השנייה אינם משתנים, כי -300 נמוך מהאפס המוחלט, ולכן ה-setter דחתה אותו. השורה השלישית מציגה את הטמפרטורה לאחר הגדרה מוצלחת של 212°F (שמומר ל-100°C). זה הכוח של שיטות setter. הן אוכפות כללים ששומרים על תקינות הנתונים שלכם.

נסו בעצמכם

package main

import (
	"fmt"
)

func main() {
	// קרא את ערכי הקלט
	var initialCelsius float64
	var newCelsius float64
	var newFahrenheit float64
	fmt.Scanln(&initialCelsius)
	fmt.Scanln(&newCelsius)
	fmt.Scanln(&newFahrenheit)

	// TODO: צור אובייקט Temperature חדש באמצעות הבנאי

	// TODO: הדפס את הערכים ההתחלתיים בפורמט "C: [celsius] F: [fahrenheit]" עם 2 ספרות אחרי הנקודה העשרונית

	// TODO: נסה להגדיר ערך Celsius חדש והדפס את התוצאה

	// TODO: נסה להגדיר ערך Fahrenheit חדש והדפס את התוצאה
}
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה תכנות מונחה עצמים

תרגלו בעצמכם: קומפיילר Go אונליין