הי,
הקוד עבור Clerk מעולה. חלוקה טובה לפונקציות. הייתי שמח לראות תיעוד על כל פונקציה למשל:
def wait(self, client_name):
"""
Instruct the clerk to wait for a user
:param str client_name: the name of the waiting user
"""
self.clients.append(client_name)
בנוסף בפונקציה next
אני רואה שתפסת את ה Exception והחלטת להחזיר מחרוזת ---
אם אין ממתינים. לא בטוח שזאת הגישה הכי טובה שם, כי בקוד ה Clerk אנחנו עדיין לא יודעים מה מישהו אולי ירצה לעשות כשאין ממתינים. לכן הייתי מעדיף או להישאר עם זריקת ה Exception או להחזיר ערך מטיפוס אחר כמו None שיסמן למי שקרא לפונקציה שבאמת אין יותר ממתינים.
לגבי Queue, במקום השורה הזאת:
if clerc_name not in self.list.keys():
עדיף לכתוב:
if clerc_name not in self.list:
ובאופן כללי לא בטוח שהשם list
הוא השם הכי טוב למשתנה הזה. זה שם כללי מדי ובנוסף טיפוס הנתונים הוא בכלל Dictionary כך שזה אפילו מבלבל.
לגבי שתי השורות:
if clerc_name not in self.list:
self.list[clerc_name] = Clerc(clerc_name)
עדיף להחליף אותן ב defaultdict. דיברתי עליו בשיעור גם ואפשר גם לקרוא בתיעוד:
את הלולאה הזאת לא הבנתי:
while True:
next_client = [self.list[c].next() for c in self.list]
if next_client != '---':
print(next_client)
break
אם הכוונה היא למצוא את הפקיד הראשון שיש מישהו שמחכה לו אני חושב שזה לא עובד, כי הלולאה רצה על כל הפקידים ומפעילה את next
של כל אחד מהם.
לגבי הקוד הראשי (בסוף) הייתי ממליץ על שמות משתנים יותר משמעותיים כדי שיהיה קל יותר להבין את המבנה של המערך data. בנוסף יש שיעור הרחבה כאן על Structural Pattern Matching שזה פיצ׳ר שגם יכול לעזור לשפר את המבנה של הקוד הראשי והקריאות שלו אז שווה לנסות לשחק עם זה:
https://www.tocode.co.il/past_workshops/110