بهزاد شعبانی

توسعه دهنده پی‌اچ‌پی و لاراول

کد نویسی و ری‌فکتورینگ در phpStorm 8

در اولین پست از سری پست‌های phpStorm در مورد شخصی سازی این IDE قدرتمند صحبت کردیم، اینکه چطور ظاهرش رو ساده‌تر کنیم، رنگ‌ها و فونت کد هایلاتر برنامه رو عوض کنیم و چطور کلیدهای میانبر رو شخصی سازی کنیم.

اما امروز قصد دارم در این پست در مورد کدنویسی و ری‌فکتورینگ در phpStorm صحبت کنم؛ چطوری می‌تونیم از phpStorm بهترین استفاده رو در جهت افزایش سرعت توسعه نرم‌افزار انجام بدیم، و با ابزارهایی که مارو تو این مسیر کمک می‌کنن آشنا بشیم.

پس اگر دوست دارید سریع‌تر کد بزنید این پست رو بخونید.

کدنویسی

Live Templates

اگه از ادیتور Sublime Text استفاده کرده باشین حتما با snippetها آشنا هستید. Snippetها تمپلیت‌های کد هستن که با تایپ چند کاراکتر و فشار دادن tab و یا enter کد مورد نظر برای شما نوشته میشه. لایو تمپلیت‌ها همون اسنیپت‌ها هستند.

همیشه قطعه کدهایی هستند که طی پروژه و حتی طی همه پروژه‌های شما تکرار می‌شن. با درست کردن لایو تمپلیت‌های خودتون می‌تونید سرعت کدنویسی‌تون رو افزایش بدین؛ اما چطوری یه لایو تمپلیت بسازید؟

ساخت Live Template

ساخت لایو تمپلیت‌ها در phpStorm بسیار ساده‌ست. برای ایجاد اولین لایو تمپلیت خودتون مراحل زیر رو دنبال کنید.

  1. وارد تنظیمات برنامه بشید
  2. به قسمت Editor > Live Template برید و گروه تمپلیت رو انتخاب کنید
  3. روی علامت + سمت راست پنجره کلیک کنید و Live Template رو انتخاب کنید
  4. تو قسمت abbreviation کاراکترهایی که با زدن اونا کد تمپلیت نوشته میشه رو بنویسید
  5. تمپلیت کد مورد نظرتون رو هم در قسمت Template Text وارد کنید
  6. روی لینک define پایین باکس Template Text کلیک کنید و جایی رو که می‌خواید لایو تمپلیت در اونجا کار کنه رو انتخاب کنید.

لایو تمپلیت

در صورتی که بخشی از این کد متغیر باشه می‌تونید از متغیرهای لایو تمپلیت استفاده کنید، این متغیرها بین دو $ قرار می‌گیرن و بعد از نوشته شدن تمپلیت می‌تونید با زدن دکمه tab می‌تونید اونها رو انتخاب کنید و متن جایگزینش رو بنویسید.

public function __construct($PARAMETERS$)
{
    $END$
}

اگر کد تمپلیت شما شامل کارکتر $ باشه، باید اون رو به اضافه کرد یک $ اون رو escape کنید.

foreach ($ITERABLE$ as $$$VAR_VALUE$) {
    $END$
}

لایو تمپلیت‌ها دارای دو متغیر از پیش تعریف شده هستن؛ $END$ و $SELECTION$

  • $END$ جایی رو مشخص می‌کنه که cursor بعد از مشخص شدن همه متغیر‌ها باید در اونجا قرار بگیره.
  • $SELECION$ یک متغیر عادیه و فرقی با متغیرهایی که خودمون تعریف میکنیم نداره

اگر در کد تمپلیت یک متغیر چند بار تکرار بشه با مقدار دهی به یکی از اونها بقیه متغیرهای هم‌نام همون مقدار رو می‌گیرن

for ($$$ITERATOR$ = 0; $$$ITERATOR$ < $LIMIT$; $$$ITERATOR$++) {
    $END$
}

Intention Action

فرض کنید دارید یه کلاس می‌نویسید و داخل یکی از متدهای این کلاس متدی رو صدازدید که هنوز اون رو ننوشتین. با استفاده از Intention Action می‌تونید اون متد رو به راحتی ایجاد کنید. این فقط یکی از قابلیت‌های Intention Action بود. با فشار دادن alt + Enter منوی Intention Actions نمایش داده میشه و می‌تونید کارهایی مثل، ایمپورت کردن نیم‌اسپیس کلاس، اضافه کردن Property به کلاس، اضافه کردن DocBlock به متدهای کلاس و حتی رفع اشتباه تایپی و املایی، رو انجام بدید. فقط کافیه cursor رو به جای مورد نظرتون انتقال بدید و کلید میانبر رو بزنید.

