تحلیل داده‌ها در مقابل علم داده و یادگیری ماشین

تحلیل داده‌ها و علم داده

تحلیل داده‌ها و علم داده تقریباً مشابه هستن چون هدف هر دو استخراج اطلاعات ارزشمند از داده‌ها و استفاده از اون‌ها برای تصمیم‌گیری بهتره.

  • تحلیل داده‌ها: معمولاً به استفاده از ابزارهایی مثل Microsoft Excel و دیگر نرم‌افزارها برای خلاصه‌سازی داده‌ها و پیدا کردن الگوها مربوط می‌شه.
  • علم داده: معمولاً با استفاده از برنامه‌نویسی برای کار با مجموعه‌های بزرگ داده مرتبطه. علم داده به خاطر تولید گیگابایت‌های داده از منابع آنلاین و فعالیت‌ها (موتورهای جستجو، شبکه‌های اجتماعی) محبوب شده.

تفاوت‌ها

اگرچه عنوان شغلی “دانشمند داده” خیلی جذاب‌تر از “تحلیلگر داده” به نظر میاد، اما وظایف شغلی این دو ممکنه مشابه و هم‌پوشانی داشته باشه. هر دو با کشف الگوها و تولید بینش از داده‌ها سر و کار دارن. همچنین کار اونها، شامل پرسیدن سوالات هوشمندانه درباره ماهیت داده‌ها می‌شه (مثلاً: آیا نقاط داده‌ای به صورت طبیعی به خوشه‌ها تقسیم می‌شن؟ آیا واقعاً بین سن و سرطان ارتباطی وجود داره؟).

یادگیری ماشین چیست؟

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

مثال:

فرض کنید می‌خواهیم بدونیم آیا یه نفر بدهی‌ش رو پرداخت می‌کنه یا نه. خوشبختانه، ما یه مجموعه داده بزرگ درباره افراد مختلف داریم که یا بدهی‌شون رو پرداخت کردن یا نکردن. همچنین داده‌های دیگه‌ای هم جمع‌آوری کردیم (ایجاد پروفایل مشتری) مثل سن، محدوده درآمد، محل سکونت و شغل. وقتی الگوریتم یادگیری ماشین مناسب رو اعمال می‌کنیم، کامپیوتر از داده‌ها یاد می‌گیره. بعداً می‌تونیم داده‌های جدید (اطلاعات یه متقاضی جدید) رو وارد کنیم و چیزی که کامپیوتر یاد گرفته روی داده‌های جدید اعمال می‌شه.

ممکنه بعداً یه برنامه ساده بسازیم که بلافاصله ارزیابی کنه آیا یه نفر بدهی‌ش رو پرداخت می‌کنه یا نه بر اساس اطلاعاتش (سن، محدوده درآمد، محل سکونت و شغل). این یه مثال از استفاده از داده‌ها برای پیش‌بینی رفتار احتمالی فرد هستش.

امکانات

یادگیری از داده‌ها امکانات زیادی رو باز می‌کنه به ویژه در زمینه پیش‌بینی‌ها و بهینه‌سازی‌ها. این موضوع به لطف دسترسی به مجموعه داده‌های بزرگ و قدرت پردازش بالای کامپیوترها به واقعیت تبدیل شده. الان می‌تونیم داده‌ها رو در حد گیگابایت در عرض یک روز با استفاده از کامپیوترها یا قابلیت‌های ابری پردازش کنیم.

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

آیا تخصص ریاضی برای تحلیل داده با پایتون ضروری است؟

تحلیل داده‌ها اغلب به معنای کار با اعداد و استخراج اطلاعات ارزشمند از اونهاست. اما آیا واقعاً باید توی اعداد و ریاضیات متخصص باشیم؟

موفقیت در تحلیل داده‌ها با استفاده از پایتون معمولاً نیاز به داشتن مهارت‌ها و دانش مناسبی در ریاضی، برنامه‌نویسی و حوزه کاری شما داره. این یعنی لازم نیست تو هیچ‌کدوم از این‌ها متخصص باشید (مگر اینکه قصد دارید مقاله‌ای در کنفرانس‌های علمی بین‌المللی ارائه بدید).

