برداشت ۱۱ — به زبان دامنه

تکه کد زیر را در نظر بگیرید:

if (courseIdByStudentId
    .get(s.getId())
    .contains(c.getId())) 
{ ... }

خیلی مهم نیست و خیلی تلاش نکنید. تا به حال چند بار همچنین کدی را خوانده تا بتوانید تغییری در آن دهید؟

بعد از کمی خواندن و جستجو در کد معلوم می‌شود که این تکه نگاشت دروس گذرانده‌شده توسط یک دانشجو می‌باشد. دوباره بعد از کمی تأمل مشخص می‌شود که گزاره if در این کد برای تشخیص این که آیا دانشجویی، درسی را گذرانده است یا نه، به کار رفته است.

یعنی به شکل ساده، در ابتدا، هدف این بوده است: آیا دانشجوی دال درس سین را گذرانده است؟

اما چرا این سؤال ساده به این شکل خیلی پیچیده در کد ظاهر شده است؟

اول این یک ویژگی رابط (API Feature) است که فراموش شده است:

interface Student {
  boolean takenCourse(Course c);
}

بسیاری از اوقات سرعت تولید قربانی طراحی درست می‌شود. مراقب باشیم چنین ویژگی‌های منطقی و لازم برای محصول/سرویس را از قلم نیندازیم.

دوم ساختمان‌های داده خیلی پیشرفته‌تر از سال‌های قبل در اختیار ماست. زمانی بوده است که داشتن کلاس/شی و یا ساختمان‌های داده با توجه به محدود‌یت‌های سخت‌افزاری و حافظه کار سختی بوده است. ما دیگر در آن دوران نیستم همان طور که آیندگان ما ممکن است در مورد ساختمان‌داده‌های زمان حاضر پیشرفت‌های دیگری داشته باشند. استفاده از Map در کاربرد بالا در واقع درست است اما در پس تعریف درست ویژگی باعث آسیب می‌شود.

به زبان دامنه (Domain Language) سیستمی که روی آن کار می‌کنیم آشنا شویم و آن را به درستی در واسط‌های سیستم استفاده کنیم. در مثال ما، زبان دامنه، زبان یک سیستم آموزشی شامل دانشجو و درس می‌باشد.