منوی Generate

وقتی در حال نوشتن یک کلاس هستین، منوی Generate یکی از پرکاربردترین ابزار برای شماست. برای نمایش این منو می‌تونید کلیدهای Ctrl + n و یا Ctrl + Enter رو بزنید. این منو شامل گزینه‌های زیره:

منوی جنریت

اگر کلیدهای میانبر برای شما کار نکرد، به تنظیمات برنامه برید، بعد به Appereance & Behavior > Keymap برید و در سرچ باکس سمت راست کلمه Generate رو وارد کنید. ممکنه هیچ کلید میانبری برای شما در این قسمت ثبت نشده باشه، پس کلید میانبر مورد نظر خودتون رو وارد کنید.

توجه داشته باشید که برای هر کدوم از آیتم های منوی Generate می تونید کلید میانبر تنظیم کنید و اون‌ها رو مستقیما با فشار دادن کلیدهای میانبر فراخوانی کنید.

Override Methods

همونطور که از اسمش مشخصه، برای Override کردن متدهای کلاس پدر استفاده می‌شه. وقتی این منو ظاهر میشه می‌تونید متد و یا متدهایی که قصد override کردن اونارو دارید انتخاب کنید.

Implement Methods

اگر کلاس پدر دارای متد abstract باشه، این منو به شما اونارو بهتون نشون میده و با انتخابشون می‌تونید پیاده سازیشون کنید.

همه کلاس‌ها به طور پیش فرض فرزند کلاس StdClass هستن واین دو منو همیشه، متدهای پیش فرض کلاس‌ها رو که __ شروع میشن رو براتون میاره.

Constructor

این منو برای کلاستون یک متد construct می‌سازه

Getters, Getters and Setters, & Setters

اگه کلاس شما دارای property باشه و قصد داشته باشین برای این propertyها متد Getter و Setter درست کنید، این سه منو به کمک شما میان و به راحتی این متدها رو برای شما میسازن.

توجه داشته باشین که منوهای بالا کدها رو جایی که cursor در اون قرار داده، اضافه می‌کنن.

PHPDoc Blocks

این منو برای داکیونت کردن کلاس و متدهاش استفاده میشه، با انتخاب این منو لیستی از متدها و کلاس‌های درون فایل جاری که هنوز داکیومنت نشدن نشون داده می‌شه، با انتخاب اونا، phpStorm به صورت خودکار متدهای انتخاب شده رو برای شما داکیومنت می‌کنه.

ساخت کلاس و فولدر

در phpStorm منویی برای ساخت کلاس، فولدر و فایل جدید وجود داره. برای نمایش این منو File > New رو انتخاب کنید.

برای راحتی کار بهتره یک کلید میانبر برای این منو تنظیم کنید.

ساختن یک فایل جدید

برای ساخت کلاس جدید با پنجره زیر روبه‌رو می‌شید. در این پنجره می‌تونید نوع کلاس رو انتخاب کنید، انتخاب‌های شما class، interface و trait هست.

ساخت کلاس جدید

نیم‌اسپیس اتوماتیک

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

  1. به تنظیمات برنامه برید
  2. به قسمت Project:YourProjectName > Directories برید
  3. فولدری که کدها در اون قرار میگیرن رو انتخاب کنید.
  4. روی گزینه source در بالای پنجره کلیک کنید تا فولدر انتخاب شده به رنگ آبی در بیاد
  5. سمت راست پنجره زیر Source Root روی آیکونی که شبیه به p هست کلیک کنید
  6. نیم‌اسپیس متناسب با فولدر انتخاب شده رو وارد کنید

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

ری‌فکتورینگ

Refactor This…

پرکاربردترین ابزار برای ریفکتور کردن در phpStorm منوی Refactor This هست. این منو شامل گزینه‌های زیادی هست که اونارو باهم مرور می‌کنیم. برای نمایش دادن این منو، کلید میانبر alt + shift + command + T در سیستم‌عامل مک و Ctrl + Alt + Shift + T در سایر سیستم‌عامل، رو بزنید.

از اونجایی که این منو خیلی پرکاربرده، بهتون توصیه می‌کنم که کلید میانبر رو برای این منو عوض کنید و به یک کلید میانبر ساده تر تبدیلش کنید. پیش‌نهاد من Ctrl + Alt + R هست.

منوی Refactor This

Rename

این منو فقط عوض کردن ساده نام نیست، بلکه بعد از عوض کردن نام کلاس یا متد، نام فایل (اگر PSR-0 یا PSR-4 رو در اسم گذاری دنبال کرده باشید) و هرجایی که اون کلاس یا متد با نام قبلی‌ش استفاده شده باشه رو به نام جدید تغییر میده.