نذارید خیلی از “متخصص‌ها” شما رو گول بزنن چون خیلی از اون‌ها یا فیک هستن یا اصلاً تجربه‌ای ندارن. چیزی که باید بدونید اینه که قدم بعدی چیه تا بتونید پروژه‌هاتون رو با موفقیت به پایان برسونید. شما بعد از خوندن همه فصل‌های اینجا متخصص هیچ چیزی نخواهید شد. اما این مطالب برای این کافی هست که شما یه درک بهتر از پایتون و تحلیل داده‌ها پیدا کنید.

حالا برگردیم به تخصص ریاضی. احتمالاً شما از قبل با مفاهیمی مثل میانگین، انحراف معیار و دیگه اصطلاحات رایج در آمار آشنا هستید. در حین عمیق‌تر شدن در تحلیل داده‌ها ممکنه با مفاهیمی مثل حساب دیفرانسیل و انتگرال و جبر خطی برخورد کنید. اگه وقت و علاقه دارید، می‌تونید هر زمان که خواستید اون‌ها رو مطالعه کنید. این ممکنه به شما یه مزیت در پروژه تحلیل داده‌ای که روش کار می‌کنید بده یا نه.

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

آموزش سینتکس پایتون به زبان ساده

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

۱. متغیرها و انواع داده‌ها

در پایتون، شما نیازی به تعریف نوع متغیر ندارید. کافی است مقدار رو به متغیر اختصاص بدید:

x = 5       # عدد صحیح (integer)
y = 3.14    # عدد اعشاری (float)
name = "Ali" # رشته (string)
is_student = True # مقدار بولی (boolean)

۲. چاپ کردن (Print)

برای چاپ کردن مقادیر در پایتون از تابع print() استفاده می‌کنیم:

print(x)          # چاپ عدد صحیح
print(name)       # چاپ رشته
print("Hello, world!") # چاپ متن ثابت

۳. لیست‌ها (Lists)

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

numbers = [1, 2, 3, 4, 5]
print(numbers[0]) # دسترسی به اولین عنصر لیست
numbers.append(6) # افزودن یک عنصر به انتهای لیست
print(numbers)

۴. حلقه‌ها (Loops)

در پایتون، دو نوع حلقه اصلی وجود داره: for و while.

حلقه for برای تکرار بر روی مجموعه‌ای از آیتم‌ها استفاده می‌شه:

for number in numbers:
    print(number)

حلقه while تا زمانی که شرط برقرار باشه، اجرا می‌شه:

count = 0
while count < 5:
    print(count)
    count += 1

۵. شرط‌ها (Conditionals)

برای بررسی شرط‌ها در پایتون از if, elif و else استفاده می‌کنیم:

age = 18

if age < 18:
    print("You are a minor.")
elif age == 18:
    print("You are exactly 18 years old.")
else:
    print("You are an adult.")

۶. توابع (Functions)

برای تعریف توابع در پایتون از کلمه کلیدی def استفاده می‌کنیم:

def greet(name):
    print("Hello, " + name + "!")

greet("Ali")

۷. کتابخانه‌ها (Libraries)

پایتون دارای کتابخانه‌های زیادیه که می‌تونید از اون‌ها برای انجام کارهای مختلف استفاده کنید. مثلاً برای کار با اعداد و محاسبات علمی از numpy استفاده می‌کنیم:

این‌ها فقط چند مثال ساده بودن که بهتون کمک کنه با سینتکس پایتون آشنا بشید. با تمرین و استفاده بیشتر از پایتون، بهتر می‌تونید از امکانات و قدرت این زبان استفاده کنید.

چرا پایتون را برای علوم داده و یادگیری ماشین انتخاب کنیم؟

میگن پایتون یه زبان برنامه‌نویسی ساده و قابل فهمه. به همین خاطر خیلی از مهندس‌ها و دانشمندها پایتون رو برای کارهای علمی و عددی انتخاب می‌کنن. شاید ترجیح میدن زودتر برن سراغ کار اصلی (مثلاً پیدا کردن اثر یا همبستگی یه متغیر با خروجی) به جای اینکه صدها ساعت صرف یاد گرفتن یه زبان برنامه‌نویسی پیچیده بکنن.

