מיוצא לעומת לא מיוצא
חלק מהיחידה לוגיקה וזרימת התוכנית במסלול ה-GO של Coddy. שיעור 52 מתוך 68.
ב-Go, החשיפה של מזהים (משתנים, פונקציות, טיפוסים וכו׳) נקבעת לפי מוסכמת שמות פשוטה. היא קובעת אם קוד מחבילות אחרות יכול לגשת למזהים שלך.
מזהים מיוצאים מתחילים באות גדולה ונגישים מחבילות אחרות. אפשר לחשוב עליהם כעל "ציבוריים" — כל מי שמייבא את החבילה שלך יכול להשתמש בהם.
// אלה מיוצאים (ציבוריים)
var Name string
func Calculate() int
type Person structמזהים שאינם מיוצאים מתחילים באות קטנה ונגישים רק בתוך אותה חבילה. הם "פרטיים" לחבילה שלך.
// אלה אינם מיוצאים (פרטיים)
var age int
func helper() string
type config structמוסכמת השמות הזאת היא הדרך של Go לשלוט בגישה בלי להזדקק למילות מפתח כמו public או private. כשמנסים להשתמש במזהה לא מיוצא מחבילה אחרת, Go יציג שגיאת קומפילציה, כי המזהה אינו גלוי מחוץ לחבילה שלו.
אתגר
קלתקן את בעיות הנראות בחבילת Go באמצעות תיקון מוסכמת השמות של מזהים מיוצאים ולא מיוצאים. תעבוד עם תרחיש מדומה של כמה חבילות, שבו חלק מהמזהים נקראו באופן שגוי וגורמים לשגיאות הידור כשניגשים אליהם מחבילות אחרות.
תקבל שתי קלטים:
- מחרוזת המכילה הגדרות של חבילות בפורמט
"package_name:identifier1:type1:visibility1,identifier2:type2:visibility2|package_name:identifier1:type1:visibility1"(למשל,"utils:helper:function:private,Calculate:function:public|main:name:variable:private,Version:variable:public") - מחרוזת המכילה ניסיונות גישה בפורמט
"accessing_package.identifier1,accessing_package.identifier2,accessing_package.identifier3"(למשל,"main.helper,main.Calculate,utils.Version")
המשימה שלך היא:
- נתח את הקלט הראשון על ידי פיצול לפי קווים אנכיים כדי לקבל הגדרות נפרדות של חבילות
- עבור כל הגדרת חבילה, פצל לפי נקודתיים כדי לקבל את שם החבילה ואת המזהים שלה
- עבור כל הגדרת מזהה, פצל לפי נקודתיים כדי לקבל את שם המזהה, הסוג והנראות המיועדת
- צור פונקציה בשם
fixIdentifierNameשמקבלת שם מזהה ונראות מיועדת, ומחזירה את השם המתוקן:- אם הנראות היא
"public", ודא שהמזהה מתחיל באות גדולה - אם הנראות היא
"private", ודא שהמזהה מתחיל באות קטנה
- אם הנראות היא
- הצג את כותרת ניתוח החבילות:
"=== PACKAGE VISIBILITY ANALYSIS ===" - עבור כל חבילה, הצג את פרטי החבילה:
"Package: [package_name]"- עבור כל מזהה בחבילה:
- אם צריך לתקן את שם המזהה:
"- [original_name] ([type]) -> [corrected_name] (visibility: [visibility])" - אם שם המזהה תקין:
"- [identifier_name] ([type]) (visibility: [visibility]) ✓"
- אם צריך לתקן את שם המזהה:
- נתח את הקלט השני על ידי פיצול לפי פסיקים כדי לקבל ניסיונות גישה נפרדים
- עבור כל ניסיון גישה, פצל לפי נקודות כדי לקבל את החבילה שמנסה לגשת ואת המזהה שאליו ניגשים
- הצג את כותרת אימות הגישה:
"=== ACCESS VALIDATION ===" - עבור כל ניסיון גישה, קבע אם הגישה תקפה:
- מצא את החבילה שמכילה את המזהה
- בדוק אם שם המזהה המתוקן מתחיל באות גדולה (מיוצא)
- אם המזהה מיוצא:
"[accessing_package] accessing [target_package].[corrected_identifier_name]: ✓ ALLOWED (exported)" - אם המזהה אינו מיוצא:
"[accessing_package] accessing [target_package].[corrected_identifier_name]: ✗ DENIED (unexported)" - אם המזהה לא קיים:
"[accessing_package] accessing [target_package].[identifier_name]: ✗ NOT FOUND"
- ספור והצג את סטטיסטיקת הסיכום:
"=== SUMMARY ===""Total packages analyzed: [number_of_packages]""Total identifiers processed: [total_number_of_identifiers]""Identifiers requiring fixes: [number_of_identifiers_that_needed_fixing]""Access attempts: [number_of_access_attempts]""Allowed accesses: [number_of_allowed_accesses]""Denied accesses: [number_of_denied_accesses]"
- הצג את ההמלצות הסופיות:
- אם היו מזהים שדרשו תיקון:
"Recommendation: Fix identifier naming to follow Go conventions" - אם כל המזהים היו תקינים:
"All identifiers follow proper Go naming conventions"
- אם היו מזהים שדרשו תיקון:
השתמש בחבילת strings כדי לפצל את מחרוזות הקלט, בחבילת fmt לצורך פלט מעוצב, ובפונקציות לעיבוד מחרוזות כדי לבדוק ולשנות שמות מזהים. האתגר הזה מדגים כיצד מוסכמת השמות של Go קובעת את הנראות בין חבילות ועוזר לך להבין את ההבדל בין מזהים מיוצאים למזהים שאינם מיוצאים.
נסו בעצמכם
package main
import (
"fmt"
"strings"
)
func main() {
// קרא את הקלט
var packageDefinitions string
var accessAttempts string
fmt.Scanln(&packageDefinitions)
fmt.Scanln(&accessAttempts)
// TODO: כתוב את הקוד שלך למטה
// צור את הפונקציה fixIdentifierName
// נתח את הגדרות החבילות
// הצג ניתוח של החבילות
// נתח את ניסיונות הגישה
// הצג אימות גישה
// חשב והצג סטטיסטיקות מסכמות
// הצג המלצות
}השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה לוגיקה וזרימת התוכנית
1בקרת זרימה מתקדמת
switch עם `fallthrough`יציאה מלולאות מקוננותהמשך לולאה מסוימתהצהרת `goto`סיכום – שליטה מתקדמת בלולאות4פרויקט: רשימת משימות פשוטה
הגדרת הפרויקטהוספת משימה2מבנים ושיטות
הגדרת שיטות במבניםמקבלי ערךמקבלי מצביעבחירת מקבליםשיטות לעומת פונקציותסיכום — התנהגות המבנים5מפות לעומק
מפות של Structsמצביעים כערכים במפהבדיקה אם מפות הן nilהשוואת מפותסיכום - מונה תדירות מילים8פרויקט: ניהול מלאי פשוט
סקירת הפרויקטבדיקת המלאי3ממשקים (הבסיס)
מהו ממשק?הגדרת ממשקמימוש ממשקשימוש בטיפוסי ממשקממשק ריקבדיקות טיפוסמתג טיפוסיםסיכום – צורות והתנהגויות6קבוצות בסגנון המקובל ב-Go
דפוס הקבוצה ב-Goיצירת קבוצההוספה לקבוצהבדיקת חברות בקבוצההסרה מקבוצהמעבר על איברי קבוצהסיכום – שמות משתמש ייחודיים9חבילות ותחום נראות
מהי חבילה?מיוצא לעומת לא מיוצאיצירת חבילה פשוטהכינוי לחבילההמזהה הריק `_`הפונקציה `init`סיכום – בניית כלי עזרתרגלו בעצמכם: קומפיילר Go אונליין