در جاهایی که ما در حال هندل کردن Business logic هستیم بهتر است که از نام های technical یا فنی استفاده نکنیم.
حتما توی پروژه هاتون برای نام گذاری از کلمات technical خیلی استفاده میکنید از جمله خودم که قبلا این کارو میکردم، مثلا OrderDTO یا SusbcriptionDTO یا create (که ربط پیدا میکنه به CRUD) و ...
اسم DTO که مخفف Data Transfer Object هست خیلی نام technicalی هستش و اصلا درک نمیکنم چرا باید همچین اسمی رو گذاشت؟ مگه ما یک محصول رو develop نمیکنیم؟ بزارید با مثال بیشتر توضیح بدهم به شما.
فرض کنید شما یک نیازمندی رو باید توی پروژه پیاده سازی بکنید و شما باید یک بخشی رو توسعه بدید که ادمین میتونه Subscription جدید در سیستم اضافه بکنه که این Subscription اطلاعاتی مثل عنوان، مدت زمان و قیمت هستش.
احتمالا یک سرویسی دارید به اسم SubscriptionService که یک متدی داره به اسم create که به عنوان ورودی SubscriptionDTO رو میگیره و این SubscriptionService رو داخل Controller خودتون صدا میزنید تا بره یک Susbcription جدید برای ما ایجاد بکنه
class SubscriptionController { public function __construct(private SubscriptionService $subscriptionService) { } public function create(Request $request) { $title = $request->get('title'); $duration = $request->get('duration'); $price = $request->get('price'); try{ $subscriptionDTO = new SubscirptionDTO($title, $duration, $price); $this->subscriptionService->create($subscriptionDTO); }catch(Exception $exception){ // catch } // succeed } }
یک نفر رو از تیم Product خودتون بیارید و بهش کد خودتون رو نشون بدید و ازش بخواهید که بگه به نظرش SubscriptionDTO چه معنی میده؟ احتمال زیاد میگه نمیدونم با اینکه خود اون فرد Productی از شما همچین نیازمندی رو خواسته. کد شما رو حتی کسی که فنی نیست هم باید متوجه بشه چون ما داریم یک محصول توسعه میدیم.
در نیازمندی که بالاتر تعریف کردم، اشاره کردم که ادمین میتونه یک Subscription جدید اضافه بکنه، یک Subscription جدید. پس اینجا میتونیم با همین کلمات توافق کنیم و ازشون در کدهامون هم استفاده بکنیم:
$newSubscription = new NewSubscription($title, $duration, $price);
خیلی بهتر شد، بعد از شما هم هر کسی بیاد این کلاس رو استفاده بکنه میدونه که برای ساخت یک Subscription جدید هستش. (توی مقاله ی بعدی راجب همین title - duration و price صحبت میکنم که این ها هم جای بهبود دارن)
$this->subscriptionService->create($subscriptionDTO);
فعل create هم بسیار کلمه technical هستش که خیلی مربوط میشه به عملیات CRUD، اینجا هم میتونیم بگردیم به صحبت هایی که با فرد Productی کردیم و این نام رو میتونیم با Add جایگزین کنیم:
class SubscriptionController { public function __construct(private SubscriptionService $subscriptionService) { } public function create(Request $request) { $title = $request->get('title'); $duration = $request->get('duration'); $price = $request->get('price'); try{ $newSubscription = new NewSubscription($title, $duration, $price); $this->subscriptionService->add($newSubscription); }catch(Exception $exception){ // catch } // succeed } }
تونستیم به خوانایی کدهامون کمک بکنیم، همین کارهای کوچیک باعث میشه ذهنتون در نام گذاری درگیر بشه و به کلماتی productی بیشتر فکر بکنه.