אימות ב-Setters
חלק מהיחידה תכנות מונחה עצמים במסלול ה-C של Coddy. שיעור 20 מתוך 61.
בשיעור הקודם יצרנו פעולות הגדרה בסיסיות שפשוט משייכות ערכים. אבל כך אנחנו מפספסים יתרון מרכזי של כימוס: היכולת להגן על הנתונים שלך באמצעות הוספת לוגיקת אימות.
חשוב על Counter שאסור לו להפוך לשלילי לעולם. ללא כימוס, כל אחד יכול לכתוב c->value = -50 ולשבש את המצב. באמצעות פונקציית קביעה, אפשר לשלוט בערכים המותרים:
// counter.c
void counter_set_value(Counter *c, int new_value) {
if (new_value < 0) {
return; // דחה קלט לא תקין בלי להציג הודעה
}
c->value = new_value;
}כעת מתעלמים מערכים שליליים.
ייתכן שתבחרו גם להחזיר קוד מצב כדי לציין הצלחה או כישלון:
int counter_set_value(Counter *c, int new_value) {
if (new_value < 0) {
return 0; // כישלון
}
c->value = new_value;
return 1; // הצלחה
}התבנית הזו מאפשרת למי שקורא לפונקציה לדעת אם הפעולה הצליחה. התובנה המרכזית היא שפונקציות set לא עוסקות רק בהשמה: הן שומרות סף ואוכפות כללים לגבי המצבים האפשריים של האובייקט שלך. זהו כוחה האמיתי של הכמסה: האובייקט שלך שומר על שלמותו, בלי קשר למה שקוד חיצוני מנסה לעשות.
אתגר
קלבוא נבנה מודול Temperature שמגן על הנתונים שלו באמצעות אימות ב-setter. תיצור מעקב אחר הטמפרטורה שמקבל רק ערכים בטווח תקין: כך נראה כיצד setters משמשים כשומרי סף למצב האובייקט שלך.
תיצור שלושה קבצים:
temperature.h: הממשק הציבורי שלך, באמצעות תבנית המצביע האטום. הצהר על טיפוסTemperatureבאמצעות הצהרה מקדימה בלבד. הצהר על הפונקציות הבאות:create_temperature: מקבלת מספר שלם עבור המעלות ההתחלתיות ומחזירה מצביע ל-Temperaturefree_temperature: משחררת את הזיכרון שהוקצהtemp_get_degrees: getter שמחזירה את ערך הטמפרטורה הנוכחיtemp_set_degrees: setter שמחזירהint(1 להצלחה, 0 לכישלון)
TEMPERATURE_H.temperature.c: הגדר אתstruct Temperatureבפועל, עם איברint degreesמוסתר. ממש את כל הפונקציות. החלק החשוב הוא ה-setter שלך. היא צריכה לקבל רק ערכים בין -50 ל-150 (כולל). אם הערך מחוץ לטווח הזה, החזר 0 והשאר את הטמפרטורה ללא שינוי. אם הערך תקין, עדכן את הערך והחזר 1.main.c: הדגם את האימות באמצעות ניסיון להגדיר טמפרטורות תקינות ולא תקינות, והראה שערכים לא תקינים נדחים ואילו ערכים תקינים מתקבלים.
תקבל שלוש קלטים: הטמפרטורה ההתחלתית, טמפרטורה תקינה להגדרה (בתוך הטווח), וטמפרטורה לא תקינה לניסיון הגדרה (מחוץ לטווח).
בקובץ הראשי שלך, צור Temperature עם הערך ההתחלתי והדפס אותו. לאחר מכן נסה להגדיר את הטמפרטורה הלא תקינה; מכיוון שהיא אמורה להידחות, הדפס את התוצאה והראה שהערך נשאר ללא שינוי. לבסוף, הגדר את הטמפרטורה התקינה, הדפס את תוצאת ההצלחה והראה את הערך המעודכן. שחרר את הזיכרון ואשר שהניקוי הושלם.
הדפס את הפלט בתבנית הזאת:
Initial: {degrees}
Set {invalid}: {0 or 1}
After invalid: {degrees}
Set {valid}: {0 or 1}
After valid: {degrees}
Freedלדוגמה, עם הקלטים 25, 100 ו-200, הפלט יהיה:
Initial: 25
Set 200: 0
After invalid: 25
Set 100: 1
After valid: 100
Freedהדבר מדגים את העוצמה האמיתית של כימוס. ה-setter שלך אוכף את הכללים שקובעים מהי טמפרטורה תקינה, ומגן על שלמות האובייקט בלי קשר לערכים שקוד חיצוני מנסה להגדיר.
נסו בעצמכם
#include <stdio.h>
#include "temperature.h"
int main() {
// קראו את נתוני הקלט
int initial, valid_temp, invalid_temp;
scanf("%d", &initial);
scanf("%d", &valid_temp);
scanf("%d", &invalid_temp);
// TODO: צרו Temperature עם הערך ההתחלתי
// TODO: הדפיסו את הטמפרטורה ההתחלתית
// פורמט: "Initial: {degrees}"
// TODO: נסו להגדיר את הטמפרטורה הלא תקינה
// הדפיסו את התוצאה והראו שהערך נותר ללא שינוי
// פורמט: "Set {invalid}: {0 or 1}"
// פורמט: "After invalid: {degrees}"
// TODO: הגדירו את הטמפרטורה התקינה
// הדפיסו את תוצאת ההצלחה והראו את הערך המעודכן
// פורמט: "Set {valid}: {0 or 1}"
// פורמט: "After valid: {degrees}"
// TODO: שחררו את הזיכרון והדפיסו "Freed"
return 0;
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
4כימוס
המושג של מצביעים אטומיםהגדרת מבנים אטומיםפונקציות Get ו-Setאימות ב-Settersסיכום: הקופסה הסודית2אובייקטים ומתודות
מבנים כאובייקטיםמצביע 'Self'נכונות constמצביע לעומת ערךמתודות עזרחזרה: מנהל נקודות5פרויקט: חשבון בנק פשוט
הגדרת הפרויקטמימוש החשבוןתרגלו בעצמכם: קומפיילר C אונליין