حسین طالقانی
حسین طالقانی
خواندن ۱ دقیقه·۵ سال پیش

آرایه را زمین بگذار!

یکی از دوست‌نداشتنی‌های PHP، استفاده از کروشه (bracket) برای دو منظور مختلفه.
ما با دو نوع داده انتزاعی آرایه و دیکشنری (آرایه ربطی، نگاشت) آشنا هستیم: آرایه، مجموعه‌ای از عناصره که هر عضو با یه شماره (اندیس، index) قابل دسترسیه و دیکشنری، مجموعه از جفت‌هاست که هر مقدار به یک کلید منحصر به فرد ربط داده شده. در دیگر زبان‌های اسکریپتی مثل Python، Ruby و JavaScript آرایه رو با کروشه [ ] و دیکشنری رو با آکولاد { } مشخص می‌کنن. اما خالق «Personal Home Page» تصمیم گرفته از یک نماد برای این دو نوع داده استفاده بکنه.?‍♂️

خب نماد آرایه و دیکشنری یکی باشه، چی میشه مگه؟

توی تعریف قرارداد (interface)، با اعلام array به عنوان ورودی یا خروجی نمیشه فهمید انتظار کدوم نوع داده رو داریم! و در شرایطی می‌تونن به سادگی به جای هم ارائه بشن. برای مثال این تکه کد رو ببینین:

$prices = []; foreach ($products as $p) { $prices[$p->name] = $p->price; } echo json_encode($prices); // may print [ ] or { "car": 1000 }

در شرایطی که هیچ محصولی وجود نداره، خروجی به صورت Array ارائه می‌شه و زمان‌های دیگه به صورت Object!

حالا چه کنیم؟!

اول: حتی سن یه عدد (صحیح) نیست! پس اولویت استفاده از Value Objectهاست. استفاده نکردن از Array مزایای دیگه‌ای هم داره؛ مثل: تغییرناپذیری (immutability)، ایمنی نوع (type safety) و لفافه‌بندی (encapsulation)

دوم:‌ در جایی که انتظار Object داریم، برای جلوگیری از تفسیر Associative Array به Indexed Array، از نوع مناسب استفاده کنیم یا به صورت صریح ریخته‌گری (Casting)‌ کنیم:

$always_object = (object) $prices; // OR $prices = new stdClass; foreach ($products as $p) { $prices->{$p->name} = $p->price; }


تمیز کد بنویسیم و غر نزنیم!

هر تکنولوژی، کمتر یا بیشتر، دشواری‌های خودش رو داره. اگر بلد باشيم چطور از این بزن‌گاه‌ها عبور کنیم، می‌تونیم كد خوب و با کیفیت بنویسیم و تقصیرها رو گردن زبان نیندازیم.

phpclean codevalue objectبرنامه نویسیassociative array
سالک .[ ل ِ ] (ع ص ، اِ) مسافر و راه رونده. / a3dho3yn.ir
شاید از این پست‌ها خوشتان بیاید