העדפת מוסכמות על פני הגדרות
בפיתוח תוכנה, העדפת מוסכמות על פני הגדרות (באנגלית: convention over configuration; ידוע גם כ-coding by convention - תכנות לפי מוסכמות) היא פרדיגמת עיצוב תוכנה השואפת להפחית את מספר ההחלטות שמפתחי תוכנה צריכים לקבל, וזאת במטרה להשיג פשטות, אבל מבלי בהכרח לאבד גמישות.
למעשה, משמעות הביטוי היא שהמפתח צריך לפרט רק את ההיבטים הלא שגרתיים של היישום. לדוגמה, אם יש במערכת מחלקה בשם "Sale" (מכירה), אז כברירת מחדל, הטבלה המתאימה לה בבסיס הנתונים תיקרא "sales" (מכירות). רק אם מישהו יחליט לחרוג ממוסכמה זו, ולדוגמה יקרא לטבלה "products_sold" (מוצרים שנמכרו), אז יהיה עליו לכתוב קוד שעוסק במתן השמות.
כאשר המוסכמה הממומשת תואמת את ההתנהגות הרצויה, היא יכולה לפעול כצפוי מבלי הצורך לכתוב קובצי תצורה. רק כאשר ההתנהגות הרצויה חורגת מהמוסכמה הממומשת, תידרשנה פעולות הגדרה מפורשות.
מוטיבציה
עריכהקיימות תשתיות תוכנה הדורשות קובצי תצורה רבים, שכל אחד מהם כולל הגדרות רבות. קבצים אלה כוללים מידע ייחודי לכל פרויקט, כדוגמת כתובות URL ומיפויים בין מחלקות לטבלאות של בסיסי נתונים. בדרך כלל מספר גדול של קובצי תצורה עם הרבה פרמטרים מעיד על כך שעיצוב היישום מורכב יתר על המידה.
לדוגמה, בגרסאות הראשונות של כלי ה-ORM הנפוץ לג'אווה, Hibernate, המיפוי בין מחלקות והשדות שלהן לבסיס נתונים בוצע באמצעות תיאור יחסים אלה בקובצי XML. את מרבית המידע הזה ניתן היה לחשוף על ידי מיפוי של מחלקות לטבלאות ושל שדות (משתני מחלקה) לעמודות בטבלה המתאימה - על סמך שמות המחלקות והמשתנים. גרסאות מאוחרות יותר של Hibernate הפסיקו את השימוש בקובצי XML, ובמקום זאת יישמו את המוסכמות הללו בדיוק. ניתן לציין סטיות ממוסכמות אלה באמצעות שימוש ב-Java annotations.
שימוש
עריכהתשתיות תוכנה מודרניות רבות משתמשות בגישת ה-convention over configuration, ביניהן מערכות כדוגמת: ASP.NET MVC ,Maven ,Grails ,JSF ,EJB ,Ruby on Rails ,Spring, ורבות אחרות.
עם זאת, הרעיון עצמו הוא ותיק יותר והוא קשור לרעיון ברירת המחדל. כמו כן, ניתן לזהות את הרעיון מאוחר יותר, בבסיסן של ספריות Java. לדוגמה, המפרט של JavaBeans מסתמך במידה רבה על רעיון ה-convention over configuration. זהו תרגום של ציטוט מתוך המפרט של JavaBeans, גרסה 1.01:
ככלל, איננו רוצים להמציא מחלקת java.beans.everything עצומה שאנשים צריכים לרשת ממנה. במקום זאת אנחנו רוצים שסביבות הרצה של JavaBeans יספקו התנהגות ברירת מחדל עבור אובייקטים 'נורמליים', אבל לאפשר לאובייקטים לדרוס (override) חלק מהתנהגות מסוימת על ידי ירושה מממשק java.beans.something ספציפי כלשהו.