رفتن به محتوای اصلی
مصطفی عفتی

درباره این پلتفرم

دفتر کاری زنده برای تجربه‌های مهندسی

این پلتفرم مهندسی شخصی مصطفی عفتی است؛ جایی برای تبدیل تجربه عملی به نوشتار روشن، یادگیری ساختاریافته و محصولات دیجیتال کاربردی.

همکار دانشجویی

  • خانم زهرا احسانی

    دانشجوی سابق · مشارکت‌کننده در توسعه پلتفرم

    خانم زهرا احسانی در دوران تحصیل روی بخش‌هایی از این پلتفرم کار کرد و با مشارکت‌های دقیق و کاربردی به توسعه آن کمک کرد. خوشحالم که اینجا از کارش قدردانی می‌کنم.

اینجا چه پیدا می‌کنید

  • مقاله‌ها، کتاب‌ها، آموزش‌ها و اسنیپت‌های کاربردی.
  • دوره‌ها و مسیرهای یادگیری مبتنی بر تجربه‌های واقعی مهندسی.
  • مطالعات موردی، پروژه‌های متن‌باز، آزمایش‌ها و انتشار محصولات.

با طراحی آگاهانه

  • تجربه دو‌زبانه فارسی و انگلیسی با پشتیبانی بومی از RTL.
  • رابط‌های سازگار با تم و کیبورد، با یک زبان بصری متمرکز.
  • توسعه محتوا و محصول به‌عنوان یک سیستم یکپارچه و نسخه‌بندی‌شده.

این پلتفرم پیوسته در حال تکامل است. بعضی بخش‌ها محصولاتی کامل‌اند و برخی دیگر آزمایش‌های فعالی که هم‌زمان با پیشرفت کار بهتر می‌شوند.

Citizenship به‌عنوان Relationship

چرا Citizenship نباید یک فیلد تکی روی موجودیت Person باشد.
Mostafa Effati3 دقیقه مطالعهsoftware-architecture

چرا Citizenship را مستقیم روی Person نگذاشتم

یک تصمیم کوچک مدل‌سازی که جلوی اشتباه‌های معماری بزرگ در سیستم Identity را می‌گیرد.

موقع بازطراحی Identity Service الگوی تکراری دیدم: خیلی از سیستم‌ها فرض می‌کنند شخص دقیقاً یک Citizenship دارد.

Person
 └── citizenship_country_id

کوئری ساده. فهم آسان. فرض پنهان: یک ملیت برای همیشه.

واقعیت

  • Multiple citizenship در بسیاری از مناطق عادی است
  • Citizenship دوم می‌تواند بعداً در زندگی بیاید
  • ملیت اصلی می‌تواند عوض شود؛ بعضی‌ها renounce می‌شوند

این‌ها سناریوهای مشروع‌اند — نه edge caseهای عجیبی که تا ابد عقب بیندازید.

صفت در برابر رابطه

تبدیل رابطه به attribute یکی از رایج‌ترین میان‌برهای طراحی است — و یکی از گران‌ترین‌ها برای بازگرداندن.

مدلی که استفاده کردم

Person
     │
     ├── Citizenship #1
     ├── Citizenship #2
     └── Citizenship #3

در زبان دیتابیس:

Person
     │
     └── PersonCitizenship
              │
              └── Country

هر تابعیت می‌تواند داشته باشد:

فیلدچرا وجود دارد
Countryکدام دولت
Acquisition dateتاریخچه / audit
Statusفعال، سلب‌شده، در انتظار
Primary flagUX و حوزهٔ قضایی پیش‌فرض

چرا مهم است

۱. واقعیت را منعکس می‌کند

آدم می‌تواند یک تابعیت داشته باشد — یا چند تا. مدل باید هر دو را نشان دهد.

۲. از migration گران جلوگیری می‌کند

کشف دیرهنگام چندتابعیتی یعنی جراحی اسکیما زیر بار. مدل‌کردن رابطه از اول ارزان‌تر است.

۳. مرز روشن‌تر

تابعیت فقط یک ستون نیست. رابطه بین شخص و کشور است.

مثال: یک شخص، دو دولت

درس کوچک مدل‌سازی

گاهی یک attribute مفهوم غنی‌تری را مخفی کرده. تابعیت یکی از آن مفاهیم در سیستم من بود.

هدف طراحی

نه «هر edge case را روز اول پشتیبانی کن» — از فرض‌هایی که همه‌جا درست نیستند دوری کن. یک تابعیت یا چند تا: هر دو باید جا شوند.

تا اینجا قوس مدل‌سازی اول کتاب را دیدید: Person / User → Contacts → Citizenship. بعد: Dual Session — اول Device، بعد Account — و Refresh Token Familyهایی که theft را قابل‌کشف می‌کنند.


نسخهٔ canonical. همچنین در Medium.

اسناد مرتبط

منوی دستور

↑ ↓برای حرکت · Enter برای انتخاب · Esc برای بستن
ناوبری
اقدامات

Esc برای بستن · ⌘K برای باز/بسته کردن