Menu
Coddy logo textTech

מיוצא לעומת לא מיוצא

חלק מהיחידה לוגיקה וזרימת התוכנית במסלול ה-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 יציג שגיאת קומפילציה, כי המזהה אינו גלוי מחוץ לחבילה שלו.

challenge icon

אתגר

קל

תקן את בעיות הנראות בחבילת 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")

המשימה שלך היא:

  1. נתח את הקלט הראשון על ידי פיצול לפי קווים אנכיים כדי לקבל הגדרות נפרדות של חבילות
  2. עבור כל הגדרת חבילה, פצל לפי נקודתיים כדי לקבל את שם החבילה ואת המזהים שלה
  3. עבור כל הגדרת מזהה, פצל לפי נקודתיים כדי לקבל את שם המזהה, הסוג והנראות המיועדת
  4. צור פונקציה בשם fixIdentifierName שמקבלת שם מזהה ונראות מיועדת, ומחזירה את השם המתוקן:
    • אם הנראות היא "public", ודא שהמזהה מתחיל באות גדולה
    • אם הנראות היא "private", ודא שהמזהה מתחיל באות קטנה
  5. הצג את כותרת ניתוח החבילות: "=== PACKAGE VISIBILITY ANALYSIS ==="
  6. עבור כל חבילה, הצג את פרטי החבילה:
    • "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
	
	// נתח את הגדרות החבילות
	
	// הצג ניתוח של החבילות
	
	// נתח את ניסיונות הגישה
	
	// הצג אימות גישה
	
	// חשב והצג סטטיסטיקות מסכמות
	
	// הצג המלצות
}
quiz iconבחנו את עצמכם

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

כל השיעורים ביחידה לוגיקה וזרימת התוכנית

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