این باعث میشه که دانشمندها، مهندس‌ها، پژوهشگرها و تحلیلگرها زودتر پروژه رو شروع کنن و تو کمترین زمان و با کمترین منابع به نتایج با ارزش برسن. البته این به این معنی نیست که پایتون کامل و ایده‌آله برای تحلیل داده و یادگیری ماشین. زبان‌های دیگه مثل R ممکنه ویژگی‌هایی داشته باشن که پایتون نداره. ولی با این حال، پایتون یه نقطه شروع خوبه و میتونه به شما کمک کنه تا تحلیل داده‌ها رو بهتر بفهمید و تو پروژه‌های آینده‌تون ازش استفاده کنید.

پایتون در مقابل R

شاید قبلاً تو سایت‌هایی مثل Stack Overflow، Reddit، Quora و بقیه انجمن‌ها در مورد این موضوع شنیده باشید. شاید هم به دنبال زبان‌های برنامه‌نویسی دیگه‌ای گشته باشید چون در نهایت، یاد گرفتن پایتون یا R (یا هر زبان دیگه‌ای) چندین هفته و ماه طول می‌کشه. این یه سرمایه‌گذاری بزرگ زمانیه و نمی‌خواید اشتباه کنید.

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

خیلیا میگن که R مخصوص آمارشناسان طراحی شده (خصوصاً تو زمینه قابلیت‌های بصری‌سازی داده‌های قوی و آسون). یاد گرفتنش هم نسبتاً آسونه، مخصوصاً اگه بخواید ازش عمدتاً برای تحلیل داده استفاده کنید. از طرف دیگه، پایتون یه جورایی انعطاف‌پذیره چون فراتر از تحلیل داده میره. خیلی از دانشمندهای داده و فعالان یادگیری ماشین ممکنه پایتون رو انتخاب کرده باشن چون کدی که نوشتن میتونه به یه برنامه وب زنده و پویا وصل بشه.

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

استفاده گسترده از پایتون در تحلیل داده‌ها

امروزه بسته‌ها و ابزارهای زیادی وجود دارن که استفاده از پایتون در تحلیل داده‌ها و یادگیری ماشین رو خیلی راحت‌تر می‌کنن. TensorFlow (از گوگل)، Theano، scikit-learn، numpy و pandas فقط چند نمونه از چیزهایی هستن که علم داده رو سریع‌تر و آسون‌تر می‌کنن.

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

یکی دیگه از دلایل استفاده گسترده از پایتون اینه که منابع بی‌شماری وجود دارن که بهت میگن چطور تقریباً هر کاری رو انجام بدی. اگه سوالی داری، احتمال زیادی هست که یکی دیگه قبلاً اون رو پرسیده و یکی دیگه هم براش حلش کرده (گوگل و Stack Overflow دوستات هستن). این موضوع پایتون رو حتی محبوب‌تر می‌کنه چون منابع آنلاین زیادی وجود داره.

وضوح

به خاطر سادگی یادگیری و استفاده از پایتون (تا حدی به خاطر وضوح سینتکسش)، حرفه‌ای‌ها می‌تونن روی جنبه‌های مهم‌تر پروژه‌ها و مشکلاتشون تمرکز کنن. مثلاً، می‌تونن به جای ساختن همه چیز از اول، سریعاً از numpy، scikit-learn و TensorFlow استفاده کنن تا به بینش‌های لازم برسن.

این یه سطح دیگه از وضوح رو فراهم می‌کنه چون حرفه‌ای‌ها می‌تونن بیشتر روی ماهیت مشکل و پیامدهاش تمرکز کنن. اون‌ها همچنین می‌تونن روش‌های کارآمدتری برای مقابله با مشکل پیدا کنن به جای اینکه توی حجم زیاد اطلاعات یه زبان برنامه‌نویسی غرق بشن.

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

قراردادهای لاراول برای نامگذاری