این منو فقط وقتی cursor بر روی نام کلاس و یا نام متد قرار بگیره قابل استفاده‌ست.

Change Signature

با استفاده از این منو می‌تونید امضای یک متد رو به راحتی عوض کنید.

این منو فقط وقتی cursor بر روی نام متد قرار بگیره کار خواهد کرد.

Move & Copy

با استفاده از این دو منو می‌تونید یک متد رو به کلاس دیگه کپی و یا منتقل کنید، تنها نکته‌ای که وجود داره اینه که فقط متدهای static قابل انتقال به کلاس‌های دیگه هستند ولی برای کپی کردن محدودیتی وجود نداره.

Extract

Variable

با استفاده از این منو می‌تونید مقدار یک فانکشن و یا یه عبارت که چندبار استفاده شده رو به یک متغیر تبدیل کنید.

به عنوان مثال در کد زیر با select کردن یکی از $request->getPayloadObject()هاو انتخاب variable از منوی Refactor This،

<?php

function doSomething(Request $request)
{
    $request->getPayloadObject()->doSomething();
    $request->getPayloadObject()->doSomethingElse();
}

به این کد تبدیل میشه

<?php

function doSomething(Request $request)
{
    $payload = $request->getPayloadObject();
    $payload->doSomething();
    $payload->doSomethingElse();
}
Constant

این منو هم مثل منوی Variable هست با این تفاوت که مقدار Select شده باید ثابت باشه

Field

این منو همون منوی variable هست با این تفاوت که مقدار Select شده به یک property در کلاستون تبدیل می‌شه.

extract to field

شما می‌تونید visibility و جایی که این property مقدار دهی میشه رو هم مشخص کنید.

Method

خیلی از اوقات، وقتی دارید کدهاتون رو ری‌فکتور می‌کنین، به این نتیجه می‌رسید که بهتره قسمتی از کدهای یکی از متدهاتون رو به یه متد دیگه تبدیل کنید، تا از تکرار نوشته شدنش جلوگیری بشه، برای اینکار اون قسمت کد رو Select کنید و بعد از منوی Refactor This گزینه Method رو انتخاب کنید.

extract to method

اسم متد جدید رو انتخاب کنید و visibility اون رو مشخص کنید و روی دکمه refactor کلیک کنید.

Interface

فرض کنید کلاسی نوشتید و حالا می‌خواید براش یه اینترفیس بنویسید، این کار با گزینه Interface در منو Refactor This به سادگی صورت می‌گیره. برای این کار cursor رو روی اسم کلاس ببرید، بعد از منوی Refactor This گزینه Interface رو انتخاب کنید.

extract to interface

اسم اینترفیس، نیم‌اسپیسش، و مسیرش رو مشخص کنید. متدهایی که میخواید در اینترفیس قرار بگیره رو انتخاب کنید و روی دکمه refactor کلیک کنید.

Pull members up

در صورتیکه متدی به یک کلاس اضافه کردید که در اینترفیس اون کلاس وجود نداره می‌تونید از این گزینه استفاده کنید.

pull members up

در قسمت بالا می‌تونید انتخاب کنید متدهای انتخاب شده به کدوم Interface یا abstract class انتقال پیدا کنه و درقسمت پایین لیستی از متدها رو می‌بینید که می‌تونید انتخابشون کنید.

Push members down

فرض کنید یک abstract class به شکل زیر دارید:

<?php

abstract class ResourceRepository {

    public function create($data)
    {
        // do creating
    }

    // rest of class

}

و یک کلاس اون رو extend کرده.

<?php

class UserRepository extend ResourceRepository {

}

و در نهایت به این نتیجه می‌رسید که متد create باید در کلاس UserRepository قرار بگیره. برای این کار در کلاس ابسترکت ResourceRepository به منو Refactor This برید و گزینه Push Members Down رو انتخاب کنید.

push members down

متد یا متدهایی که می‌خواید در کلاس‌های فرزند قرار بگیرن رو انتخاب کنید و روی Refactor کلیک کنید.

inline

این گزینه برعکس اکسترکت کردن یک متغیر هست.

<?php

$var = some_function();

something($var);

با استفاده از این گزینه می‌تونید کدتون رو خلوت‌تر بکنید. cursor رو روی متغیر داخل فانکشن (در کد بالا) ببرید و از منوی Refactor This گزینه inline رو انتخاب کنید.

<?php

something(some_function());

با این روش کد شما خلاصه‌تر خواهد شد.

جمع بندی

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

comments powered by Disqus