טיפ קריאות קוד: קודם מה שמעניין
נתון הקוד הזה:
for i in range(50):
insert("contacts", f"test{i}", f"test{i}@test.com", 12, [10, 15])
קל לראות את הבעיה הראשונה שלו - הפונקציה insert מסתיימת בשני ערכים שלא ברור מה הם מביעים, לכן תיקון ראשון יהיה העברת הפרמטרים האחרונים עם שמות:
for i in range(50):
insert("contacts", f"test{i}", f"test{i}@test.com", owner_account=12, label_ids=[10, 15])
כבר יותר טוב ועכשיו אנחנו כבר מצליחים לראות את הבעיות האמיתיות:
- שורה ארוכה מדי, יותר מדי פרמטרים ל insert.
- סדר שורות לא תואם לסדר חשיבות, המטרה של הקוד היא "להוסיף אנשי קשר". הלולאה היא מימוש.
בעזרת פונקציה אני יכול לתקן את שתי הבעיות בקלות:
insert_contacts(50, prefix="test", owner_account=12, label_ids=[10, 15])
אבל פה יש בעיה כי הפסדתי חלק מהגמישות. אולי אני רוצה להשתמש ב i איפשהו באמצע השם או כתובת המייל. דרך אחת להתקדם עם זה היא להעביר במקום prefix פונקציה לחישוב המייל או שם המשתמש כלומר:
insert_contacts(
50,
username_fn=lambda i: f"test{i}",
email_fn=lambda i: f"test{i}@test.com",
owner_account=12,
label_ids=[10, 15]
)
עכשיו הקוד ברור וגמיש וכל עוד מפעילים את הפונקציה רק פעם אחת עם אותם פרמטרים זה גם נראה טוב. אם צריך להפעיל את הפונקציה מספר פעמים עם פרמטרים דומים אפשר להשתמש ב Currying כדי לשמור את הפרמטרים הזהים.
insert_contacts = make_insert_contacts(
owner_account=12,
label_ids=[10, 15])
insert_contacts(n=50, username_fn=lambda i: f"test{i}")
insert_contacts(n=20, username_fn=lambda i: f"test_user_{i}")
במצב כזה נגדיר את ברירת המחדל ליצירת אימייל בתור פונקציה שלוקחת את שם המשתמש ומוסיפה לו @test.com וכך לא צריך להעביר מחדש את email_fn כל פעם.
נ.ב. הדבקתי את ההצעה האחרונה ל ChatGPT זה מה שהיה לו להוסיף:
כדאי לאפשר העברה או של username כמחרוזת (מה שתיארנו קודם בתור prefix) או של הפונקציה, כי אנשים שונים יעדיפו ממשקים שונים.
כדאי לשמור בתוך הפונקציה
make_insert_concatsאת ה-i האחרון שיצרנו כדי שהפעלה נוספת שלה תמשיך מאותו מקום.כדאי להחזיר את המזהים או הפריטים שהפונקציה יצרה כדי שאפשר יהיה להמשיך להשתמש בהם בבדיקה או בקוד.
מה דעתכם? איזה גרסה אתם מעדיפים? או האם יש לכם רעיונות נוספים יותר קריאים לכתוב קוד דומה?