بخش مربوطه قاعده اسم گذاری ✔️ روش قابل قبول ❌ روش اشتباه
Controller اسامی مفرد ArticleController ArticlesController
Route اسامی جمع articles/1 article/1
Route name روش snake_case همراه با نقاط اتصال users.show_active users.show-active, show-active-users
Model اسامی مفرد User Users
hasOne or belongsTo relationship اسامی مفرد articleComment articleComments, article_comment
All other relationships اسامی جمع articleComments articleComment, article_comments
Table اسامی جمع article_comments article_comment, articleComments
Pivot table نام مدل ها با اسامی مفرد و ترتیب الفبایی article_user user_article, articles_users
Table column روش snake_case بدون اسم مدل meta_title MetaTitle; article_meta_title
Model property روش snake_case $model->created_at $model->createdAt
Foreign key اسامی مفرد model name with _id suffix article_id ArticleId, id_article, articles_id
Primary key id custom_id
Migration 2017_01_01_000000_create_articles_table 2017_01_01_000000_articles
Method روش camelCase getAll get_all
Method in resource controller table store saveArticle
Method in test class روش camelCase testGuestCannotSeeArticle test_guest_cannot_see_article
Variable روش camelCase $articlesWithAuthor $articles_with_author
Collection توصیفی و اسامی جمع $activeUsers = User::active()->get() $active, $data
Object توصیفی و اسامی مفرد $activeUser = User::active()->first() $users, $obj
Config and language files index snake_case articles_enabled ArticlesEnabled; articles-enabled
View kebab-case show-filtered.blade.php showFiltered.blade.php, show_filtered.blade.php
Config snake_case google_calendar.php googleCalendar.php, google-calendar.php
Contract (interface) صفت یا اسم AuthenticationInterface Authenticatable, IAuthentication
Trait صفت Notifiable NotificationTrait
Trait (PSR) adjective NotifiableTrait Notification
Enum singular UserType UserTypesUserTypeEnum
FormRequest singular UpdateUserRequest UpdateUserFormRequestUserFormRequestUserRequest
Seeder singular UserSeeder UsersSeeder

اصول برنامه نویسی بهینه: اصل DRY (خودت را تکرار نکن)

اصل DRY (Don’t Repeat Yourself) یکی از اصول مهم در برنامه‌نویسی است که بر جلوگیری از تکرار کد و منطق تأکید دارد. هدف این اصل، کاهش تکرار کد و افزایش قابلیت نگهداری و خوانایی آن است. با رعایت اصل DRY، تغییرات در یک بخش از کد به‌طور خودکار در تمام بخش‌هایی که از آن کد استفاده می‌کنند، اعمال می‌شود و این باعث کاهش خطاها و افزایش بهره‌وری می‌شود.

در چارچوب لاراول، می‌توان اصل DRY را به چندین روش مختلف پیاده‌سازی کرد:

1. استفاده از کلاس‌های سرویس (Service Classes)

همانطور که قبلاً اشاره شد، منطق برنامه را در کلاس‌های سرویس قرار دهید. این باعث می‌شود که منطق کسب و کار به صورت متمرکز در یک مکان قرار گیرد و بتوانید آن را به راحتی در کنترلرها و دیگر بخش‌های برنامه مورد استفاده قرار دهید.

namespace App\Services;

class UserService
{
    public function register(array $data)
    {
        // منطق ثبت نام کاربر
    }

    public function updateProfile(User $user, array $data)
    {
        // منطق به روزرسانی پروفایل کاربر
    }
}

2. استفاده از کلاس‌های درخواست (Form Request Classes)

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

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class RegisterRequest extends FormRequest
{
    public function rules()
    {
        return [
            'name' => 'required|string|max:255',
            'email' => 'required|string|email|max:255|unique:users',
            'password' => 'required|string|min:8|confirmed',
        ];
    }
}

روابط (Models and Relationships)

مدل‌ها و روابط بین آنها را به درستی تعریف کنید تا از تکرار کدهای مرتبط با دسترسی به داده‌ها جلوگیری کنید.

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    public function posts()
    {
        return $this->hasMany(Post::class);
    }
}

4. استفاده از Blade کامپوننت‌ها و بخش‌ها (Blade Components and Sections)

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

<!-- resources/views/components/alert.blade.php -->
<div class="alert alert-{{ $type }}">
    {{ $slot }}
</div>

<!-- استفاده در یک ویو -->
<x-alert type="error">
    خطایی رخ داده است!
</x-alert>


5. استفاده از توابع و کلاس‌های کمکی (Helper Functions and Classes)

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

// app/Helpers/helpers.php
if (! function_exists('formatDate')) {
    function formatDate($date)
    {
        return \Carbon\Carbon::parse($date)->format('Y-m-d');
    }
}


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

اصول برنامه نویسی بهینه:منطق برنامه باید در service class باشد

هر کنترلر باید یک وظیفه داشته باشد، بنابراین منطق برنامه را در service classes بنویسید. این یک رویکرد خوب برای طراحی برنامه‌های Laravel است. با قرار دادن منطق برنامه در کلاس‌های سرویس، شما مسئولیت‌های مربوط به منطق کسب و کار را از کنترلرها جدا می‌کنید و کدهای کنترلرها را ساده‌تر و قابل نگهداری‌تر می‌کنید.

