قانون Demeter (Law of Demeter) چیه و چرا اینقدر مهمه؟ 🤐
یکی از اصول قدیمی ولی فوقالعاده کاربردی در طراحی شیگرا، Law of Demeter یا همون "Talk only to your friends" ـه.
به زبان ساده: هر آبجکت فقط باید با "همسایههای نزدیکش" حرف بزنه، نه با نصف سیستم.
قاعدهٔ اصلی:
هر متد فقط باید با اینها تعامل داشته باشه:
• خودِ شی (this)
• پارامترهای ورودی متد
• فیلدهای خودش
• آبجکتهایی که خودش میسازه
هر چیزی غیر از این، بوی Coupling بالا و دردسر در ریفکتور میده 😄
یک مثال بد 👎 (Law of Demeter نقض شده)
توی کد واقعی (مثال Python):
اینجا
• اگر ساختار
• اگر
نسخهٔ بهتر ✅ (رعایت Law of Demeter)
مسیر طولانی رو "کپسوله" میکنیم:
حالا
چرا این قانون در عمل خیلی کمک میکنه؟ 💡
• کاهش Coupling: کلاسها کمتر از ساختار داخلی هم خبر دارن.
• انعطاف در ریفکتور: راحت میتونی مدل داده رو عوض کنی بدون اینکه نصف سرویسها رو دست بزنی.
• بهبود تستپذیری: با Mock کردن چند آبجکت محدود میتونی یونیتتست بنویسی، بدون زنجیرههای عجیب.
بوی بد معروف: "Train Wreck" 🚂
هر وقت این الگو رو دیدی:
تقریباً مطمئنی که Law of Demeter نقض شده. این همون Train Wreck ـه؛ قطار نقطهها.
چند نکتهٔ عملی برای کدنویسی روزمره
• اگر
• به جای expose کردن کل آبجکتهای داخلی، متدهای سطح بالاتر ارائه کن (مثل
• توی Serviceها از Facade-های کوچک استفاده کن تا از جزئیات Domain دور نگهشون داری.
منابع بیشتر 📚
• Martin Fowler — Law of Demeter
• Refactoring Guru — Message Chains
از همین امروز، هر جا "قطار نقطهها" دیدی، یک مکث کوتاه و یک ریفکتور کوچک میتونه معماری کدت رو حسابی تمیزتر کنه 🌱
🔖 #Programming #برنامه_نویسی #Law_of_Demeter #Clean_Code #Coupling #Design_Principles #OOP #Refactoring #Architecture
👤 Developix
💎 Channel: @DevelopixChannel
یکی از اصول قدیمی ولی فوقالعاده کاربردی در طراحی شیگرا، Law of Demeter یا همون "Talk only to your friends" ـه.
به زبان ساده: هر آبجکت فقط باید با "همسایههای نزدیکش" حرف بزنه، نه با نصف سیستم.
قاعدهٔ اصلی:
هر متد فقط باید با اینها تعامل داشته باشه:
• خودِ شی (this)
• پارامترهای ورودی متد
• فیلدهای خودش
• آبجکتهایی که خودش میسازه
هر چیزی غیر از این، بوی Coupling بالا و دردسر در ریفکتور میده 😄
یک مثال بد 👎 (Law of Demeter نقض شده)
order.customer.address.city
توی کد واقعی (مثال Python):
class OrderService:
def get_customer_city(self, order):
return order.customer.address.city
اینجا
OrderService داره نصف مدل دامنه رو میگرده:• اگر ساختار
Customer عوض بشه، اینجا هم میترکه.• اگر
Address حذف بشه یا تغییر کنه، باز این کلاس میشکنه.نسخهٔ بهتر ✅ (رعایت Law of Demeter)
مسیر طولانی رو "کپسوله" میکنیم:
class Customer:
def get_city(self):
return self.address.city
class Order:
def get_customer_city(self):
return self.customer.get_city()
class OrderService:
def get_customer_city(self, order):
return order.get_customer_city()
حالا
OrderService فقط با Order حرف میزنه. بقیهاش پشت متدها مخفیه. اگر فردا مدل آدرس عوض بشه، فقط داخل Customer و حداکثر Order رو آپدیت میکنی.چرا این قانون در عمل خیلی کمک میکنه؟ 💡
• کاهش Coupling: کلاسها کمتر از ساختار داخلی هم خبر دارن.
• انعطاف در ریفکتور: راحت میتونی مدل داده رو عوض کنی بدون اینکه نصف سرویسها رو دست بزنی.
• بهبود تستپذیری: با Mock کردن چند آبجکت محدود میتونی یونیتتست بنویسی، بدون زنجیرههای عجیب.
بوی بد معروف: "Train Wreck" 🚂
هر وقت این الگو رو دیدی:
a.b().c.d().e
تقریباً مطمئنی که Law of Demeter نقض شده. این همون Train Wreck ـه؛ قطار نقطهها.
چند نکتهٔ عملی برای کدنویسی روزمره
• اگر
. زیاد پشت سر هم میبینی، معمولاً یعنی لازمه چندتا متد کوچک "واسط" اضافه کنی.• به جای expose کردن کل آبجکتهای داخلی، متدهای سطح بالاتر ارائه کن (مثل
getCustomerCity()).• توی Serviceها از Facade-های کوچک استفاده کن تا از جزئیات Domain دور نگهشون داری.
منابع بیشتر 📚
• Martin Fowler — Law of Demeter
• Refactoring Guru — Message Chains
از همین امروز، هر جا "قطار نقطهها" دیدی، یک مکث کوتاه و یک ریفکتور کوچک میتونه معماری کدت رو حسابی تمیزتر کنه 🌱
🔖 #Programming #برنامه_نویسی #Law_of_Demeter #Clean_Code #Coupling #Design_Principles #OOP #Refactoring #Architecture
👤 Developix
💎 Channel: @DevelopixChannel
👍6
💠 نسخه جدید محیط توسعه VSCode منتشر شده است
🔸 ارتقا از نسخه 1.127.0 به 1.128.0
🔖 #vscode, #chat, #release
💎 @DevelopixChannel
🔸 ارتقا از نسخه 1.127.0 به 1.128.0
🔖 #vscode, #chat, #release
💎 @DevelopixChannel
👍1
💠 نسخه جدید محیط توسعه Zed منتشر شده است
🔸 ارتقا از نسخه 1.9.0 به 1.10.0
🔖 #zed, #chat, #release
💎 @DevelopixChannel
🔸 ارتقا از نسخه 1.9.0 به 1.10.0
🔖 #zed, #chat, #release
💎 @DevelopixChannel
👍2
💠 نسخه جدید محیط توسعه VSCode منتشر شده است
🔸 ارتقا از نسخه 1.128.1 به 1.129.0
🔖 #vscode, #chat, #release
💎 @DevelopixChannel
🔸 ارتقا از نسخه 1.128.1 به 1.129.0
🔖 #vscode, #chat, #release
💎 @DevelopixChannel
💠 نسخه جدید محیط توسعه ویژوال استودیو (Visual Studio) منتشر شده است
🔸 ارتقا از نسخه 18.7.4 به 18.8.0
🔖 #visual_studio, #chat, #csharp, #release
💎 @DevelopixChannel
🔸 ارتقا از نسخه 18.7.4 به 18.8.0
🔖 #visual_studio, #chat, #csharp, #release
💎 @DevelopixChannel
💠 نسخه جدید محیط توسعه Zed منتشر شده است
🔸 ارتقا از نسخه 1.10.3 به 1.11.3
🔖 #zed, #chat, #release
💎 @DevelopixChannel
🔸 ارتقا از نسخه 1.10.3 به 1.11.3
🔖 #zed, #chat, #release
💎 @DevelopixChannel
نامگذاری تمیز؛ اولین خط دفاع در Clean Code 🧹
یکی از عملیترین ایدههای کتاب Clean Code این است که «اسم خوب، نصف راه خوانایی کد است». خیلی از بدهیهای فنی فقط با نامگذاری درست اصلاً بهوجود نمیآیند.
👀 نشانههای نامگذاری بد
وقتی متغیر و تابع اینطوری هستند:
از روی اسمها تقریباً هیچ چیز قابلفهم نیست. برای فهمیدن کد، مجبور میشویم پیادهسازی داخلی را خطبهخط بخوانیم.
✅ چطور بهترش کنیم؟
۱️⃣ اسم باید «بگوید» چهکار میکند
نام تابع، ورودی و شرطها واضح شدهاند. نیاز کمتری به کامنت داریم، چون خود کد توضیحدهنده است.
۲️⃣ از اسمهای عمومی مثل data, info, tmp دوری کن
هرجا اسم مبهم میشود، خواننده باید در ذهنش حدس بزند؛ همین حدسها منبع اصلی سوتفاهم در کد هستند.
۳️⃣ اسم تابع را فعل، اسم متغیر را اسم بگذار
این الگوی ساده کمک میکند بدون نگاه به بدنه، از روی اسمها بفهمیم هر چیزی «چیز است» یا «کار».
۴️⃣ از abbreviation بیمعنی خودداری کن
خودمان امروز معنای cfg را میفهمیم، ۶ ماه بعد یا برای همکار جدید، این تبدیل میشود به رمز.
۵️⃣ اسمها را بر اساس domain انتخاب کن
استفاده از واژههای همان دامنه (Order, Invoice, Payment, Discount) کد را به زبان بیزینس نزدیک میکند و فهم سیستم را برای همهی تیم آسانتر میکند.
📚 برای مطالعه بیشتر:
Clean Code, Chapter 2: Meaningful Names
Refactoring Guru - Code Smells
در هر refactor کوچک، فقط با بهتر کردن اسمها میشود کیفیت طراحی را بالا برد؛ بدون تغییر رفتار کد. از همین commit بعدی، روی هر اسم چند ثانیه بیشتر فکر شود، بازدهش در بلندمدت شگفتانگیز است ✨
🔖 #Programming #برنامه_نویسی #clean_code #naming #meaningful_names #refactoring #readability #architecture
👤 Developix
💎 Channel: @DevelopixChannel
یکی از عملیترین ایدههای کتاب Clean Code این است که «اسم خوب، نصف راه خوانایی کد است». خیلی از بدهیهای فنی فقط با نامگذاری درست اصلاً بهوجود نمیآیند.
👀 نشانههای نامگذاری بد
وقتی متغیر و تابع اینطوری هستند:
def p(u):
if len(u) > 0:
for x in u:
if x[3] == 1:
send(x)
از روی اسمها تقریباً هیچ چیز قابلفهم نیست. برای فهمیدن کد، مجبور میشویم پیادهسازی داخلی را خطبهخط بخوانیم.
✅ چطور بهترش کنیم؟
۱️⃣ اسم باید «بگوید» چهکار میکند
def send_active_users(users):
if len(users) == 0:
return
for user in users:
if user.is_active():
send(user)
نام تابع، ورودی و شرطها واضح شدهاند. نیاز کمتری به کامنت داریم، چون خود کد توضیحدهنده است.
۲️⃣ از اسمهای عمومی مثل data, info, tmp دوری کن
# بد
result = process(data)
# بهتر
normalized_orders = normalize_orders(raw_orders)
هرجا اسم مبهم میشود، خواننده باید در ذهنش حدس بزند؛ همین حدسها منبع اصلی سوتفاهم در کد هستند.
۳️⃣ اسم تابع را فعل، اسم متغیر را اسم بگذار
# تابع با اسم اسمی (بدفهم)
user_status = user()
# واضحتر
status = get_user_status()
این الگوی ساده کمک میکند بدون نگاه به بدنه، از روی اسمها بفهمیم هر چیزی «چیز است» یا «کار».
۴️⃣ از abbreviation بیمعنی خودداری کن
# بد
cfg = read_cfg(pth)
# بهتر
config = read_config_file(path)
خودمان امروز معنای cfg را میفهمیم، ۶ ماه بعد یا برای همکار جدید، این تبدیل میشود به رمز.
۵️⃣ اسمها را بر اساس domain انتخاب کن
استفاده از واژههای همان دامنه (Order, Invoice, Payment, Discount) کد را به زبان بیزینس نزدیک میکند و فهم سیستم را برای همهی تیم آسانتر میکند.
📚 برای مطالعه بیشتر:
Clean Code, Chapter 2: Meaningful Names
Refactoring Guru - Code Smells
در هر refactor کوچک، فقط با بهتر کردن اسمها میشود کیفیت طراحی را بالا برد؛ بدون تغییر رفتار کد. از همین commit بعدی، روی هر اسم چند ثانیه بیشتر فکر شود، بازدهش در بلندمدت شگفتانگیز است ✨
🔖 #Programming #برنامه_نویسی #clean_code #naming #meaningful_names #refactoring #readability #architecture
👤 Developix
💎 Channel: @DevelopixChannel
❤4
Forwarded from Developix Support
با Migration Boost هاستایران، برای مهاجرت به سرور ابری دوباره هزینه ترافیک نده! 🚀
با خرید اولین سرور ابری غیرساعتی از **هاستایران**، بسته ترافیک هدیه مهاجرت بهصورت خودکار برای سرویس شما فعال میشود:
✅ حداقل ۱۰۰ گیگابایت ترافیک هدیه مهاجرت
✅ افزایش حجم هدیه متناسب با ظرفیت دیسک اولیه
✅ ترافیک آپلود رایگان
✅ بدون محدودیت زمانی
سرور ابری هاستایران را راهاندازی کنید و بکاپها، فایلها و پایگاه داده خود را بدون دغدغه هزینههای پنهان ترافیک منتقل کنید.
👇 مشاهده پلنهای سرور ابری هاستایران
hostiran.club/Migration
hostiran.club/Migration
با خرید اولین سرور ابری غیرساعتی از **هاستایران**، بسته ترافیک هدیه مهاجرت بهصورت خودکار برای سرویس شما فعال میشود:
✅ حداقل ۱۰۰ گیگابایت ترافیک هدیه مهاجرت
✅ افزایش حجم هدیه متناسب با ظرفیت دیسک اولیه
✅ ترافیک آپلود رایگان
✅ بدون محدودیت زمانی
سرور ابری هاستایران را راهاندازی کنید و بکاپها، فایلها و پایگاه داده خود را بدون دغدغه هزینههای پنهان ترافیک منتقل کنید.
👇 مشاهده پلنهای سرور ابری هاستایران
hostiran.club/Migration
hostiran.club/Migration
💠 نسخه جدید محیط توسعه VSCode منتشر شده است
🔸 ارتقا از نسخه 1.130.0 به 1.131.0
🔖 #vscode, #chat, #release
💎 @DevelopixChannel
🔸 ارتقا از نسخه 1.130.0 به 1.131.0
🔖 #vscode, #chat, #release
💎 @DevelopixChannel
👍1
💠 نسخه جدید محیط توسعه Zed منتشر شده است
🔸 ارتقا از نسخه 1.12.1 به 1.13.1
🔖 #zed, #chat, #release
💎 @DevelopixChannel
🔸 ارتقا از نسخه 1.12.1 به 1.13.1
🔖 #zed, #chat, #release
💎 @DevelopixChannel
👍1
در نمونهکد بالا، استفاده از آرگومان پیشفرض قابلتغییر (مثل
🔖 #Programming #برنامه_نویسی
👤 Developix
💎 Channel: @DevelopixChannel
list) در تعریف تابع باعث بروز رفتار غیرقابلپیشبینی و Memory Leak منطقی در سناریوهای پیچیده میشود، چون همهٔ فراخوانیها همان آبجکت پیشفرض را بهاشتراک میگذارند. بهجای آن میتوانید با مقدار پیشفرض None و ساخت لیست جدید داخل تابع، هر بار یک state مستقل بسازید و از باگهای سخترفع در کدهای چندماژوله و تستنویسی جلوگیری کنید.🔖 #Programming #برنامه_نویسی
👤 Developix
💎 Channel: @DevelopixChannel
💠 نسخه جدید محیط توسعه VSCode منتشر شده است
🔸 ارتقا از نسخه 1.131.0 به 1.132.0
🔖 #vscode, #chat, #release
💎 @DevelopixChannel
🔸 ارتقا از نسخه 1.131.0 به 1.132.0
🔖 #vscode, #chat, #release
💎 @DevelopixChannel
👍1
💠 نسخه جدید محیط توسعه Zed منتشر شده است
🔸 ارتقا از نسخه 1.13.2 به 1.14.2
🔖 #zed, #chat, #release
💎 @DevelopixChannel
🔸 ارتقا از نسخه 1.13.2 به 1.14.2
🔖 #zed, #chat, #release
💎 @DevelopixChannel
👍1
💠 نسخه جدید محیط توسعه VSCode منتشر شده است
🔸 ارتقا از نسخه 1.132.1 به 1.133.0
🔖 #vscode, #chat, #release
💎 @DevelopixChannel
🔸 ارتقا از نسخه 1.132.1 به 1.133.0
🔖 #vscode, #chat, #release
💎 @DevelopixChannel
👍1
💠 نسخه جدید محیط توسعه Zed منتشر شده است
🔸 ارتقا از نسخه 1.14.2 به 1.15.0
🔖 #zed, #chat, #release
💎 @DevelopixChannel
🔸 ارتقا از نسخه 1.14.2 به 1.15.0
🔖 #zed, #chat, #release
💎 @DevelopixChannel
❤2
💠 نسخه جدید محیط توسعه ویژوال استودیو (Visual Studio) منتشر شده است
🔸 ارتقا از نسخه 18.8.3 به 18.9.0
🔖 #visual_studio, #chat, #csharp, #release
💎 @DevelopixChannel
🔸 ارتقا از نسخه 18.8.3 به 18.9.0
🔖 #visual_studio, #chat, #csharp, #release
💎 @DevelopixChannel
👍3❤1
🧩 این کد پایتون چه باگ عجیبی داره؟
هر بار که تابع add_item رو صدا میزنی، یه نتیجه غیرمنتظره میگیری.
مشکل اصلی توی این پیادهسازی چیه و چطور درستش میکنی؟
🔖 #Programming #برنامه_نویسی
👤 Developix
💎 Channel: @DevelopixChannel
هر بار که تابع add_item رو صدا میزنی، یه نتیجه غیرمنتظره میگیری.
مشکل اصلی توی این پیادهسازی چیه و چطور درستش میکنی؟
🔖 #Programming #برنامه_نویسی
👤 Developix
💎 Channel: @DevelopixChannel
💠 نسخه جدید محیط توسعه VSCode منتشر شده است
🔸 ارتقا از نسخه 1.133.0 به 1.134.0
🔖 #vscode, #chat, #release
💎 @DevelopixChannel
🔸 ارتقا از نسخه 1.133.0 به 1.134.0
🔖 #vscode, #chat, #release
💎 @DevelopixChannel
💠 نسخه جدید محیط توسعه Zed منتشر شده است
🔸 ارتقا از نسخه 1.15.1 به 1.16.1
🔖 #zed, #chat, #release
💎 @DevelopixChannel
🔸 ارتقا از نسخه 1.15.1 به 1.16.1
🔖 #zed, #chat, #release
💎 @DevelopixChannel
🔥 پروژه: سرور LLM روی مک Apple Silicon
روی مک با Apple Silicon کار میکنی و میخواهی LLM محلی سریع داشته باشی؟ پروژه omlx دقیقا برای همین است 🤓
یک inference server سبک که مدلها را با continuous batching و کش روی SSD اجرا میکند و همهچیز از منوی بالای macOS مدیریت میشود؛ بدون ترمینال، بدون دنگوفنگ.
برای تست و دیباگ اپهای هوش مصنوعی روی مک گزینهٔ خیلی جمعوجوری است.
لینک گیتهاب را یکبار چک کن، شاید دقیقا همان چیزی باشد که دنبالش بودی.
⭐️ 1,102 stars this week
🔖 #Programming #برنامه_نویسی #هوش_مصنوعی #LLM #Apple_Silicon
💎 @DevelopixChannel
روی مک با Apple Silicon کار میکنی و میخواهی LLM محلی سریع داشته باشی؟ پروژه omlx دقیقا برای همین است 🤓
یک inference server سبک که مدلها را با continuous batching و کش روی SSD اجرا میکند و همهچیز از منوی بالای macOS مدیریت میشود؛ بدون ترمینال، بدون دنگوفنگ.
برای تست و دیباگ اپهای هوش مصنوعی روی مک گزینهٔ خیلی جمعوجوری است.
لینک گیتهاب را یکبار چک کن، شاید دقیقا همان چیزی باشد که دنبالش بودی.
⭐️ 1,102 stars this week
🔖 #Programming #برنامه_نویسی #هوش_مصنوعی #LLM #Apple_Silicon
💎 @DevelopixChannel
🔥3❤1