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

ژوئن 12, 2019

یکی از دوست‌نداشتنی‌های PHP، استفاده از کروشه (bracket) برای دو منظور مختلفه.


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

توی تعریف قرارداد (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;
}

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

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