در Laravel، کلاس‌های سرویس معمولاً در مسیر app/Services قرار می‌گیرند. این کلاس‌ها مسئولیت انجام عملیات مربوط به منطق کسب و کار را دارند. به عنوان مثال، شما می‌توانید یک کلاس سرویس برای مدیریت کاربران با نام UserService ایجاد کنید که شامل عملیات‌هایی مانند ثبت نام، ورود، به روزرسانی اطلاعات کاربری و … باشد.

با قرار دادن منطق برنامه در کلاس‌های سرویس، شما می‌توانید این کلاس‌ها را به راحتی تست کنید و قابلیت استفاده مجدد بالایی دارند. همچنین، کنترلرها فقط مسئولیت انجام عملیات مربوط به واسط کاربری و مسیریابی را دارند و تمام منطق کسب و کار به کلاس‌های سرویس منتقل می‌شود.

با این رویکرد، هر کنترلر فقط یک وظیفه دارد و منطق برنامه در کلاس‌های سرویس نگهداری می‌شود، که باعث ساده‌تر و قابل تست‌تر شدن کدها و افزایش انعطاف‌پذیری برنامه می‌شود.

روش نامناسب:

public function store(Request $request)
{
    if ($request->hasFile('image')) {
        $request->file('image')->move(public_path('images') . 'temp');
    }
    
    ...
}

روش بهتر:

public function store(Request $request)
{
    $this->articleService->handleUploadedImage($request->file('image'));

    ...
}

class ArticleService
{
    public function handleUploadedImage($image)
    {
        if (!is_null($image)) {
            $image->move(public_path('images') . 'temp');
        }
    }
}

 

اصول برنامه نویسی بهینه:اعتبارسنجی ها را در Request classes انجام دهید

اعتبارسنجی ها را در Request classes انجام دهید نه در controllers.

این یک رویکرد خوب برای پاک‌سازی کد و بهبود قابلیت نگهداری و تست است. با اعتبارسنجی را در کلاس‌های درخواست (Request classes) انجام دادن، مسئولیت‌های مربوط به اعتبارسنجی داده‌ها را از کنترلرها جدا می‌کنید و کدهای کنترلر را ساده‌تر و قابل مدیریت‌تر می‌کنید.

در لاراول، کلاس‌های درخواست معمولاً در مسیر app/Http/Requests قرار می‌گیرند. این کلاس‌ها مسئولیت اعتبارسنجی داده‌های درخواستی که توسط کاربران ارسال می‌شوند را دارند. به عنوان مثال، شما می‌توانید قوانین اعتبارسنجی مربوط به یک فرم ورود را در کلاسی به نام LoginRequest قرار دهید.

استفاده از کلاس‌های درخواست به شما این امکان را می‌دهد که قوانین اعتبارسنجی را یکبار تعریف کرده و در اکثر کنترلرها مورد استفاده قرار دهید. همچنین، این کلاس‌ها را می‌توانید به راحتی تست کنید و قابلیت استفاده مجدد بالایی دارند.

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

روش نادرست:

public function store(Request $request)
{
    $request->validate([
        'title' => 'required|unique:posts|max:255',
        'body' => 'required',
        'publish_at' => 'nullable|date',
    ]);

    ...
}

روش بهتر:

public function store(PostRequest $request)
{
    ...
}

class PostRequest extends Request
{
    public function rules()
    {
        return [
            'title' => 'required|unique:posts|max:255',
            'body' => 'required',
            'publish_at' => 'nullable|date',
        ];
    }
}

 

اصول برنامه نویسی بهینه: مدل های بزرگ،‌ کنترلرهای کوچک!

درسته، این یک رویکرد خوب برای طراحی سیستم‌های بزرگ و پیچیده است. با این رویکرد، مدل‌ها باید مسئولیت‌های مربوط به داده‌ها و منطق کسب و کار را بر عهده داشته باشند، در حالی که کنترلرها باید به عنوان واسط بین مدل‌ها و نماها عمل کنند و مسئولیت‌های مربوط به پردازش و توسط کاربر ارتباطی را بر عهده داشته باشند.

این رویکرد به شما کمک می‌کند تا کنترلرها را کوچک نگه دارید و آن‌ها را برای انجام وظایف مرتبط با واسط کاربری و مسیریابی بین مدل‌ها و نماها محدود کنید. این باعث می‌شود که کنترلرها ساده‌تر و قابل تست‌تر باشند.

همچنین، با نگه داشتن مدل‌ها بزرگ و تمرکز بر روی آن‌ها، می‌توانید منطق کسب و کار خود را به صورت منطقی و منظم سازماندهی کنید و از تکرار کدها جلوگیری کنید.

استفاده از الگوهای طراحی مانند Repository Pattern و Service Layer هم می‌تواند به شما کمک کند تا مدل‌ها را از کنترلرها جدا کرده و کد را سازماندهی و مدیریت بهتری دهید.

به طور کلی، رویکرد “مدل‌های بزرگ، کنترلرهای کوچک” بهبود قابلیت خوانایی، تست و توسعه سیستم‌های شما را تضمین می‌کند.

اگر از Query Builder یا raw SQL queries استفاده میکنید، تمام منطق پایگاه داده را در model ها یا Repository classes قرار بدهید.

روش اشتباه:

public function index()
{
    $clients = Client::verified()
        ->with(['orders' => function ($q) {
            $q->where('created_at', '>', Carbon::today()->subWeek());
        }])
        ->get();

    return view('index', ['clients' => $clients]);
}

روش بهتر:

public function index()
{
    return view('index', ['clients' => $this->client->getWithNewOrders()]);
}

class Client extends Model
{
    public function getWithNewOrders()
    {
        return $this->verified()
            ->with(['orders' => function ($q) {
                $q->where('created_at', '>', Carbon::today()->subWeek());
            }])
            ->get();
    }
}

 

اصول برنامه نویسی بهینه: اصل تک وظیفه ای بودن

اصل تک وظیفه‌ای بودن (Single Responsibility Principle یا SRP) از اصول اصلی برنامه‌نویسی شیءگراست که در فریم‌ورک لاراول نیز توصیه می‌شود. این اصل می‌گوید که هر کلاس یا قسمت از برنامه باید مسئولیت یک وظیفه خاص را داشته باشد و فقط در انجام آن وظیفه خاص تخصص داشته باشد.

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

برای رعایت اصل تک وظیفه‌ای بودن در لاراول، می‌توانید از مفاهیمی مانند مدل‌ها، کنترلرها، و توابع کمکی استفاده کنید. به عنوان مثال، می‌توانید توابع کمکی را در کلاس‌هایی جداگانه قرار دهید، مدل‌ها را برای کارهای مرتبط با دیتابیس و کنترلرها را برای مدیریت واسط کاربری و مسیریابی بین مدل‌ها و نماها استفاده کنید.

استفاده از الگوهای طراحی مانند Repository Pattern نیز می‌تواند به رعایت این اصل کمک کند، زیرا این الگو به شما کمک می‌کند تا کدهای مربوط به دسترسی به داده‌ها را جدا کنید و آن‌ها را در یک مکان متمرکز قرار دهید. این کمک می‌کند تا انعطاف‌پذیری بیشتری در مدیریت و توسعه برنامه داشته باشید.

با رعایت اصل تک وظیفه‌ای بودن در لاراول، کد شما بهبود می‌یابد و قابلیت خوانایی، تست و توسعه راحت‌تری را خواهد داشت.

روش اشتباه:

public function getFullNameAttribute(): string
{
    if (auth()->user() && auth()->user()->hasRole('client') && auth()->user()->isVerified()) {
        return 'Mr. ' . $this->first_name . ' ' . $this->middle_name . ' ' . $this->last_name;
    } else {
        return $this->first_name[0] . '. ' . $this->last_name;
    }
}

روش بهتر:

public function getFullNameAttribute(): string
{
    return $this->isVerifiedClient() ? $this->getFullNameLong() : $this->getFullNameShort();
}

public function isVerifiedClient(): bool
{
    return auth()->user() && auth()->user()->hasRole('client') && auth()->user()->isVerified();
}

public function getFullNameLong(): string
{
    return 'Mr. ' . $this->first_name . ' ' . $this->middle_name . ' ' . $this->last_name;
}

public function getFullNameShort(): string
{
    return $this->first_name[0] . '. ' . $this->last_name;
}