<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های دانیال صناعی</title>
        <link>https://virgool.io/feed/@danial_sanaee</link>
        <description>برنامه نویس فول استک وب</description>
        <language>fa</language>
        <pubDate>2026-06-16 17:30:40</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/61679/avatar/zJime2.jpeg?height=120&amp;width=120</url>
            <title>دانیال صناعی</title>
            <link>https://virgool.io/@danial_sanaee</link>
        </image>

                    <item>
                <title>مفهوم MiddleWare در لاراول به زبان ساده</title>
                <link>https://virgool.io/@danial_sanaee/%D9%85%D9%81%D9%87%D9%88%D9%85-middleware-%D8%AF%D8%B1-%D9%84%D8%A7%D8%B1%D8%A7%D9%88%D9%84-%D8%A8%D9%87-%D8%B2%D8%A8%D8%A7%D9%86-%D8%B3%D8%A7%D8%AF%D9%87-yx3qvudrbhk3</link>
                <description>میدل ویر ها در لاراولمقدمه : سلام دوستان دانیال هستم ، توسعه دهنده وب . امروز میخواییم با هم مفهوم Middleware بررسی کنیم و ببنیم Middleware توی لاراول چی کار میکنه و چطوری میتونه باعث بشه برنامه ما ایمن تر و حرفه ای تر بشه پس با من همراه باش ! میدل ویر چیه ؟؟ فرض کن الان میخوایی بری دبی ، خب بعد از رسیدن به دبی و یا هر کشور دیگه ای ، برای اینکه وارد خاک اون کشور بشی باید چندین مرحله بگذرونی .  مرحله اول تست کرونا بدی ، مرحله دوم بارت چک میشه تا چیز غیر مجازی وارد نکنی ، مرحله سوم سابقت چک میشه ، مرحله چهارم پاسپورت و دلیل اومدنت به اون کشور چک میشه . بعد از این که همه این مراحل به ترتیب با موفقیت گذروندی ، میتونی وارد اون کشور بشی . خب وجود هر کدوم از این مراحل برای داشتن کشوری ایمن ضروری هست ، هیچ کشوری دوس نداره افراد شرور و یا ناقل بیماری راه بده توی کشورش  پس میاد و از این مراحل استفاده میکنه تا هر کسی وارد کشور میشه بررسی کنه و از وقوع مشکلات احتمالی جلوگیری کنه .میدل ویر ها هم همین کار میکنند ، درخواست هایی که به سمت برنامه ما میانو اعتبار سنجی میکنند ، توی مثال بالا شمایی که میخوایی بری یه کشور خارجی میشی یه « درخواست » و هر کدوم از اون مراحلی که باید رد کنی تا وارد کشور بشی یه دونه « Middleware »  هستند . در واقع MiddleWare ها یه لایه امنیتی هستند که نمیزارن هر درخواستی به هسته اصلی برنامه برسه ! Middleware لاراول یه تعدادی Middleware داره که به ما کمک میکنه درخواست هایی که به سمت برنامه میان به شیوه های مختلف پالایش کنیم ، و برنامه ای ایمن و کارا داشته باشیم . این Middleware ها توی قسمت app/http/middleware  قابل مشاهده هستند . همچنین این امکان در اختیار ما قرار داده که با توجه به برنامه ای که داریم میسازیم خودمون هم Middleware های اختصاصی بسازیم .  حالا چطوری یه Middleware درست کنیم ؟ فرض کنید داریم یه وبسایت امنیتی میسازیم ، که افرادی که خارج از ایران هستند توانایی دسترسی به این وبسایت نداشته باشن ینی این وبسایت فقط مخصوص ایرانی ها هستش ، خب همونطور که توضیح دادم این کار باید با استفاده از MiddleWare ها انجام بدیم ینی یه لایه محافظتی اضافه کنیم حالا چه طوری باید این کار انجام بدیم ؟  #ساخت MiddleWare مربوطه php artisan make:middleware is_iranوقتی که این دستور وارد میکنیم توی بخشapp/http/middleware یه کلاس جدید برامون درست میشه به اسم is_iran توی این کلاس یه متد وجود داره به اسم handle ، این متد میاد درخواستی که کاربر داده میگیره و بررسی های لازم روش انجام میده ، ( چک میکنه که کاربر از ایرانه یا نه ) و در آخر اگه همه چی اوکی بود میزاره کاربر از این مرحله رد بشه . class is_iran
{
    public function handle($request, Closure $next)
    {
        if ($request-&gt;getLocale()!=&#039;fa&#039;)
        {
            return response()-&gt;json(&#039;Site Is Not Open In Your Location&#039;);
        }
        return $next($request);
    }
}آقا این return next ینی چی ؟ یه درخواست برای دسترسی به برنامه ممکنه نیاز باشه از چندین middleware بگذره ، مثلا یکی اینکه عضو سایت باشه ، یکی اینکه ایرانی باشه و سایر موارد .  حالا این هر کدوم از این Middleware ها به شکل زنجیر وار به همدیگه وصل هستند .  وقتی درخواست از یه Middleware با موفقیت میگذره با return $next به میدل ویر بعدی میره و وقتی همه Middleware ها رد کرد در مرحله آخر به اون Controller که کارای پردازشی انجام میده میرسه . #ثبت کردن میدل ویر ها : برای اینکه بتونیم از middleware هایی که ساختیم توی برناممون استفاده کنیم اول باید ثبتشون کنیم و به لاراول بگیم آقاجون از این به بعد فلان میدل ویر هم جز میدل ویرهات حساب کن . خب حالا چطوری این کار انجام بدیم ؟ ثبت کردن یه Middleware توی لاراول به سه شکل امکان پذیره که از هر کدومش در موقعیت مناسب خودش استفاده میکنیم این سه روش در ادامه گفتم . #ثبت Middleware به شکل سراسری : فرض کن میخواییم کل سایت و برنامه ما فقط مخصوص ایرانی ها باشه ، خب در این صورت باید میدل ویر is_iran به شکل سراسری ثبت کنیم تا با هر درخواستی که به سمت برنامه میاد اجرا بشه . برای اینکار هم باید بیاییم توی فایل app/http/kernel  و آدرس میدل ویر is_iran به پراپرتی $middleware اضافه کنیم . protected $middleware = [
    \App\Http\Middleware\TrustProxies::class,
    \App\Http\Middleware\CheckForMaintenanceMode::class,
    \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
    \App\Http\Middleware\TrimStrings::class,
    \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
    is_iran::class,
];خب حالا دیگه هر درخواستی به سمت سایت ارسال بشه میدل ویر is_iran راه میفته و چک میکنه طرف از ایران وارد شده یه نه اگر طرف از ایران نبود نمیزاره وارد سایت بشه و با ارور پایین مواجه میشه . چون از ایران نیست  نمیزاره وارد بشه ثبت میدل ویر برای روت ها : اگر بخواییم یه middleware فقط برای یه سری روت خاص و نه همه روت های سایت اجرا بشه باید بیاییم آدرس اون middleware به پراپرتی routeMiddleware اضافه کنیم ، مثلا فرض کنید فقط قسمت هایی از سایتی که ما داریم برای خارجی ها بسته هست و بخش های زیادیش بازه . در این شرایط Middleware که برای بررسی موقعیت کاربر ساختیم ینی Is_Iran باید به پراپرتی routeMiddleware اضافه کنیم . protected $routeMiddleware = [
    &#039;auth&#039; =&gt; \App\Http\Middleware\Authenticate::class,
    &#039;Admin&#039; =&gt; \App\Http\Middleware\Admin::class,
    &#039;is_iran&#039; =&gt; \App\Http\Middleware\is_iran::class,
];حالا میتونیم توی هر روتی که بخواییم از is_iran استفاده کنیم و اون قسمت از سایت محدود کنیم : Route::resource(&#039;/panel&#039;, &#039;Admin\panelController&#039;)-&gt;middleware(&#039;is_iran&#039;);مثلا توی مثال بالا فقط افرادی میتونن به Panel دسترسی پیدا کنند که از میدل ویرis_iran عبور کرده باشند و ایرانی باشند ولی بقیه قسمت های سایت برای همه بازه و ربطی نداره که طرف ایرانی باشه یا نه . البته اینم بگم که ()middleware&lt;- میتونه تا بینهایت میدل ویر هم بگیره ینی ما برای یه روت هر چندتا Middleware که بخواییم میتونیم تعریف کنیم Route::resource(&#x27;/panel&#x27;, &#x27;Admin\panelController&#x27;)-&gt;middleware(&#x27;is_iran&#x27; ,&#x27;is_admin&#x27; ,&#x27;auth&#x27;);حالا بعضی دوستان هم هستند حال و حوصله ندارن اون میدل ویری که ساختنو توی routeMiddleware تعریف کنند و میان و مستقیم ازش استفاده میکنند : Route::resource(&#x27;/panel&#x27;, &#x27;Admin\panelController&#x27;)-&gt;middleware(\App\Http\Middleware\is_iran::class);البته این روش توصیه نمیشه ولی خوب به هر حال اینکارم میتونید بکنید . #میدل ویر های گروهی : همونطور که وقتی وارد یه کشور میشی از چندین مرحله یا Middleware باید عبور کنی ، برای اعتبار سنجی و پالایش یه درخواست هم ممکنه نیاز باشه چندین میدل ویر مورد استفاده قرار بدیم ، مثلا ۵ تا یا ۱۰ تا . خب برای اینکه دیگه نیاییم اسم همه این میدل ویر ها دونه دونه بنویسیم میاییم میزاریمشون توی یه گروه و یه اسمی میزاریم براش . حالا دیگه هر جا خواستیم از این دسته میدل ویر ها استفاده کنیم میاییم اسم گروه مینویسیم . مثلا فرض کنید برای این که وارد یه کشور بشید باید از 3 نظر اعتبار سنجی بشید : چک کردن ویزا (Visa)چک کردن بار (Bar)چک کردن سابقه (Background)پس الان اگه درخواستی مبنی بر ورود به کشور اومد به شکل زیر باید بنویسیمش : Route::resource(&#x27;/goToCountry&#x27;, &#x27;Admin\countryController&#x27;)-&gt;middleware(&#x27;visa&#x27;,&#x27;bar&#x27;,&#x27;background&#x27;);وقتی این درخواست ها زیاد بشه و ما مجبور باشیم از این سه تا میدل ویر توی روت های زیادی استفاده کنیم این که بیاییم هر بار به شکل بالا کد زنی کنیم صحیح نیست و بهتره که بیاییم این سه تا میدل ویر توی یه گروه بزاریم مثلا is_user_valid : protected $middlewareGroups = [        &#x27;web&#x27; =&gt; [         ],        &#x27;api&#x27; =&gt; [         ],        &#x27;is_user_valid &#x27; =&gt; [            \Illuminate\Session\Middleware\visa::class,            \Illuminate\Session\Middleware\bar::class,            \Illuminate\View\Middleware\background::class,        ],    ]; و روت هامون اینطوری بنویسیم : Route::resource(&#x27;/goToCountry&#x27;, &#x27;Admin\countryController&#x27;)-&gt;middleware(&#x27;is_user_valid&#x27;);# تافته جدا بافته در middleware ها فرض کن یه گروهی از روت ها داری که یه middleware به همشون نسبت میدی مثلا auth ، حالا ممکنه که یکی از این روت ها به middleware به auth نیاز نداشته باشند ، مثلا الان فرض کن روت profile نیازمند میدل ویر auth نباشه برای اینکه روت profile از گروه خودش جدا نکنیم میاییم از متد withoutMiddleware استفاده میکنیم . Route::middleware(&#x27;auth&#x27;)-&gt;group(function () {    Route::get(&#x27;/&#x27;, function () {        //    });    Route::get(&#x27;/profile&#x27;, function () {        //    })-&gt;withoutMiddleware(&#x27;auth&#x27;);});#مرتب سازی Middleware ها بعضی وقتا که البته خیلی کم پیش میاد ممکنه نیاز بشه Middleware هامون بر اساس ترتیب خاصی اجرا بشن برای این که بتونیم ترتیب middleware هامون تغییر بدیم باید بیاییم توی middlewarePriority و ترتیب دلخواهمون بچینیم مثلا من اینجا اومدم گفتم is_iran زودتر از Authorize اجرا بشه : protected $middlewarePriority = [    \Illuminate\Cookie\Middleware\EncryptCookies::class,    \Illuminate\Session\Middleware\StartSession::class,    \Illuminate\View\Middleware\ShareErrorsFromSession::class,    \Illuminate\Contracts\Auth\Middleware\AuthenticatesRequests::class,    \Illuminate\Routing\Middleware\ThrottleRequests::class,    \Illuminate\Session\Middleware\AuthenticateSession::class,    \Illuminate\Routing\Middleware\SubstituteBindings::class,  is_iran::class    \Illuminate\Auth\Middleware\Authorize::class,];#پارامتر ها در Middleware ها : جالب اینجاست که Middleware ها پارامتر هم میتونند دریافت کنند ، مثلا فرض کنید یه بخشی از سایتمون فقط برای بعضی از کاربران ثبت نام شده باز هست مثلا فقط ادمین ها ، ینی حتی اگر طرف ثبت نام کرده باشه ولی admin نباشه نمیتونه به اون روت دسترسی داشته باشه . خب طبیعتا مرحله اول اینه که بیاییم یه Middleware بسازیم که این منطق برامون پیاده سازی کنه ینی بیاد با استفاده از Parameter نقشی که میتونه به این روت دستری پیدا کنه بگیره مثلا admin ، بعدش ببینه ایا اون کاربره این نقش داره یا نه ! &lt;?phpclass EnsureUserHasRole{    public function handle($request, Closure $next, $role)    {        if (! $request-&gt;user()-&gt;hasRole($role)) {            // Redirect...        }        return $next($request);    }}خب حالا چطوری باید نقش به عنوان پارامتر به Middleware بدیم ؟ Route::put(&#x27;/post/{id}&#x27;, function ($id) {    //})-&gt;middleware(&#x27;role:admin&#x27;);خب دوستان مباحث مربوطه به Middleware ها من تمام و کمال گفتم اگه احساس میکنید جایی اشتباهی کردم یا خوب توضیح ندادم زیر همین پست برام کامنت کنید ، با تشکر از شما که همراه من بودید . </description>
                <category>دانیال صناعی</category>
                <author>دانیال صناعی</author>
                <pubDate>Tue, 31 Aug 2021 22:54:45 +0430</pubDate>
            </item>
                    <item>
                <title>اصول SOLID در برنامه نویسی</title>
                <link>https://virgool.io/@danial_sanaee/%D8%A7%D8%B5%D9%88%D9%84-solid-%D8%AF%D8%B1-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-qhq9wmw7wq1a</link>
                <description>با سلام خدمت دوستان عزیز خودم همونطور که میدونید دانیال هستم و امروز میخوام  قوانین SOLID به شکلی قابل درک با مثال های متعدد بهتون یاد بدم ، یادگیری و به کار گیری این قوانین به شدت روی کیفیت  کد هایی که میزنید تاثیر داره اینو من با تمام وجود درک کردم هر چی برنامه بزرگ تر میشه میفهمید چقدر مهمه که این اصول توی کد زنی هاتون اجرا کنید . اگه از اصول SOLID استفاده کنیم کد های با کارایی بالا و مقیاس پذیری بیشتری خواهیم داشت که میتونیم اونا در جاها و پروژه های مختلف استفاده کنیم علاوه بر این موارد خیلی راحت میتونیم کدهامون تست کنیم و توسعه سریع تری هم خواهیم داشت . #نحوه شکل گیری قوانین پنج گانه SOLID از زمانی که برنامه نویسی شی گرا جایگزین برنامه نویسی فانکشنال شد برنامه نویسان زیادی به سمت شی گرایی رفتند و چون شی گرایی تازه اول راه بود هر کسی یه جوری کد میزد و چهارچوب و قوانینی خاصی نبود ، حالا این عدم وجود چهارچوب و قوانین روشن و واضح باعث شد خیلی از این برنامه نویس ها توی توسعه برنامه هاشون ، خوانایی کدهاشون ، ساختار کد نویسشون دچار مشکلاتی بشن . با بیشتر شدن این مشکلات برنامه نویس ها به فکر یه سری قوانین افتادن که با رعایت کردنشون مشکلاتی از این دست نداشته باشند و اینطوری شد که اصول SOLID و همچنین دیزاین پترن ها بع دنیای برنامه نویسی شی گرا معرفی شدند . #اگه از قوانین SOLID پیروی نکنیم چه اتفاقی برامون میفته ؟ از اونجایی که هر چی برنامه بزرگتر میشه کلاس های بیشتری هم به وجود میان و این کلاس ها خودشون با کلاس های دیگه هم ارتباط دارند برنامه ما خیلی پیچیده میشه و انجام تغییرات توش به سختی امکان پذیره برناممون مثل یه کلاف بزرگ میشه که نه میشه تستش کرد نه میشه کدهاش به شکل خوانایی بررسی کرد ینی هم قابلیت تست پذیری بسیار کمی داره برنامه و هم خوانایی خیلی کمی دره .روند توسعه برنامه ما با سرعت بسیار پایین تری پیگیری میشه اونم به این دلیله که کدهای بیشتری باید بزنیم تغییر دادن برنامه مشکل است و آن هم به این دلیل که با ایجاد تغییر در یک قسمت از برنامه، قسمت های دیگر برنامه از کار می افتند و دچار مشکل می شوندقابلیت استفاده مجدد از اجزای برنامه وجود ندارد. در واقع، قسمت های مجدد برنامه ی شی گرای شما آنچنان به هم وابستگی تو در تو دارند که به هیچ وجه نمی توانید یک قسمت را جدا کرده و در برنامه ی دیگری استفاده کنید#اصل Single Responsibility در قوانین SOILDببین دوست من فرض کن رفتی یه فروشگاه مبلمان و میخوای برای خونتون مبل بخری ، وقتی وارد میشی یه آقایی میاد شما راهنمایی میکنه که بتونید مبل مورد نظرتون انتخاب کنید ، حالا فرض کنید از یه مبلی خوشتون اومد و خواستید بخریدش در این حالت شما میرید صندوق و هزینه پرداخت میکنید دیگه اون آقایی فروشنده که بهتون کمک کرد مبلتون انتخاب کنید نمیاد از شما پول بگیره ، شما رو به صندوق راهنمایی میکنه . خب حالا مبل خریدید و میخوایید بیاریدش خونه ، دیگه اون آقای صندوق دار و فروشنده که مبل براتون نمیارند خونه وظیفه این کار با باربری هستش . پس همونطور که دید توی هر کاری هر کسی یه وظیفه ای داره اینطوری کارا خیلی با کیفیت تر پیش میره ، خطایابی راحت تره و اگه قرار باشه تغییری ایجاد بشه فقط توی قسمتی که مشکل داره تغییر ایجاد میشه نه همه قسمت ها . اصل اول قوانین سالید (Single Responsibility) میگه هر کلاسی فقط باید یه کار انجام بده و فقط باید به یه دلیل تغییر کنه بیایید مثال بالا با هم به شکل برنامه نویسی در بیاریم : class BuyingFernicher
{
    public function selection()
    {
        //اتتخاب مبل دلخواه به کمک آقای فروشنده
  }

    public function buying ()
    {
        // پرداخت هزینه به صندوق دار
 }

    public function shipping()
    {
        // ارسال کالا به آدرس
 }
}خب به نظر شما الان اصل اول قوانین Solid اینجا اجرا شده ؟ آیا اینجا کلاس BuyingFernicher فقط داره یه کار انجام میده ؟ خب مسلما جواب منفی . الان کلاس BuyingFernicher داره سه کار انجام میده ینی شما مثلا اگه بخوایین تغییری در شیوه ارسال به وجود بیارید باید باز بیایید توی این کلاس یا اگه بخوایین تغییری توی نحوه محاسبه قیمت به وجود بیارید باید بیاید توی این کلاس باز و این اشکال اصل اول SOLID را که میگه هر کلاسی فقط یه کار باید انجام بده و فقط به یه دلیل باید تغییر پیدا کنه رد میکنه . حالتی که اصل Single Responsibility رعایت کرده باشیم : class selection{}
class buying{}
class shipping{}خب الان هر بخشی از کار به یه کلاس جدا تبدیل شده و اگه ما بخواییم نحوه باربری را تغییر بدیم یا ویژگی و امکانی بهش اضافه کنیم میریم توی کلاس shipping اگه بخواییم یه شیوه پرداخت جدید اضافه کنیم و مثلا پرداخت با بیت کوین هم داشته باشیم میریم توی کلاس Buying  . پس طبق قانون اول اصل SOLID یه کلاس فقط باید یه کار انجام بده و به یه دلیل هم تغییر کنه مثل مثال بالا که الان کلاس Shipping فقط داره کار ارسال انجام میده یا کلاس selection فقط داره کار کمک به انتخاب کاربر انجام میده . چرا باید از این اصل استفاده کنیم همیشه ؟ خیلی از مواقع برنامه ها به شکل گروهی ساخته میشن ینی ممکنه مثلا چندین برنامه نویس backEnd داشته باشیم که روی یه کد کار میکنند ، حالا هر کدوم از این برنامه نویسا ممکنه یه کلاس تغییر بدن ، اگه هر کلاسی فقط به یه دلیل تغییر کنه ما میدونیم این کلاس به چه دلیلی تغییر پیدا کرده و هدف از این تغییر چی بوده ، ولی اگه یه کلاس چندین کار مختلف انجام بده ما نمیدونیم اون تغییره برا چی بوده و اصلا چی بوده ، اینطوری هماهنگی بین اعضا به شدت کاهش پیدا میکنه . اگه اشکالی توی برنامه به وجود اومد میدونیم این اشکال دقیقا مربوط به چه کلاسی و برا چی به وجود اومده چون هر کلاسی یه کاری انجام میده یه نکته دوستانه اگه بخوام بتون بگم اینه که کلا این اصل خیلی جدی بگیرید و حتی توی نوشتن توابعتون هم این اصل رعایت کنید ینی هر تابع فقط یه کار انجام بده . #اصل Open/Close در قوانین SOLIDاین اصل میگه کد هاتون باید جوری بنویسید که برای توسعه باز باشند و برای تغییر بسته باشند حالا این مفهوم ینی چی اصلا ؟ اصلا باز و بسته بودن ینی چی اینجا ؟ ببین منظور اصلی این حرف اینه که اگه من یه روزی بخوام یه ویژگی جدیدی به کلاسم اضافه کنم بتونم خیلی راحت و بدون دستکاری سورس کد اصلی این کار انجام بدم . خب از اونجایی که این اصل باید با مثال جا بیفته به مثال پایین توجه کنید : فرض کنید یه شرکتی به شما پیام میده که من میخوام یه وبسرویس برام بنویسی که هر پیامی خواستم بتونم SMS کنم خب تیکه کد شما مثل پایین میشه احتمالا : class Message
{
    public $phone;
    public $content;
    public function __construct($phone,$content)
    {
        $this-&gt;phone = $phone;
        $this-&gt;content= $content;
    }

}
class SendMessage
{
    public function Send($Messages = [] )
    {
        return &#039;Message : &#039;. $Messaeg;
    }
}
$Message1 = new Message(&#039;Hello World!&#039;,&#039;09169987453&#039;);
$Message2 = new Message(&#039;Hello World Is Good !&#039;,&#039;09148987453&#039;);
$SendMessage = new SendMessage();
$SendMessage-&gt;Send([$Message1,$Message2]);حالا بعد از یه ماه شرکته دوباره زنگ میزنه میگه آقا من میخوام بتونم از طریق ایمیل هم پیام بفرستم و شما باید وب سرویس ایمیل هم به من تحویل بدی خب الان باید کدت جوری ویرایش کنی که بتونه هم ایمیل بفرسته و هم اس ام اس : 
class SmsMessage
{
    public $phone;
    public $content;
    public function __construct($phone,$content)
    {
        $this-&gt;phone = $phone;
        $this-&gt;content= $content;
    }
}

class EmailMessage
{

    public $email;
    public $content;
    public function __construct($email,$content)
    {
        $this-&gt;email = $email;
       $this-&gt;content= $content;
    }
}

class SendMessage
{
    public function Send($Messages = [])
    {
        foreach ($Messages as $message) {
            if ($message instanceof SmsMessage)
                SmsSendingFunc($message-&gt;content, $message-&gt;phone);
            elseif ($message instanceof EmailMessage)
                EmailSendingFunc($message-&gt;content, $message-&gt;email);
        }
    }
}

$SmsMessage = new SmsMessage(&#039;Hello World !&#039;,&#039;09169987453&#039;);
$EmailMessage = new EmailMessage(&#039;Hello World!&#039;,&#039;info@gmail.com&#039;);

$SendMessage = new SendMessage();
$SendMessage-&gt;Send([$SmsMessage, $EmailMessage]);خب همونطور که دیدم ما برای اینکه بیاییم مشخص کنیم نوع پیامی که داریم ارسال میکنیم چیه تا بتونیم پیاممون با تنظیمات اختصاصی اون نوع ارسال کنیم اومدیم و از instansOf استفاده کردیم ینی در واقع اومدیم توی خود سورس کدمون و اون تابع اصلی تغییر دادیم حالا اگه پنجاه روش ارسال پیام دیگه مشتری ما خواست اضافه کنه باید به همین ترتیب 50 بار دیگه اینکار بکنیم و این کار خوبی نیست و یه برنامه نویس حرفه ای که اصول SOLID بلده میدونه که این کار بر خلاف قانون دوم SOLID هستش . توی قانون دوم SOLID به وضوح میگه آقاجون کلاستو یه جور بنویس که اگه بعدا خواستی تغییرش بدی مثل کد بالا ، نیایی دست ببری توی خود سورس کد اصلی . سورس کد همیشه باید برای تغییر بسته باشه ینی اگه قرار بر تغییری باشه توی سورس کد نباشه راه حل چیه حالا ؟ خوب ما باید کلاسمون جوری بنویسیم که واسه هر تغییری نیاییم توی سورس کد اصلی و مثل بالا کدمون تغییر بدیم همچنین هر تغییری خواستیم بدیم (مثلا اگه خواستیم پیام به یه روش دیگه ارسال کنیم ) بتونیم خیلی راحت و آسون بدون دست بردن توی سورس کد این کار انجام بدیم برای اینکه به اهداف بالا برسیم باید و باید از قابلیت interface استفاده کنیم . حالا این دوست عزیزمون ینی آقای interface چیکار میکنه برامون ؟؟ ببین دوست من ، ما برای این که نیاییم هر بار از instansOf استفاده کنیم و کد اصلی تغییر بدیم باید یه تابعی مشترک (sendFunc)داشته باشیم که توی همه کلاس هامون هم باشه درسته این تابع بین همه کلاس ها مشترکه ولی بر اساس نوع آبجکت که از چه کلاسی هستش کد های متفاوتی اجرا میکنه و به این ترتیب دیگه نیازی نیست توی سورس کد اصلی دست برد .  مثلا میاد میبینه که message$ یه نمونه از کلاس SmsMessage هستش پس میاد توی کلاس SMSMessage و از اونجا تابع sendFunc اجرا میکنه . حالا کدهایی که توی این کلاس نوشتیم با کد هایی که توی کلاس EmailMessage نوشتیم متفاوته این مکانیزم ما با استفاده از interface ها پیاده سازی میکنیم .interface MessageSend{
    public function sendFunc();
}

//SMSکلاس ارسال اس ام اس که شماره تلفن توی ورودی میگیره
class SmsMessage implements MessageSend
{
    public $phone;
    public $content;
    public function __construct($phone,$content)
    {
        $this-&gt;phone = $phone;
        $this-&gt;content= $content;
    }

    public function sendFunc()
    {
        SmsSendingFunc($this-&gt;content, $this-&gt;phone);
    }
}
//EMAIL کلاس ارسال ایمیل که آدرس ایمیل توی ورودی میگیره
class EmailMessage implements MessageSend
{

    public $email;
    public $content;
    public function __construct($email,$content)
    {
        $this-&gt;email = $email;
        $this-&gt;content= $content;
    }

    public function sendFunc()
    {
        EmailSendingFunc($this-&gt;content, $this-&gt;email);
    }
}
//Send کلاس ارسال پیام ها که با توجه به نوع پیام به آدرس مورد نظر ارسال میکنه
class SendMessage
{
    public function Send($Messages = [])
    {
        foreach ($Messages as $message) {
     $message-&gt;sendFunc();
        }
    }
}

$SmsMessage = new SmsMessage(&#039;Hello World !&#039;,&#039;09169987453&#039;);
$EmailMessage = new EmailMessage(&#039;Hello World!&#039;,&#039;info@gmail.com&#039;);

$SendMessage = new SendMessage();
$SendMessage-&gt;Send([$SmsMessage, $EmailMessage]);در اپتدا یه interface میسازیم و اسمش میزاریم MessageSend حالا یه تابع توش میزاریم به اسم SendFunc این همون تابع مشترک ما هستش . در گام بعدی باید با implements کردن این اینترفیس متد sendFunc به همه کلاس هامون اضافه کنیم با اضافه کردن این متد لاراول میتونه متوجه بشه که اگه مثلا نوع اون message$ از کلاس SmsMessage بود بیاد و محتویات داخل این تابع اجرا کنه .  در گام آخر توی قسمت سورس کد اصلیمون به جای استفاده از instanseOf میاییم از همون تابع sendFunc() استفاده میکنیم حالا لاراول بر اساس نوع کلاس message$ میتونه متوجه بشه که کدوم متد اجرا کنه . حالا هر متد دیگه ای که قرار باشه اضافه بشه کافیه بیاییم کلاسش درست کنیم و بعد از اینترفیسمون implement کنیم به این ترتیب یه تابع sendFunc() درست میشه توی کلاس جدیدمون و حالا بر اساس تنظیمات دلخواه پیام به شیوه های دیگه میفرستیم مثلا با دود !#اصل Liskov در قوانین SOLIDاین اصل یه اصل خیلی ساده هستش ن شما فرض کن کلاس A داری و حالا بعد یه مدتی میخوایی این کلاس گسترش بدی و یه سری ویژگی ها اضافه کنی بهش ، پس یه کلاس دیگه میسازی به اسم B و اونو از کلاس A اکستند (extend) میکنی حالا اینجا این اصل وارد میشه و میگه : آقا چون الان کلاس B یه زیر کلاس از کلاس A هستش و همه ویژگی های کلاس A داره پس باید بتونیم هر جایی که شی از کلاس A ساختیم با کلاس B بسازیم مثلا مثل تیکه کد زیر : توی کد زیر ما از اول فقط یه کلاس A داشتیم بعدا تصمیم گرفتیم برنامه توسعه بدیم پس یه کلاس B  هم ساختیم و اون از کلاس A اکستند کردیم و ویژگی هایی جدیدی که میخواستیم اضافه کردیم بهش . خب طبق قانون Liskov الان باید بدون هیچ مشکلی با هر نمونه ای که از کلاس B ساختیم به کل متد های کلاس A دسترسی داشته باشیم . حالا بیاییم با هم بررسی کنیم ببینیم آیا این اصل اینجا رعایت شده یا نه !class A
{

    public function methodA()
    {
        return &#039;I am Method A!&#039;;
    }

    public function methodB()
    {
        return &#039;I am Method B!&#039;;
    }

    public function methodC()
    {
        return &#039;I am Method C !&#039;;
    }
}

class B extends A
{
    public function newFeature1()
    {
        return &#039;I am New Feature1&#039;;
    }

    public function newFeature2()
    {
        return &#039;I am New Feature2&#039;;
    }

    public function methodC()
    {
        return &#039;I am Method C From Class B !&#039;;
    }
}

//$object = new A;
$object = new B;خب ما اول object از کلاس A ساخته بودیم ولی چون کلاس B هه ویژگی های کلاس A داره و درواقع ازش ارث بری کرده پس باید بتونیم بدون هیچ مشکلی object به جای اینکه از کلاس A بسازیم بیاییم از کلاس B بسازیم تا بتونیم علاوه بر همه متد هایی که در کلاس A هستند به همه متد های جدید هم دسترسی داشته باشیم و از قابلیت های جدید هم بتونیم استفاده کنیم . حالا اگر برنامه ما اصل Liskov رعایت کرده باشه به راحتی این کار میتونیم انجام بدیم ولی توی این کدی که ما نوشتیم این اصل رعایت نشده چون ما الان اگر از کلاس B یه شی جدید بسازیم و بخواییم به methodC دسترسی داشته باشیم . برنامه میاد methodC خود کلاس B اجرا میکنه و ما نمیتونیم اون methodC که توی کلاس A هست با ساخت نمونه از کلاس B اجرا کنیم . $object = new B;
$object-&gt;methodC() ; // I am Method C From Class B !#اصل جدا سازی اینترفیس ها در قوانین SOLIDاگه اینترفیس X چندتا متد داشته باشه هیچ کلاسی نباید باشه که از اون اینترفیس (ینی همون X) impalements شده باشه و یکی از متد های اینترفیس X نیاز نداشته باشه . فرض کن یه شرکت برنامه نیوسی میاد میگه سلام من شنیدم شما برنامه نویس خیلی خوبی هستید ، من چون کارمندام خیلی زیادن میخوام یه برنامه ای  بنویسی که کارمندامو بتونم مدیریت کنم . کارمندای شرکت من یا برنامه نویس هستند یا کد ها تست میکنند (Tester) البته کارمندهای برنامه نویس میتونند کار تست هم انجام بدن . کد زیر ببین بهتر متوجه بشی : class Programmer
{
    public function coding()
    {
        return &#039;Coding . . . &#039;;
    }
}

class Tester
{

    public function testing()
    {
        return &#039;Testing . . . &#039;;
    }

}

class ProjectManagment
{
    public function process($user)
    {
        if ($user instanceof Programmer) $user-&gt;coding();
        elseif ($user instanceof Tester) $user-&gt;testing();
    }
}

$projectManagment = new ProjectManagment();
$projectManagment-&gt;process($user);
خب برای کد نویسی پروژه ای که به ما داده شده ما دوتا کلاس داریم یکی کلاس بچه های کد نویس (Programmer) یکی کلاس بچه های تستر (Testers) حالا توی هر کدوم از این کلاس ها فانکشن هایی وجود داره که در واقعکار کد نویسی و یا کار تست پروژه انجام میده .  یه کلاس دیگه هم داریم به اسم ProjectManager که همونطور که ازز اسمش پیداست کار مدیریت پروژه انجام میده این کلاس یه تابع داره به اسم process که یه مقدار ورودی میگیره و مشخص میکنه که اون کاربره باید چی کار انجام بده . ولی کد بالا یه مشکلی داره ، اونم اینه که اصل دوم SOLID ینی اصل Open/Close رعایت نکرده . کجا رعایت نشده این اصل ؟؟ همون جایی که اومدیم از instanceOf استفاده کردیم ، ما با استفاده از instanceOf در واقع اومدیم کد اصلی دستکاری کردیم . برای این که این مشکل حل کنیم باید بیاییم از interface ها استفاده کنیم ولی باید خیلی دقت کنیم که اینجا کلاس برنامه نویس هم میتونه کار تست انجام بده و هم کار کد زنی پس اینترفیس ما دوتا تابع داره یکی تابع code یکی دیگه تابع test : interface processJob
{
    public function code();

    public function test();
}بعد از اینکه اومدیم اینترفیس مربوطه ساختیم طبیعتا باید کلاس ها را ازش impalements کنیم و چون هر دو متد توی یه دونه interface قرار دادیم با impalements کردن اون interface هر دوتابعی که نوشتیم میاره توی اون کلاس مربوطه . حالا همونطور که گفتیم یه برنامه نویس میتونه هم کار کد زنی انجام بده و هم کار تست پس هر دو تابعی که توی اینترفیس ها معرفی شد توی کلاس Programmer استفاده شد و هیچ کدومشون بیکار نموند . class Programmer implements processJob
{

    public function code()
    {
        return &#039;Coding . . .&#039;;
    }

    public function test()
    {
        return &#039;Testing . . .&#039;;
    }
}ولی هر کسی که تست انجام میده نمیتونه کد زنی کنه پس همونطور که میبینید توی کلاس Tester الان متد code داره مثدار Null برمیگردونه ، به عبارتی یکی از متد هایی که توی اینترفیس تعریف کردیم بیکار موند و این بر خلاف اصل چهارم قوانین SOLID است . 
class Tester implements processJob
{

    public function code()
    {
        return null;
    }

    public function test()
    {
        return &#039;Testing . . .&#039;;
    }
}خب حالا را حل چیه ؟ ما باید بیاییم interface هامون جدا کنیم  اینجوری مثلا اگه کلاس tester به متد code نیازی نداشت میاد فقط از اینترفیس testInterFace استفاده میکنه و دیگه اون حالتی که حتما باید دوتا متد یه اینترفیس وجود داشته باشه از بین میره . interface codeInterFace
{
    public function code();
}

interface testInterFace
{
    public function test();
}حالا این اینترفیس ها به شکل پایین impelements میشن : class Programmer implements codeInterFace,testInterFace
{

    public function code()
    {
        return &#039;Coding . . .&#039;;
    }

    public function test()
    {
        return &#039;Testing . . .&#039;;
    }
}

class Tester implements testInterFace
{
    

    public function test()
    {
        return &#039;Testing . . .&#039;;
    }
}خب اینم از قانون چهارم حالا بریم سراغ آخرین قانون . #اصل Dependency Inversion : کلاس های سطح بالا نباید به کلاس های سطح پایین وابسته باشند این اصل خیلی شبیه به اصل open/Close هستش حالا میاییم با مثال این اصل کامل براتون توضیح میدیم .هر سایتی یه سیستم اطلاع رسانی داره ، مثلا اگه کاربری ثبت شد یا خریدی انجام گرفت یا هر چیز دیگه با استفاده از این سیستم به مدیر اطلاع رسانی میشه . حالا نکته کار اینجاست که این اطلاع رسانی میتونه با ایمیل یا پیامک یا هر چیز دیگه ای باشه ولی وقتی داریم این سیستم پیاده سازی میکنیم به یه مشکل رایج برمیخوریم کد زیر ببینید و اون مشکل سعی کنید خودتون حدس بزنید : &lt;?php

class Mailer
{
    public function send($message)
    {
        return $message;
    }
}

class SendMessage
{

    private $mailer;

    public function __construct(Mailer $mailer)
    {
        $this-&gt;mailer = $mailer;
    }

    public function sendComplateMessage()
    {
        $message = &amp;quotHello&amp;quot
        $this-&gt;mailer-&gt;send($message);
    }
}#کد چی میگه ؟ ببین یه کلاس Mailer داریم که برامون کار ارسال ایمیل انجام میده یه کلاس SendMessage داریم که پیام مربوطه میسازه و با استفاده از کلاس Mailer اونو ارسال میکنه . #کلاس سطح بالا و سطح پایین چیه ؟ خب اول یه توضیح کوچیکی بدم راجب کلاس سطح بالا و کلاس سطح پایین . ببین دوست من کلاس سطح کلاسی واسه انجام درست وظایفش به یه سری کلاس های دیگه نیاز داره ، مثلا توی مثال بالا کلاس سطح بالا میشه همون کلاس SendMessage چون برای اینکه بتونه پیامی ارسال کنه به کلاس Mailer احتیاج داره .#حالا مشکل کجاست ؟ الان مشکل دقیقا اینجاست که کلاس سطح بالای ما ینی کلاس SendMessage برای اینکه بتونه کارش درست انجام بده به کلاس Mailer  احتیاج داره و فردا روزی اگه قرار شد این ارسال پیام با SMS انجام بشه باید کلاس SendMessage تغییر بدیم . #راه حل چیه حالا ؟ کلا مشکلات مربوط به وابستگی معمولا با اینترفیس ها حل میشه الانم باید از اینترفیس ها استفاده کنیم و این مشکل حل کنیم ، باید کاری بکنیم که کلاس SendMessage هیچ وابستگی به کلاس Mailer نداشته باشه تا هر وقت که خواستیم به جز ایمیل مثلا SMS هم ارسال کنیم دیگه نیاییم خود کلاس تغییر بدیم . &lt;?php

interface Sender
{
    public function send($message);
}

class Mailer implements Sender
{

    public function send($message)
    {
        // TODO: Implement send() method.
    }
}

class SMSer implements Sender
{

    public function send($message)
    {
        // TODO: Implement send() method.
    }
}

class SendMessage
{

    private $sender;

    public function __construct(Sender $sender)
    {
        $this-&gt;sender = $sender;
    }

    public function sendComplateMessage()
    {
        $message = &amp;quotHello&amp;quot
        $this-&gt;sender-&gt;send($message);
    }
}

$send = new SendMessage(new SMSer());توی این تیکه کد ما اومدیم از interface ها استفاده کردیم ، اینجا ما اومدیم یه interface ساختیم به اسم Sender یعدش این اینترفیس implements کردیم حالا اومدیم توی کلاس SendMessage وابستگی ها از بین بردیم و به جای کلاس های Mailer و Smser از اینترفیس Sender استفاده کردیم و به این ترتیب دیگه فرقی نمیکنه که ورودی ما از چه نوعی باشه میخواد از کلاس SMSer باشه  یا Mailer یا هر کلاس دیگه ای هیچ فرقی نمیکنه . خب دوستان بلاخره این مقاله طولانی هم به اتمام رسید امیدوارم تونسته باشم مفاهیم SOLID خیلی خوب بهتون توضیح داده باشم از همتون ممنونم که تا اینجا منو همراهی کردید اگه سوالی داشتید حتما حتما بپرسید و همچنین اگه دوس داشته باشید میتونید منو توی لینکدین هم دنبال کنید با تشکر از لطف شما .دانیال صناعی  </description>
                <category>دانیال صناعی</category>
                <author>دانیال صناعی</author>
                <pubDate>Thu, 12 Aug 2021 01:46:20 +0430</pubDate>
            </item>
                    <item>
                <title>مفهوم Service Provider در لاراول + مثال های متنوع</title>
                <link>https://virgool.io/@danial_sanaee/%D9%85%D9%81%D9%87%D9%88%D9%85-service-provider-%D8%AF%D8%B1-%D9%84%D8%A7%D8%B1%D8%A7%D9%88%D9%84-%D9%85%D8%AB%D8%A7%D9%84-%D9%87%D8%A7%DB%8C-%D9%85%D8%AA%D9%86%D9%88%D8%B9-talnul1gnzej</link>
                <description>Service Provider in Laravelتو خونه نشستی پای فوتبال ، خانمت غر میزنه میگه برو نون بگیر ، حالا از اون جایی که تو هم پیسر خوبی هستی و به حرف خانمت گوش میدی ، تصمیم میگیری بری نون تهیه کنی ، خب طبیعتا یه فرآیندی طی میکنی تا آماده بشی ، لباس میپوشی ، موهات شونه میکنی ، کیف پولتو برمیداری و . . . همونطور که اگه بخوایی نون بگیری یا هر کار دیگه کنی یه سری کار های آماده سازی باید انجام بدی  ،  هر برنامه ای هم برای اینکه اجرا بشه و به درستی بتونه کار کنه باید یه سری از کلاس ها و سرویس ها ، اینترفیس ها و موارد مهم و ضروری قبلش فرآخوانی کنه . توی لاراول قبل از اینکه برنامه بخواد به درستی اجرا بشه ، باید سرویس های مهم دیتابیس ، کش ، کوکی و یه سری سرویس های دیگه فرآخونی بشن . حالا کسی که این عملیات آماده سازی انجام میده آقای Service Provider هستش ینی کسی که قبل از شروع برنامه ، سرویس های مورد نیاز برنامه آماده میکنه . این آقا به نوعی راه انداز سیستم لاراولی ما هستش و میاد میبینه برنامه ما به چه سرویس هایی نیاز داره میره اونا برامون میاره و کاری میکنه که بتونیم توی هر جایی از برنامه ،  اجراشون کنیم . حالا فکرش بکن ، زندگی چقدر راحت تر میشد اگه توی زندگی واقعی هم آقای Service Provider بود ، در این صورت ما فقط فرآیند های اصلی انجام میدادیم و فرآیند هایی که قبلش باید انجام بدیم ، مثل لباس پوشیدن ، رانندگی کردن ، کارت کشیدن ، آقای Service Provider فراهم میکرد . خونه Service Provider ها کجاست ؟ توی یه برنامه لاراولی ، هر سرویسی ، مثل Database و یا Session و یا هر سرویس دیگه برای اینکه مجوز فعالیت توی برنامه بگیره باید به آقای Service Provider معرفی بشه ، ینی بگه آقای Service Provider من سرویس Session هستم و میخوام توی این برنامه مورد استفاده قرار بگیرم . حالا این معرفی شدنه باید کجا انجام بشه ؟؟ ما چطوری باید سرویس خودمون به لاراول معرفی کنیم ؟؟ برنامه لاراولی باز کن و وارد مسیر Config/App.php شو یکم به پایین اسکرول کن یه آرایه میبینی به اسم Providers : &#039;providers&#039; =&gt; [
    /*
     * Laravel Framework Service Providers...
     */
    Illuminate\Auth\AuthServiceProvider::class,
    Illuminate\Broadcasting\BroadcastServiceProvider::class,
    Illuminate\Bus\BusServiceProvider::class,
    Illuminate\Cache\CacheServiceProvider::class,
    Illuminate\Foundation\Providers\ConsoleSupportServiceProvider::class,
    Illuminate\Cookie\CookieServiceProvider::class,]هر سرویسی که توی سیستم قراره استفاده بشه ، باید توی این آرایه اضافه بکنیم . مثلا اگه ما یه پکیج به سیستم اضافه کنیم باید از این طریق پکیج به سیستم معرفی کنیم . در حالت پیشفرض یه سری از سرویس های اصلی و مهم  که مربوط به هسته لاراول هستند اینجا ثبت شدند ، وقتی که برنامه ما اجرا میشه لاراول اول Provider های ما لود میکنه و بعد برنامه اصلیمون میاد لود میکنه به این ترتیب وقتی برنامه اصلی لود شد هر چیزی که نیاز داره برای استفاده آمادست . #کاربرد Service Provider در بهینه سازی و بهبود عملکرد نرم افزار خب ما تا الان گفتیم سرویس پروایدر قبل از اجرای برنامه اصلیمون همه سرویس های مورد نیاز فراهم میکنه . حالا بعضی وقتا ما نیاز داریم یه سری سرویس هایی توی کل سیستم در اختیار داشته باشیم ، ینی درواقع یه چیز عمومی توی کل سیستم ، مثل سیستم اطلاع رسانی :  خوب همونطور که در تصویر میبینید ، فرقی نمیکنه ما توی داشبورد باشیم یا مثلا هر جای دیگه از سایتمون ، همیشه و همه جا باید بتونید اعلان های جدید ببینیم .طبیعتا برای فراخوانی این اعلان ها باید کدی نوشته بشه منتها فرق این کد با بقیه کد ها اینه که لازمه توی کل سیستم باشه و منحصر به یه کنترلر نیست  ، خب یه راهش اینه که بیاییم توی توابع سازنده هر بخش (Controller )این تیکه کد بزاریم که مثلا اگه سایت ما هزار بخش داشته باشه باید هزار بار این تیکه کد کپی کنیم که طبیعتا کار منطقی نیست .خب واسه این که با یه بار نوشتن این تیکه کد توی هر جایی که بخواییم بهش دسترسی داشته باشیم ،  باید از Service Provider استفاده کنیم (اصلا کارش همینه دیگه ) اینجوری کدامون خیلی خیلی بهینه میشن . حالا چطوری ؟ اگه سرویس هایی که میخواییم به برناممون اضافه کنیم کم باشند مثلا دو سه مورد باشند ، میتونیم بزاریمشون توی App Service Provider که یه Provider هستش که قبلا ثبت شده بنابراین دیگه نیاز نیست برید یه پروایدر جدید بسازید . class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //اینجا میتونیم کدمون اضافه کنیم
    }
}
ولی اگه برناممون برنامه کوچیکی نباشه ما و سرویس های زیادی داشته باشیم که نیاز باشه به سیستم اضافه بشه باید دیگه بهینه  و منظقی نیست که بیاییم توی App Service Provider همه این موارد بنویسیم .# افزودن Provider به لاراول : خب گفتیم اگه سرویس های زیادی داشته باشیم که نیاز باشه به سیستم اضافه بشه و در قسمت های مختلف برنامه استفاده بشه دیگه کار درستی نیست که بیاییم همشون توی App Service Provider اضافه کنیم و بهترین کار اینه که برای هر کدوم یه Provider جدا درست کنیم حالا سوال اینجاست که چطوری این کار بکنیم ؟ برای ساخت Provider شخصی ما میاییم از دستور آرتیسان زیر استفاده میکنیم : php artisan make:provider --nameحالا این چیزی که ساختیم کجا ذخیره میشه و ما باید کجا کدمون بنویسیم ؟ اگه پوشه App باز کنی یه بخشی داره به اسم Providers توی اون بخش میتونی Provider که ساختی ببینی . خب حالا اینجا این Provider عزیز ما دو تا قسمت داره ، یکی Boot و یکی دیگه Register که الان بت میگم هر کدومشون برا چیه و چه موقعی باید ازش استفاده کرد . # قسمت Register در پروایدر های لاراول  :وقتی بخواییم چیزی به Service Container اضافه (Bind)کنیم میاییم کدمون توی این متد مینویسیم .توی این متد ، نباید از سرویس های دیگه استفاده کنیم و حالت درستش اینه که اطلاعاتمونو فقط به یه سرویس Bind کنیم . حالا دلیلش چیه ؟ دلیلش اینه که ، وقتی فریمورک اجرا میشه ، اول میاد متد Register همه پروایدر هایی که تو سیستم ثبت شدن اجرا میکنه .پس اگه توی یه دونه از این Provider ها بیاییم از دوتا یا سه تا سرویس استفاده کنیم ، ممکنه اونا هنوز پردازش نشده باشند ، ینی فریمورک متد Register اونا هنوز اجرا نکرده باشه .وقتی کار Service Provider با همه متد های Register تموم شد ، هر سرویسی که بخواییم در اختیار داریم و با خیال راحت میتونیم از هر امکانی استفاده کنیم .# قسمت Boot در پروایدر های لاراول  :خیلی وقتا ما میخاییم هر  وقت که یه View ی  رندر شد ، یه سری اطلاعات هم به اون ویو Bind بشه مثل مثال زیر :public function boot()
{
    View::composer(&#039;admin.require.header&#039;, function($view) {
        $view-&gt;with([
            &#039;notifications&#039; =&gt; Auth::user()-&gt;notifications(),
            &#039;unreadNotifications&#039; =&gt; Auth::user()-&gt;unreadNotifications(),
        ]);
    });
}توی این مثال ما میخواییم هر وقت که ویو Header رندر شد ، مثلا Notification ها هم بهش Bind بشه و ما توی Header به اعلان های کاربر دسترسی داریم . خب همونطور که توی مثال هم مشخصه برای اینکار باید از View Composer (راجب نحوه عملکرد View Composer جلوتر توضیح دادم )استفاده کنیم و اگه بخواییم از View Composer استفاده کنیم باید توی متد Boot کدمون بنویسیم .هر چیزی غیر از Bind کردن باید توی متد Boot انجام بدید ، ، مثلا وقتی میخوایی از Event Listener ها استفاده کنی یا وقتی میخوایی از Middleware ها تو کدت استفاده کنی باید این کار توی متد Boot انجام بدی .وقتی داری تو متد Boot کد میزنی ، میتونی مطمعن باشی همه سرویس ها ثبت شدند و از همه این سرویس ها میتونی توی کدت استفاده کنی ، مثلا من اگه بخوام از سرویس اعتبار سنجی (auth) و ,کش (cache ) توی  متد Boot استفاده کنم هیچ مشکلی نداره .# تزریق وابستگی به متد Boot :گاها پیش میاد متد Boot برای این که کار خودش به درستی انجام بده به وابستگی هایی نیاز داشته باشه ، از اونجایی که ما داریم از یه فریمورک خارق العاده و بینظیر استفاده میکنیم این وابستگی ها به شکل اتوماتیک توسط Service Container به متد Boot تزریق میشن . مثال زیر نگاه کن تا کاملا متوجه بشی :public function boot(ResponseFactory $response)
{
    $response-&gt;macro(&#039;serialized&#039;, function ($value) {
        //
    });
}# ثبت Provider :خب تا اینجای کار ما Provider خودمون ساختیم و کدمون هم توی متد Boot و یا Register نوشتیم حالا به نظرتون ما میتونیم از Providerی که ثبت کردیم توی سیستم استفاده کنیم ؟؟ مسلما جواب منفی هستش . درسته که ما Provider بدون هیچ عیب و ایرادی ساختیم ولی هنوز به لیست Provider های لاراول اضافش نکردیم ، پس وقتی که لاراول شروع به کار میکنه ، این Provider توی لیست خودش نمیبینه و به همین خاطر هم کدهایی که نوشتیم اجرا نمیکنه . پس ما باید این Provider توی سیستم ثبت کنیم برای اینکار ما اول از همه وارد پوشه Config میشیم و سپس فایل App.php باز میکنیم بعد دنبال قسمت provider ها میگردیم و Provider خودمون معرفی میکنیم دقیقا به شکل زیر : &#039;providers&#039; =&gt; [
    // Other Service Providers

    App\Providers\ComposerServiceProvider::class,
],نکته : توی آرایه ای که میبینی همه Provider ها یه اهمیت یکسان ندارند بعضیاشون واسه راه اندازی سیستم حیاتی هستند مثل Mailer و Cache و یه سری دیگه واسه راه افتادن سیستم ضروری نیستند ، و سیستم ما میتونه بدون اونا هم به درستی راه اندازی بشه  ، مثل اون پکیج هایی که اضافه میکنیم . حالا این Provider هایی که برای راه انداخته شدن سیستم ضروری نیستند اکثرا به شکل Deferred ثبت شدند ینی وقتی بهشون نیاز باشه صدا زده میشند و اجرا میشند اینطوری سیستم ما خیلی بهینه تر میشه . یه مثال کاربردی : خب ماشین سرویس های زیادی داره ، کولر ، ظبط ، گرمکن های صندلی ، بالابر های شیشه و . . . ولی آیا وقتی ماشین میخواییم روشن کنیم نیازی هست کولر هم روشن بشه ؟ نیازی هست ظبط هم روشن بشه ؟ چرا الکی به موتور و باتری خودمون فشار وارد کنیم ؟ سرویس هایی مثل کولر و ظبط وقتی بهشون نیاز داشته باشیم فراخوانی میشند و تاثیری توی راه اندازی اولیه ندارند دقیقا مثل لاراول  . #مثال کاربردی راه اندازی و استفاده از Service Provider در لاراول ما میخواییم توی سایت لاراولیمون اطلاعیه های مربوط به هر کاربر توی پنل خودش بهش نشون بدیم ینی مثلا اگه یه پیامی براش اومد بنویسیم &quot;یک پیام جدید دارید ! &quot; . از طرفی بخش Notification هم برای اینکار تنظیم کردیم و فقط میخواییم کاربر هر جا باشه بتونه پیامهاش ببینه . خب مشخصا باید از سرویس پروایدر ها استفاده کنیم و چون اطلاعاتی که میگیریمو میخواییم به یه ویو ارسال کنیم باید کدمون توی متد Boot بنویسیم . public function boot()
{
    View::composer(&#039;admin.require.header&#039;, function($view) {
        $view-&gt;with([
            &#039;notifications&#039; =&gt; Auth::user()-&gt;notifications(),
            &#039;unreadNotifications&#039; =&gt; Auth::user()-&gt;unreadNotifications(),
        ]);
    });
}ببین وقتی که میخوایی سرویس پروایدر شخصیت ثبت کنی و اطلاعات میخوایی به یه View ارسال کنی  ، باید از متد Composer استفاده کنی این متد ازت سوال میپرسه آقای برنامه نویس چه اطلاعاتی میخوایی همیشه برات بیارم ؟ مثلا اینجا اون اطلاعات میشه notification و unreadNotification ینی لیست اطلاعیه ها (اینو داره توی آرگومان دوم تابع میپرسه که یه کال بک فانکشنه ) . بعدش میپرسه خب اوکی ولی این اطلاعات توی چه View هایی در دسترس باشند ؟ خب از اونجایی که Header توی همه صفحه ها هست و من هم میخوام اطلاعیه هام توی Header نشون بدم میگم آقا هر وقت ویو Header صدا زده شد بیا و اطلاعیه ها هم برام بیار . الان اگه بریم توی فایل Header و بخواییم از Notification ها استفاده کنیم بازم نمیتونیم چون ما Provider که تعریف کردیم به Service Provider معرفی نکردیم . برای این که اینکار بتونم انجام بدیم باید بریم توی پوشه Config و فایل App.php باز کنیم توی قسمت Providers میاییم و Provider که ساختیم معرفی میکنیم . &#039;providers&#039; =&gt; [
    /*
     * Laravel Framework Service Providers...
     */
    App\Providers\NotificationServiceProvider::class,]خب حالا به راحتی میتونیم توی فایل Header از اطلاعات دلخواهمون استفاده کنیم و اعلان ها را نمایش بدیم . @foreach($notifications as $notif)
        &lt;li&gt;
            &lt;div href=&amp;quot#&amp;quot class=&amp;quotp-3 list-group-item d-flex align-items-center link-1 hide-show-toggler&amp;quot&gt;
                &lt;div&gt;
                    &lt;figure class=&amp;quotavatar avatar-sm m-r-15&amp;quot&gt;
                      &lt;span class=&amp;quotavatar-title bg-info-bright text-info rounded-circle&amp;quot&gt;
                          &lt;i class=&amp;quot{{$notif-&gt;data[&#039;icon&#039;]}} font-size-20&amp;quot&gt;&lt;/i&gt;
                      &lt;/span&gt;
                    &lt;/figure&gt;
                &lt;/div&gt;
        &lt;/li&gt;
@endforeach# به تعویق انداختن اجرای Provider ها :از اونجایی که فریمورک در هر درخواستی میاد این پروایدر ها اجرا میکنه ، پس اگه کاری کنیم که پروایدری که نوشتیم فقط در مواقعی که بهش نیاز داریم فراخوانی بشه و نه با هر Request‌ ی که به برنامه میاد ، برناممون خیلی بهینه تر و حرفه ای تر میشه به این کار میگن Differed کردن . وقتی که ما توی Providerی که نوشتیم فقط از متد Request استفاده کرده باشیم ، ینی درواقع فقط عملیات Bind کردن انجام داده باشیم میتونیم با Differed کردن ، به لاراول بگیم اقای لاراول لطفا این Provider وقتی اجرا کن که بهش نیازه ‌ .#حرف آخر خب دوستان این پست هم تموم شد و من همه چیزایی که لازم بود راجب Service Provider بدونید بهتون گفتم ولی خودتون هم تمرین کنید و هر سوالی براتون پیش اومد میتونید ازم بپرسید البته من توی اینستاگرام و لینکدین هم حضور فعال دارم (@danial_sanaee) خیلی خوشحال میشم اونجا ببینمتون . به امید دیدار</description>
                <category>دانیال صناعی</category>
                <author>دانیال صناعی</author>
                <pubDate>Mon, 19 Jul 2021 23:41:16 +0430</pubDate>
            </item>
                    <item>
                <title>بررسی مفهوم شی گرایی</title>
                <link>https://virgool.io/@danial_sanaee/%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C-%D9%85%D9%81%D9%87%D9%88%D9%85-%D8%B4%DB%8C-%DA%AF%D8%B1%D8%A7%DB%8C%DB%8C-zdtjm1icjtfv</link>
                <description>سلام دوستای گلم ، دانیال هستم ، امروز میخواییم ببینیم آقا این شی گرای شی گرایی که انقد ازش حرف میزنن ، چیه اصن ؟ چطور به وجود اومده و چرا حتما حتما باید با مفهومش آشنا باشیم .توی این مقاله با مفهوم شی گرایی آشنا میشیم و خود شی گرایی آموزش نمیدیم . سر و‌کله این شی گرایی چه طوری پیدا شد ؟روند پیدایش شی گرایی در برنامه نویسیببین قبل از شی گرایی برنامه نویسی به شکل فانکشنال یا رویه ای انجام میشد ، البته همین الان هم این روش فانکشنال هم طرفدار های خودش داره ولی در کل چیزی که خیلی بهتر پذیرفته شده استفاده از شی گرایی . خلاصه داشتم میگفتم ، این دوستای برنامه نویسمون که از روش های فانکشنال برای کد نویسی استفاده میکردند ، با بزرگتر شدن پروژه هاشون ، به مشکلات زیادی خوردن . هر چی پروژه بزرگ تر میشد ، تعداد توابع خیلی بیشتر میشد و برنامه نمیشد درک کرد ، حالا این درک نشدن برنامه ، خودش مشکلات خیلی زیادی توی دیباگ کردن ، اضافه کردن ویژگی و خیلی موارد دیگه به وجود میورد ، بعد از مدتی که این مشکلات لمس شد ، برنامه نویسا به فکر چاره افتادن . برنامه نویس های به ستوه آمده از روش فانکشنال ، تصمیم گرفتن کاری کنن تا برنامه نویسی ، به زندگی روزمره بیشتر شباهت پیدا کنه ، اینجوری ، درکش آسون تره ، خیلی تمیز تر میشه کد زد ، میتونیم دوباره از کدهامون استفاده کنیم ، و مهمترین نکته اینه که منطق های پیچیده تر میشه راحت تر پیاده سازی کرد .مفهوم شی گرایی با مثال های متنوع مفهوم شی گرایی با مثال مسافرت ببین فرض کن میخوایی بری مسافرت و الان میخوایی وسایلت جمع کنی ، خب یه راه حل اینه که بیایی همه چیز بندازی توی یه چمدون د برو که رفتیم ، راه حل بهتر ، اینه که وسایلمونو توی دسته های مختلف بزاریم ، مثلا لباس هامونو توی چمدون لباسی ، وسایل بهداشتی توی یه چمدون دیگه ، لوازم دیجیتالمونم یه جای دیگه بزاریم . اینجوری اگه خواستیم مثلا به وسایل دیجیتالمون یه چیز دیگه اضافه کنیم ، میتونیم خیلی راحت تر و ساده تر اینکار انجام بدیم ، در واقع ما با اینکار اومدیم از شی گرایی استفاده کردیم ، هر کدوم از وسایلی که گذاشتیم توی هر چمدونی ، خودش میشه یه شی و اون چمدونه میشه یه کلاس بزارید با یه مثال دیگه براتپن توضیح بدم .‌مثال بازی شطرنج ببین بازی شطرنج در نظر بگیر ، هر مهره ، جز یه دسته ای  ، یا سربازه ، یا رخه ، یا شاهه ، یا وزیر و غیره ، حالا اگه به ما بگن بیا یه بازی شطرنج برامون برنامه نویسی کن ، میگیم خوب ، باید برای هر دسته یه کلاس درست کنم ، مثلا کلاس رخ ، کلاس شاه ، کلاس سرباز .  حالا هر مهره ای مربوط به یه کلاسه در واقع هر مهره ای یه آبجکت یا نمونه از اون کلاس خودش هست ، مثلا یه سرباز روی صفحه شطرنج ، یه نمونه از کلاس سرباز هستش .  هر کدوم از این آبجکت ها ، رفتار های مشابه دارند مثلا یه جور حرکت میکنند ، یه جور حمله میکنند و غیره . حالا در عین حال ، هر نمونه ای ، میتونه ویژگی های خاص خودش داشته باشه ، مثلا یه سرباز میتونه رنگش سفید باشه یا سیاه یا مثلا طولش بلند باشه یا کوتاه و سایر موارد ‌ .حالا ما اگه بخواییم به سربازمون بگیم یه گام به جلو برو میاییم توی کلاس سرباز ، متد Move صدا میزنیم و ورودی که میخواد که همون تعداد گام هایی که میخواییم مهرمون حرکت کنه ، بش میدیم ، به همین راحتی اومدیم از شی گرایی برای برنامه نویسی استفاده کردیم .چرا باید از شی گرایی استفاده کنیم ؟دلایل استفاده از شی گرایی با استفاده از شی گرایی کد های قابل فهم تر و تمیز تری داریم .میتونیم خیلی راحت تر منطق پروژه پیاده سازی کنیم و به همین دلیل میتونیم سرعت بسیار بالاتری در کد زنی داشته باشیم .هر قابلیتی که خواستیم اضافه کنیم یا هر مشکلی که خواستیم برطرف کنیم ، خیلی راحت و سریع میتونیم این کار انجام بدیم ، چون همه چیز مرتب و منظمه دقیقا مثل اون مثال مسافرته .اکثر زبان های امروزی به شکل شی گرا توسعه پیدا کردند و برای اینکه بتونبم به بهترین نحو ازشون استفاده کنیم باید با شی گرایی آشنا باشیم .چه زبان هایی شی گرا هستن ؟زبان های شی گراامروزه تقریبا اکثر زبان های برنامه نویسی شی گرا هستند ‌.سی شارپسی پلاس پلاسروبیپی اچ پیجاواکاتلینگوجاوا اسکریپتخب دوستان این مقاله آموزشی هم همینجا به پایان رسید هر سوالی داشتید میتونید زیر همین پست بپرسید ، امیدوارم از این محتوای آموزشی خوشتون اومده باشه ، به امید دیدار .</description>
                <category>دانیال صناعی</category>
                <author>دانیال صناعی</author>
                <pubDate>Mon, 05 Jul 2021 19:44:04 +0430</pubDate>
            </item>
                    <item>
                <title>تست نویسی چیه و به چه دردی میخوره ؟</title>
                <link>https://virgool.io/@danial_sanaee/%D8%AA%D8%B3%D8%AA-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%DA%86%DB%8C%D9%87-%D9%88-%D8%A8%D9%87-%DA%86%D9%87-%D8%AF%D8%B1%D8%AF%DB%8C-%D9%85%DB%8C%D8%AE%D9%88%D8%B1%D9%87-bvfo6o4cbmih</link>
                <description>بررسی مفهوم تست نویسی به همراه مزایا و چالش ها تست نویسی ، یکی از بخش های جدانشدنی ساخت نرم افزاره ، با تست نویسی ، میتونیم تا حدودی ، اشکالات نرم افزاری که ساختیمو ، قبل از انتشار در مارکت ها یا تحویل دادن پروژه ،  شناسایی کنیم  ، این کار اگه به شکل اصولی انجام بشه ، هم از نظر هزینه ای ، هم از نظر کارایی ، خیلی به نفعمونه ، چون دیباگ کردن نرم افزار ، وقتی پروژه تحویل داده شده و در حال اجرا هستش به مراتب هزینه و زمان بیشتری بیشتری میطلبه ، همچنین اعتبار ما به عنوان برنامه نویس خدشه دار میکنه ، حالا در ادامه همراه من باش تا بهت بگم جریان چیه اصن . فرآیند تست نویسی چطوری انجام میشه  ؟ نحوه انجام فرآیند تست نویسیهر برنامه از چندین واحد تشکیل شده ، که هر واحد یه کار خاص انجام میده ، حالا میخوایی ببینی ، هر کدوم از این اجزا کاری که باید انجام بدن ، انجام میدن یا نه ؟؟ برای این کار از مفهوم Unit Testing استفاده میشه ، توی این مفهوم هر بخش از برنامه ما یه واحد یا Unit به حساب میاد و کد هایی نوشته میشه که اون Unit تست کنند ، وقتی که توی اون تست موفق بودیم ، به اصطلاح تستمون Pass میشه ، و ما تونستیم واحد مورد نظرمونو از نظر کارایی تست کنیم . حالا اگر ما بیاییم و به ازای هر بخش قابل تست برنامه ، کد تست هم بنویسیم در واقع مفهوم تست نویسی به خوبی توی پروژمون انجام دادیم و یه مزیت خیلی بزرگ برای یه برنامه نویسه ، هر چند که معمولا برنامه نویس ها از تست نویسی خوششون نمیاد !!مثال برنامه نویسی : مثال برنامه نویسی تست نویسی  فرض کن داری یه برنامه ماشین حساب مینویسی ، یه چیزی مثل ماشین حساب ویندوز مثلا ، خوب این آقای ماشین حساب ، جمع داره ، ضرب داره ، تقسیم داره ، تفریق داره ، هر کدوم از این موارد ، میشن یه واحد یا یدونه Unit حالا ما وقتی کار برنامه نویسی هر واحدی تموم کردیم ، باید یه کد کوچیکم بنویسیم که این واحد از نظر سلامت چک کنه ، به این کار ما میگن Unit Testing . حالا شاید بگید خوب این چه کاریه ، خودمون تستش میکنیم دیگه ، اگه بخوایی خودت تست کنی برنامتو ،  تست دستی انجام میدی ، که اگه برنامت بزرگ باشه ، گور خودتو کندی ??  حالا توی این مثال ماشین حساب برنامه شما ، برنامه کوچیکیه به خاطر همین شاید تست کردنش توسط خودتون آسون باشه ، ولی اگه برنامتون خیلی بزرگ تر باشه و بخوایید در کمترین زمان ممکن بفهمید چه اشکالاتی داره ، تا برای انتشار آمادش کنید ، اون موقع ارزش استفاده از Test ها دو چندان میشه . چرا باید تست نویسی انجام بدیم ؟ بررسی دلایل انجام تست نویسیبا استفاده از مفهوم تست نویسی ، میتونیم اشکالات برناممون خیلی سریع پیدا کنیم و دیگه وقت زیادی صرف بررسی کل برنامه نکنیم که ببینیم اشکال از کجاست ، مخصوصا اینکه در برنامه های بزرگ ، موارد بسیار زیادی برای تست هست که اگه بخواییم همه این موارد ، تکی تکی و به شکل دستی تست کنیم ، کارمون بعد از کار معدن ، سخت ترین کار دنیا میشه . من یادمه قبلا برای تست عملیات ذخیره یه سری اطلاعات روی هاست ، هر بار ، خودم اطلاعات وارد میکردم و میدیدم مشکلی داره یا نه ، مثلا فک کن یه فرمی داری ۱۰۰ المان داره که باید پر بشن ، حالا میخوایی ببینی آیا این فرمه به درستی سیو میشه تو دیتابیست یا نه ، خب مشخصه این که بخوایی بیایی هر بار خودت اطلاعات وارد کنی و این موضوع چک کنی خیییلی کار زمان بری ، حالا فکرشو بکن توی پروژه های بزرگ دها مورد از این ها داریم ما ، خب چرا این کار بکنیم ، در صورتی که میتونیم با یک بار تست نویسی اون قسمت ، هزار بار بتونیم تست کنیم ، اونم به شکل اتوماتیک و در چند ثانیه ؟ میتونیم قبل از اینکه برنامه به دست کاربر برسه ، اشکالات سیستم شناسایی کنیم ، تا برنامه با حداقل باگ و حداکثر کارایی ، تحویل بدیم و وقت و هزینه زیادی صرف پشتیبانی و باگ یابی نکنیم علاوه بر این اعتبار خودمون یا شرکتمونو این جوری تا حد زیادی بالا میبریم . در بسیاری از مواقع اولین باگ ما میتونه اخرین باگ ما باشه و اگر بخش های مهمی از سیستم ما ، مثلا بخش پرداخت دچار باگ های بد باشه ، میتونه تبعات حقوقی و غیر حقوقی زیادی برامون داشته باشه توی این پروژه ها ، حتما باید تست نویسی انجام بدیم . سیستمی که ما نوشتیم ، همیشه یه وضعیت ثابت نداره ، ممکنه نت کاربر قطع بشه ، ممکنه افزونه های کروم یا موزیلا باعث از کار افتادن قسمت خاصی از کدامون بشن و در کل ، یک برنامه باید در همه شرایط تست کرد ، واسه این که بتونیم این کار خیلی سریع و مداوم انجام بدیم ، باید از تست نویسی استفاده کرده باشیم . یه مورد مهم دیگه اینکه برنامه نویس چون با تست نویسی ، اون بخشی که کد زده ، کاملا بررسی میکنه ، درک بالایی از اون تیکه کد داره ، چون عملکردش کاملا بررسی کرده ، پس اگه بخواد تغییراتی توی اون تیکه به وجود بیاره خیلی راحت تر میتونه اینکار بکنه . مورد بعدی اینکه اگر ماژولار کد  بزنیم ، Unit هامون به همراه تست هایی که نوشتیم میتونم هر جای دیگه که خواستیم استفاده کنیم پس درواقع با تست نویسی یه تیکه کد سالم و تست شده داری که میتونی توی پروژه های دیگه ازش استفاده کنی . یه برنامه نویس چطور تست نویسی میکنه ؟ نحوه انجام تست نویسیاقای برنامه نویسه ، که‌ داره ماژولار کد میزنه ، وقتی کد اصلی مینویسه ، یه کد تستم مینویسه که وظیفش اینه که صحت و سلامت اون کد اصلی تست کنه ، این کدای تستی که مینویسه ، در مرحله انتشار نرم افزار پاک میشن و فقط در مرحله توسعه نرم افزاره . حالا این کدا کجا مینویسه ، این برنامه نویس گلمون ؟ معمولا برای تست نویسی از یک فریمورک Unit Test استفاده میشه که مثلا برای php فریمورک Php Unit استفاده میشه . یکی از بزرگترین مزیت هایی که در استفاده از این فریمورک ها هست ، اینه که در مواقعی که یک تست شکست میخوره ، گزارش کاملی بهت میده . چالش های تست نویسی چیه ؟ چالش های تست نویسی !!تست نویسی ، نمیتونه همه اشکالات و باگ های موجود در برنامه تشخیص بده کلا تست نویسی فقط یک بخش از تست نرم افزاره اینجوری نیست که با انجام تست نویسی و پاس کردن تست های مربوطه کللللا برنامه بدون اشکالی داشته باشیم ، باید حتما تست های دیگه هم انجام بدیم . همه بخش های برنامتو نمیتونی تست کنی ، بعضی از قسمت ها قابلیت پیاده سازی به شکل تست ندارند و برای تست اون قسمت ها باید به شکل دستی وارد عمل بشینتیجه گیری ؟ تست و ارزیابی جز جدا نشدنی کار ما برنامه نویسا ، پس در هر صورت تست باید در هر زمان و هر شرایطی که ما اراده کنیم در کمترین زمان ممکن انجام بشه ، منتها اگه تست بخواد دستی انجام بشه ، مشکلات زیادی داره که گفتم بهتون ، پس بهتره تست نویسی خیلی جدی بگیریم و حتما توی پروژه هامون ازش استفاده کنیم ، با انجام این کار ، هم برنامه هایی که میسازیم ، هم خودمون ،  از نظر کیفی چندین گام بزرگ به جلو حرکت میکنیم . خب دوستان این پست هم به اتمام رسید ، اگه دوست داشتید منو توی لینکدین و ایستاگرام دنبال کنید @danial_sanaee تا دیدار بعدی فعلا خدانگهدار . </description>
                <category>دانیال صناعی</category>
                <author>دانیال صناعی</author>
                <pubDate>Sat, 03 Jul 2021 20:58:03 +0430</pubDate>
            </item>
                    <item>
                <title>فریلنسر یا ;کار در شرکت برنامه نویسی یا استارت آپ  + نسخه صوتی</title>
                <link>https://virgool.io/cheyab-blog/%D9%81%D8%B1%DB%8C%D9%84%D9%86%D8%B3%D8%B1-%D8%A8%D8%B4%D9%85-%DB%8C%D8%A7-%D8%AA%D9%88%DB%8C-%D8%B4%D8%B1%DA%A9%D8%AA-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%D9%85%D8%B4%D8%BA%D9%88%D9%84-%D8%A8%D8%B4%D9%85-%DB%8C%D8%A7-%D8%A7%D8%B3%D8%AA%D8%A7%D8%B1%D8%AA-%D8%A2%D9%BE-%D8%AE%D9%88%D8%AF%D9%85-%D8%A8%D8%B2%D9%86%D9%85-%D9%86%D8%B3%D8%AE%D9%87-%D8%B5%D9%88%D8%AA%DB%8C-i5ctkwnilgqd</link>
                <description>دقیقا راجب چی صحبت میکنیم ؟ انتخاب راه برنامه نویسیسللللام دوستان امیدوارم حال همتون خوب باشه ، دانیال هستم ، امروز میخوام راجب یه موضوع خیییلی مهم صحبت کنم ، میخوام بهت بگم بعد از اینکه برنامه نویسی یادگرفتی و کم کم تونستی پروژه بزنی ، چطوری باید به درآمد برسی .با هم دیگه سه راه اصلی بررسی میکنیم و سعی میکنیم بهینه ترین راه انتخاب کنیم .فرض کن ، بیش از چند وقتی هست برنامه نویسی کار میکنی ، با مفاهیم برنامه نویسی کاملا آشنا شدی و پروژه های متنوع زیادی درست کردی ، خب ، بعدش چیکار میکنی ؟؟ببین دوست من ، شما سه تا راه جلوته ، یکی اینکه  درخواست استخدام بفرستی به شرکت های معتبر دوم اینکه ، بخوایی خودت استارت آپی راه بندازی  سوم این که بخوایی فریلنسری کار کنی .توی این مقاله ، میخوام بهت بگم ، بعد از دوره یادگیری بهترین و بهینه ترین راه برای پیشترفت و کسب درآمد های خوب چیه ، من خودم هر سه این موارد امتحان کردم و الان که دارم باهات صحبت میکنم تجربیاتمو دارم بهت انتقال میدم ، پس اشتباهاتی که من کردم نکن و سعی کن راه درست بری .راه اندازی استارت آپ :http://localhost:8000/راه اندازی استارت آپ ، خیالی باطل در اول راهخیلی از افرادی که به تازگی وارد برنامه نویسی شدند ، شور و شوق زیادی برای راه اندازی استارت آپ دارند ، همه فکر میکنند قراره مثل دیجیکالا و اسنپ ایده استارت آپیشون بگیره ،  بعد از چند سالی هم مولتی میلیاردر بشن .خب این تصور کاملا اشتباهه ، راه اندازی استارت آپ که فقط برنامه نویسی نیست ، موارد حقوقی داره ، بحث خود تیم ، منسجم نگه داشتنشون و  مهمتر از همه بحث بازاریابی و فروش ، نحوه مدیریت صحیح ، نحوه قراردادنویسی ، جا و مکان و غیره .تو به عنوان برنامه نویس ، باید کم کم وارد این حوزه بشی ، باید با نحوه مدیریت تیم ، موارد حقوقی ، چالش ها و مشکلات کاملا آشنا بشی ، بعدش به استارت آپ فکر کنی ، علاوه بر اینها ، باید تا حدودی پشتوانه مالی هم داشته باشی تا بتونی به ایده های استارت آپیت جون بدی .شکست های استارت آپی من :شکست های استارت آپی من دو تجربه ناموفق توی استارت آپ ها داشتم ، اولیش ، یکی از بهترین وبسایت های املاک بود که حدود ۴ سال پیش با php خام نوشته شد و توی اون پروژه تقریبا من یه فریمورک شخصی ساختم برا خودم ، خیلی وقت گذاشتم ، پروژه بسیار قوی هم شد ، ولی اخرش هیچی نشد ، چون دید استارت آپی داشتم ولی دانش استارت آپی نداشتم ، تیم نداشتم ، پول نداشتم فقط برنامه نویسی بلد بودم .دومین مورد هم همین دو سال پیش بود ، که با چندتا از بچه ها یه شرکت راه انداختیم ، کلی ذوق و شوق داشتیم ، ما شرکت راه انداختیم ، حتی دانش بنیان هم شد ولی ، بازم به جایی نرسید چون دانش فنی داشتیم ، دانش استارت آپی نداشتیم .پس نتیجه میگیریم ، اگر اول کاری ، تا زمانی که تیم مناسب ، منابع مالی مناسب ، ایده خوب با طرح تجاری خوب و همچنین تجربه های مدیریتی نداری ، به هیچ وجه وارد استارت آپ نشو .کار فریلنسری :کار فریلنسری کار فریلنسری ، هم خوبی ها و هم چالش های زیادی داره ، توی کار فریلنسری نیازی نیست به رییس جواب پس بدی ، میتونی از هر جایی خواستی به راحت ترین شکل ممکن کار کنی و اگه خوب کار کنی درآمدت هم شاید دو تا سه برابر کار توی شرکت باشه ، علاوه بر همه این موارد ، اینم بگم که میتونی پروژه ها بر اساس میل خودت انجام بدی مثلا یه پروژه ای دوس نداری انجام ندی  .کنار این خوبی ها ، یه سری چالش هایی هم هست ، بزرگترین چالشت اینه که خودت باید مشتری جور کنی برا خودت ، امور حقوقی مثل قرار داد نویسی هم خودت باید انجام بدی، با مشتری خودت سر و کله بزنی و .... ، حالا چطوری باید واسه خودت پروژه جور کنی ؟ یا باید افراد و دوستان زیادی در زمینه برنامه نویسی داشته باشی ، دوستانی که بهت پروژه بدن ، یا باید برند بشی ، که همون بحث مربوط به برندینگ شخصی که کلی هم پست گذاشتم در موردش .پس همونطور که دیدی ، خیلی هم آسون نیست فریلنسری کار کردن و شاید برای تویی که یا حوصله برندینگ و ..... نداشته باشی ، اونم در اوایل کار که رزومه چندانی هم نداری خوب نباشه .کار در شرکت معتبر :اگر اول راه هستی ، ینی تازه برنامه نویسی یادگرفتی و چندین پروژه هم کارکردی و الان میخوایی علمت بیشتر کنی و درآمد و سابقه کاری هم داشته باشی بهترین گزینه ، شرکت های معتبر هستند ، حتی اگر نیاز به گذراندن دوره کارآموزی هم باشه .با ورود به یه شرکت معتبر روند پیشترفتت حداقل ۵ برابر میشه ، چرا ؟ چون اونجا برنامه نویس های خبره دیگه هم هستند ، که میتونن مشکلات ساختاری کد های تو ببینند و بهت بگن چطوری حلش کنی علاوه بر اینها ، توی شرکت های معتبر ، میتونی نحوه مدیریت ، نحوه قرارداد نویسی ، نحوه برخورد با مشتری ها ، نحوه گرفتن مشتری های خوب یاد بگیری و تازه بیمه و رزومه خوبی هم خواهی داشت .توی شرکت ، تنها وظیفه تو برنامه نویسی ، دیگه وقتت صرف ، مشتری پیدا کردن و چک و چونه زدن با مشتری نمیشه ، این کارها افراد دیگه برلت انجام میدن و تو فقط کاری میکنی که توش تخصص داری .بهترین راه از نظر من :بعد از چند سال با کوله باری از تجربه و چیزهایی که یادگرفتی میتونی یه تیم درست و حسابی  درست کنی ، و‌خودت برا خودت کار کنی و حالا اون اهداف استارت آپی اون موقع دنبال کنی .الان دیگه هر چیزی که برای موفقیت لازمه داری ، هم توانایی های فنی و هم توانایی های مدیریتی و البته احتمالا حداقل سرمایه هم برای راه اندازی کسب وکار شخصی خودت داری . از طرف دیگه با تولید محتواهای منظم برند و جایگاه خوبی بین برنامه نویس ها پیدا کردی پس ساخت تیم و همچنین پروژه گرفتن زیاد موضوع سختی نیست برات . من معتقدم این بهترین روش برای به کمال رسیدن یه برنامه نویس ، البته که این فقط یه نظر و طبیعتا صد در صد درست هم ممکنه نباشه ، به هر حال هر کسی یه تجربه ای داره . خب امیدوارم مطالبیو که گفتم بهش فکر کنید ، اگه سوالی چیزی داشتید حتما بپرسید ، و اینم بگم که این مطالبی گه گفتم همش بر اساس تجربست ، شما نباید اشتباهات یکی دیگه تکرار کنی .نسخه صوتی این نوشته در اینستاگرام من هست ، ، علاوه بر اون کلی مطلب با کیفیت آموزشی دیگه هم اونجا قرار دادم .@danial_sanaeeتا پست بعدی فعلا خداحافظ</description>
                <category>دانیال صناعی</category>
                <author>دانیال صناعی</author>
                <pubDate>Wed, 30 Jun 2021 12:18:07 +0430</pubDate>
            </item>
                    <item>
                <title>صفر تا صد مفهوم Api  ها + نسخه صوتی</title>
                <link>https://virgool.io/@danial_sanaee/%D8%B5%D9%81%D8%B1-%D8%AA%D8%A7-%D8%B5%D8%AF-%D9%85%D9%81%D9%87%D9%88%D9%85-api-%D9%87%D8%A7-%D9%86%D8%B3%D8%AE%D9%87-%D8%B5%D9%88%D8%AA%DB%8C-omd74s341o29</link>
                <description>صفر تا صد مفهوم Api به همراه مثال های کاربردی و نسخه صوتی سلام دوستای خوبم ، دانیال هستم ، توسعه دهنده وب ، امروز میخوام راجب Api ها صحبت کنم ، امروز یاد میگیریم Api چیه و چه مزایایی داره و چرا انقد مهمه ، توی این مسیر کلی مثال میزنم برات تا کاملا جا بیفته برات موضوع ، با من همراه باش .داستان Api از کجا شروع شد ؟قبلا که خبری از Api ها نبود ، هر برنامه ای داده های مربوط به خودش داشت ، ینی هیچ برنامه ای ، از داده های برنامه دیگه استفاده نمیکرد ، مثلا اگه میخواستی یه برنامه هواشناسی بنویسی ، باید اطلاعات مربوط به آب و هوای مناطق مختلف ، خودت یه جوری توی دیتابیست ذخیره میکردی ،  به خاطر همین اپلیکیشن ها خیلی خیلی ، محدود بودند و یه جورایی این موضوع جلوی ساخت برنامه های کاربردی گرفته بود ، داده ها دست ارگان ها و شرکت های بزرگ بود و توسعه دهندگان نمیتونستند از این داده های ارزشمند استفاده کنند .مثال میزنم برات ، مثلا توی بورس خودمون ، داده های بورسی ، مثل قیمت ها ، نمودار ها ، خبر ها و سایر موارد ، دست سازمان بورس کشور بود ، و دیگه خبری از اپلیکیشن های کارگزاری مثل آگاه و مفید نبود .خب حالا اگه کسی میخواست با استفاده از این داده ها نرم افزار هایی بسازه ، مثلا همین نرم افزار های آگاه و مفید ، یا سامانه های بررسی سهم های مختلف ، نمیتونست این کار انجام بده ، چون داده ای نداشت .این موضوع باعث شده بود دست توسعه دهنده ها بسته بشه و حتی ارگان های بزرگ اپل و مثلا هواشناسی آمریکا ، نتونند از اطلاعات هم دیگه استفاده کنند و برنامه های کاربردی تری بسازند ، چون اصولا داده نداشتند .مثلا همین نرم افزار آب و هوای رو گوشی های اپل ، فک میکنی چطوری نوشته شده ، خب یه سازمانی این اطلاعات به شکل ساختارمند به اپل داده و گرنه خود اپل که نرفته دماسنج بگیره دستش ، یا مثلا کارشناس آب و هوا داشته باشه ، حالا اگر این اطلاعات توسط این سازمان هواشناسی به اپل داده نمیشد ، ما هم نمیتونستیم بفهمیم هوا الان فلان جا چطوری  .خلاصه اینجوری شد که احساس نیاز گسترده به یه رابط شد تا بتونیم از اطلاعات و دیتاهای مختلف در برنامه های خودمون استفاده کنیم و بتونیم برنامه های خیلی پویا تر و قوی تری بنویسیم ، سریع تر کد زنی کنیم ، استاندارد کد زنی کنیم و‌ کلی مزیت دیگه که بهشون اشاره میکنیم در ادامه .مفهوم API با چند مثال کاربردی :فرض کن رفتی رستوران و الان میخوایی سفارش بدی ، حالا اون آقای گارسون ، میاد میگه چی میخواهی برایت بیارم ای مشتری عزیز !!تو هم لیست غذا ها و قیمتشون میبینی ، میگی من زرشک پلو با مرغ سوخاری میخوام ، این خانمه هم مثلا عدس پلو میخواد با سالاد شیرازی .گارسونه میگه به روی چشم ، میره اشپزخونه و بعد از ۱۵ دقیقه ، با دوتا غذای خوشمزه برمیگرده ، شما هم غذا میخورید و لذتشو میبرید .حالا این وسط ، این آقای گارسون ما میشه همون Api چون یه رابط بین شما و غذاهاتون بود ، اگه آقای گارسون نبود ، شما باید خودتون میرفتید آشپزخونه و خودتون غذای خودتون آماده میکردید و میخوردید .حالا یه مثال میخوام بزنم ، که بیشتر حالت برنامه نویسی داشته باشه .فرض کن میخوایی بری آلمان ، خب طبیعتا ، باید اول بلیط بگیری ، خب راه منطقیش اینه که وارد سایت های فروش بلیط ، مثل علی بابا یا فلایتو بشی ، ساعت و زمان انتخاب کنی و بلیط خودتو به شکل آنلاین بگیری .حالا به نظرتون ، این سایت ها از کجا میدونن که چه هواپیمایی ، کی پرواز داره و مقصدش کجاست ، چقدر جا داره و قیمت بلیط چنده ؟خب هر هواپیمایی ، متعلق به یه شرکت هواپیمایی ، و همه اطلاعاتی که گفتم ، توی دیتابیس های اون شرکت ثبت میشه  ، حالا یه شرکت ، یا سازمانی میاد ، دیتابیس همه این شرکت های هواپیمایی جمع میکنه و یه Api شسته رفته و خیلی تمیز ، تحویل این سایت های معروف خرید و فروش بلیط میده .اینجوری ، دیگه نیاز نیست ، برای خرید بلیط بریم فرودگاه ، میتونیم فیلتر هایی که میخواییم مثل بازه قیمتی ، زمان پرواز و‌غیره ،  خیلی سریع و در هر لحظه ممکن ،  اعمال کنیم بدون این که از کسی سوالی بپرسیم .اینجوری ، کارا خیلی سریع تر و بهینه تر جلو میره  ، و هم مشتری راضی هم شرکت های هواپیمایی میتونن مشتری های بیشتری پیدا کنند و‌بارو از روی کارمندانشون بردارند .پس فهمیدیم که کار Api دقیقا چیه و چقدر میتونه مفید باشه .حالا اگه بخواییم یه توضیح شسته رفته خوب برا api بگیم ، اینحوری باید بگیم که : ای پی ای یه رابطه ، و با استفاده از اون ، میتونیم از اطلاعات سایر برنامه ها ، استفاده کنیم ، در واقع هر وقت ما بخواییم ، از اطلاعات سایر برنامه ها ، توی برنامه خودمون ، استفاده کنیم ، باید از Api ها استفاده کنیم و از اون برنامه Api بگیریم ، مثل این تلگرام های غیر رسمی ، مثل این جی بی واتس آپ و هزاران برنامه دیگه که با استفاده از api ها کار میکنند . و هر وقت بخواییم اطلاعات و دیتا های برناممون ، به بقیه یا حتی نسخه های اندروید و آی او اس خودمون بدیم ، باید با استفاده از Api این کار انجام بدیم و برای برناممون Api بنویسیم .شناخته شده های Apiمیخوام شمارو با چند تا از شناخته شده ترین Api ها آشنا کنم تا بیشتر متوجه کاربرد api ها در زندگی خودمون بشیم و بفهمی چقدر مهمه این آقای api .گوگل مپ :گوگل مپ مغز متفکر این نرم افزار های مسیریابی ، مثل ویز یا در نسخه های ایرانی ، نشان و از این جور چیزا ، اطلاعات ترافیکی ، خیلی دقیق در اختیار توسعه دهنده میزاره ، حالا دیگه این که توسعه دهنده چطور بخواد ازش استفاده کنه بستگی به خودش دارهانواع بانک ها :این نرم افزار هایی مثل همراه بانک و بام و پیام رسان بله و .‌.. همشون از api استفاده میکنند تا اطلاعات از شما بگیرند .سازمان های بورسی :اطلاعات مربوط به سهام ها ، توسط این سازمان ها به صرافی ها داده میشه ، و ما بدون حضور در کارگزاری ها میتونیم توی این صرافی ها خرید و فروش کنیم ، سهام هامون تحلیل کنیم و ....شرکت های هواپیمایی :شرکت های هواپیمایی ، اطلاعات خودشون در اختیار ، نرم افزار های مانند علی بابا و ... میدن ، تا ما بتونیم از هر جایی ، هر وقت دلمون خواست بتونیم بلیط هواپیما تهیه کنیمحرف آخر :حضور api ها در سراسر زندگی ما احساس میشه و به نظر من بعد از اختراع چرخ ، این دومین چیزی بود که به بشریت برای راحتی بیشتر کمک کرد ، زندگی بدون Api ها خیلی سخت و طاقت فرسا میشه ، پس قدرشو بدونیم ، بسیاری از api ها مجانی هستند ، ولی بعضی از اون ها هم قیمت های بالایی دارند ، که بر اساس کار هایی که میخوایید با برنامتون انجام بدید میتونید سطح api خودتون انتخاب کنید .خیییلی ممنونم مه توی این چند دقیقه با من بودی ، لطفا اگه این مطلب برات مفید بود و فک میکنی برا بقیه هم میتونه مفید باشه به اشتراک بزازش ، با تشکر ، فعلا تا موضوع بدی ، خدا نگهدار . .راستی میتونی اینستام هم فالو کنی همین موضوع به صورت پادکست گذاشتم برات (@danial_Sanaee): </description>
                <category>دانیال صناعی</category>
                <author>دانیال صناعی</author>
                <pubDate>Sun, 27 Jun 2021 22:53:07 +0430</pubDate>
            </item>
                    <item>
                <title>زبان های سطح بالا و‌ سطح پایین و تفاوت آنها+نسخه صوتی</title>
                <link>https://virgool.io/@danial_sanaee/%D8%B2%D8%A8%D8%A7%D9%86-%D9%87%D8%A7%DB%8C-%D8%B3%D8%B7%D8%AD-%D8%A8%D8%A7%D9%84%D8%A7-%D9%88-%D8%B3%D8%B7%D8%AD-%D9%BE%D8%A7%DB%8C%DB%8C%D9%86-%D9%88-%D8%AA%D9%81%D8%A7%D9%88%D8%AA-%D8%A2%D9%86%D9%87%D8%A7%D9%86%D8%B3%D8%AE%D9%87-%D8%B5%D9%88%D8%AA%DB%8C-mmw4tfs7kjt5</link>
                <description> سلام دانیال هستم ، امیدوارم حالتون خیییلی خوب باشه ، امروز میخواییم با هم بیاییم ببینیم این زبان های سطح بالا و سطح پایین دقیقا چین ، هر کدومشون چه کاربردی داره و اصن چرا به وجود اومدن . سیر تکامل زبان های برنامه نویسی با هم برمیگردیم به سالها قبل ، زمانی که زبان های برنامه نویسی ، به اون شکلی که ما الان میشناسیم نبود ، اون موقع به زبان های برنامه نویسی به اصطلاح زبان ماشین گفته میشد .این زبان ها به طور کلی چیزی جز صفر و یک نبودند و مستقیما با سخت افزار ها ارتباط داشتند ، اصلا توسط انسان قابل درک نبودند و فقط ماشین ها میفهمیدنش . با گذشت زمان ، انسان ها به این نتیجه رسیدن که برای اینکه بتونند برنامه های بهتر و‌پر قدرت تری بسازن ، یادگیری و استفاده از زبان های برنامه نویسی باید خیلی ساده تر از اینا باشه و به زبان انسان ، نزدیک تر باشه، با این طرز تفکر ، زبان اسمبلی معرفی شد .زبانی که کاملا ماشینی نیست ولی خیلی هم انتظارات ما هم برآورده نمیکرد ، ینی یادگیری و استفادش در ابعاد گسترده ،  زیاد آسون نبود . زبان اسمبلی یه زبان سطح پایینه ، ینی  بیشتر به زبان ماشین نزدیکه و درکش توسط انسان خیلی راحت نیست و بیشتر برای برنامه نویسی سخت افزار هایی مثل رم استفاده میشه .  بعد از اون دوره ها ، کم کم زبان های برنامه نویسی توسعه پیدا کردند که به راحتی توسط انسان درک میشد ، به همین دلیل ، یادگیری و استفاده اون ها راحت تر بود همچنین توسعه این زبان ها هم راحت تر و سریعتر انجام میشد به این نوع زبان های برنامه نویسی ، زبان های سطح بالا میگفتند .سیر تکامل زبان های برنامه نویسینمودار زیر این سیر تکاملی خیلی قشنگ نشون میده ، همونطور که میبینید ، نسل اول زبان های برنامه نویسی ، همون زبان های صفر یکی بودند که کلا خیلی سخته کار کردن باشون .نسل دوم اسمبلی اومد و کار یکمی راحت تر کرد ولی بازم درکش توسط انسان خیلی راحت نبود و کار باهاشم خیلی سخت بود .نسل سوم و چهارم کار خیلی راحت تر کرد و الان تقریبا هر کدی که زده میشه با زبان های این نسل زده میشه زبان هایی مثل C#  و Java و C++و Php  و . . . از این نسل ها به حساب میان .توی نمودار بالا ، هر چقدر از کف به سمت بالا حرکت میکنیم ، زبان های برنامه نویسی بیشتر به سطح درک کاربر میرسند و همچنین بیشتر از سطح درک ماشین دور میشند . زبان های سطح بالا چه طوری کار میکنند ؟ تقریبا هر برنامه که ما مینویسیم با زبان های سطح بالا نوشته میشه ، چه برای گوشی های هوشمند و چه وبسایت ها و بازیها . ولی هر چی این زبان ها برای انسان ها قابل فهم تر میشن ، برای سیستم ما بیشتر گنگ میشند ، پس ما باید کاری کنیم که بتونیم یه زبان سطح بالا به زبان ماشین ( همون صفر و یک ) تبدیل کنیم ، تا سیستم ما بتونه اون برنامه درک و اجرا کنه  . برای این کار ما از کامپایلر ها استفاده میکنیم کامپایلر یه نوع مترجم و واسطه . مثلا فرض کن دونفر که زبون هم نمیفهمن میخوان با هم ارتباط برقرار کنند ، مسلما برای اینکار باید از مترجم استفاده کنند ، حالا اگه این دونفر دونوع زبان برنامه نویسی در نظر بگیریم اون مترجمه میشه کامپایلر . تفاوت زبان های سطح بالا و سطح پایین سرعت زبان های سطح پایین بیشتره ، چون دیگه نیازی به کامپایلر ندارند و مستقیما با سیستم در ارتباط هستند . اگه بخواییم با زبان های سطح پایین کار کنیم ، باید راجب سخت افزارمون هم اطلاعات داشته باشیم . درک زبان های سطح بالا خیلی راحت تره به همین دلیل میشه برنامه هایی پیچیده تر و حرفه ای تر و کاربردی تری ساخت باهاشون . خب دوستان امیدوارم لذت برده باشید ، مثل همیشه هر سوالی که داشتید میتونید زیر همین پست بپرسید ، به امید دیدار .</description>
                <category>دانیال صناعی</category>
                <author>دانیال صناعی</author>
                <pubDate>Mon, 21 Jun 2021 04:59:18 +0430</pubDate>
            </item>
                    <item>
                <title>برنامه نویس فول استک کیه ؟؟ فول استک بشیم یا نه ؟</title>
                <link>https://virgool.io/@danial_sanaee/%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3-%D9%81%D9%88%D9%84-%D8%A7%D8%B3%D8%AA%DA%A9-%DA%A9%DB%8C%D9%87-%D9%81%D9%88%D9%84-%D8%A7%D8%B3%D8%AA%DA%A9-%D8%A8%D8%B4%DB%8C%D9%85-%DB%8C%D8%A7-%D9%86%D9%87-ecmz8tjxbutc</link>
                <description>سلام دوستان ، امیدوارم حالتون خیلی خوب باشه ، امروز میخواییم با هم ببینیم برنامه نویس فول استک کیه و چطوری میتونیم به یه برنامه نویس فول استک تبدیل بشیم ؟ اول از همه اینو بگم فول استک بودن به معنی این نیست که طرف همه چیز بلد باشه ، ما برنامه نویس فول استک وب داریم ، برنامه نویس فول استک تلفن های همراه داریم ، برنامه نویس فول استک دسکتاپ هم داریم .پس وقتی از فول استک بودن حرف میزنیم ، باید پسوند دسته کاری هم به کار ببریم ، مثلا فول استک وب فول استک تلفن های همراه ، فول استک نرم افزار های دسکتاپ .حالا خود مفهوم فول استک بودن ینی چی ؟ببین در هر حوزه ای که باشی یه بخش طراحی رابط و تجربه کاربری داری ، یه بخش کدنویسی فرانت داری ،  یه بخش کد نویسی بک اند و دیتابیس داری . حالا در حالت عادی ، هر کدوم از این بخش ها نیازمند متخصص هستند ، ینی برای این سه بخش ، نیازمند سه متخصص داری که بتونه کار ها به بهترین شکل ممکن انجام بده .  خب این وسط کسی که مهارت خوبی از این سه دسته داشته باشه و بتونه به بهترین شکل کارش انجام بده میشه یه برنامه نویس فول استک ، ینی کسی که به همه مراحل ساخت یه نرم افزار اشراف خوبی داره .خب حالا سوال اینجاست که اصلا خوبه که فول استک باشیم یا نه ؟ من توی این تقریبا ۷ سالی که دارم کار میکنم ، میشه گفت به نوعی فول استک بودم و از طراحی رابط و تجربه کاربری تا کد زنی فرانت و بک اند خودم انجام میدادم ، فول استک بودن معایب و مزایایی خیلی زیادی داره که توی این پست خلاصه ای از اونا میگم بهتون .   مزایا :بسیاری از استارت آپ های نوپا و سازمان هایی که از نظر بودجه خیلی حساسن ، اقدام به استخدام برنامه نویسان فول استک میکنند تا هزینه کمتری پرداخت کنند پس بازار کار برای یه برنامه نویس فول استک بسیار بالاست .وقتی که برنامه نویس فول استک هستی ، دید درست و دقیقی به کل فرآیند ساخت و تچلید نرم افزار داری و میتونی مشکلات قبل از به وجود آمدنشون شناسایی کنی ، به خاطر همین هر جایی که بخوایی کار کنی مهره بسیار ارزشمندی به حساب میایی و به خاطر اینکه به کار اشراف کاملی داری میتونی خیلی راحت ترفیع درجه هم بگیری .اگه بخوایی خودت پروژه ای ران کنی ، حداقل در زمینه اجرا ، میتونی بدون کمک سایر افراد این کار انجام بدی و در کل اگه بخوایی تنهایی پروژه بگیری و کار کنی ( که اصلا توصیه نمیشه ) میتونه خیلی کمک کنه .حالا بریم سراغ معایبش :اول اینکه فول استک شدن اصلا آسون نیست ، اینو من با پوست و استخونم درک میکنم ، تکنولوژی ها دایما آپدیت میشن و با اونا تو هم باید آپدیت بشی ، و وقتی همزمان باید کار چند نفر انجام بدی این آپدیت شدنا خیلی میتونن برات دردسر درست کنند .دوم اینکه درسته که وقتی که فول استک باشی ، کار برات زیاده ، و کار دو سه نفر انجام میدی ولی حقوقی که میگیری ضربدر سه نمیشه ، حقوق بیشتری میگیری ولی نه سه برابر ، در بهترین حالت دو برابر حقوق میگیری .سوم اینکه ، کلا اگه تو یه زمینه خیلی حرفه ای بشی خیلی بهتر از اینکه فول استک باشی ، چون خیلی سریع تر میتونی موارد لازمه یادبگیری و طبیعتا خیلی بیشتر هم میتونی تمرین کنی و پروژه بگیری ، تغییرات و آپدیت ها کمتر اذیتت میکنه و تمرکز اصلیت میره روی پروژه ها .حالا اگه بخواییم فول استک وب بشیم ، چه مهارت هایی باید بلد باشیم ؟در زمینه طراحی رابط و تجربه کاربری : ببین ، فرض کن یه کارفرما ، میاد میگه من کسب و کارم تعمیر لوازم خانگی ، میخوام همه کارهام به شکل اینترنتی انجام بشه ، خب بعد اینجا باید دقیقا نیاز سنجی بشه که کاربر چی میخواد ، سیکل فرایند ها و داشبورد ها و .... همه به ریز ترین شکل ممکن طراحی بشه، بعدشم گرافیک سایت ، جوری که کاربر ازش لذت ببره طراحی بشه ، این کار ، کار طراح رابط کاربری سایته ولی وقتی شما یه برنامه نویس فول استکی ، این یکی از وظایفتونه .  در زمینه کد زنی بخش فرانت : بعد از اینکه رابط سایت کاملا طراحی شد ، باید این طرح ها به صفحات وب تبدیل کنی ، البته ینی همون رابطی که طراحی کردی ، کد زنی کنی ، برای اینکه این کارم بکنی علاوه بر Html ,Css,Js , Bootstrap , flexbox , باید با کتابخانه هایی نظیر React و Vue آشنایی کاملی داشته باشی .  در زمینه کد زنی بخش بک اند : یه فرم در نظر بگیر ، یه اطلاعاتی به سمت سرور ارسال میشه ، حالا اون اطلاعات باید پردازش بشه و در دیتابیس قرار بگیره ، این پردازش اطلاعات و کار با دیتابیس ها ، کار بک اند کاره که البته بازم چون شما فول استکی ، باید این کارها بتونی به خوبی انجام بدی . مهارت های این بخشم ، خیلی مهم هستن ، باید با یکی از زبان های برنامه نویسی سمت سرور مثلا Php یاNode یا پایتون یا Asp آشنایی کامل داشته باشی ، هر زبان سمت سروری که انتخاب کردی باید فریمورک مربوط به اونم خیلی دقیق و موشکافانه بلد باشی مثلا اگه Php کار میکنی بایدLaravel هم بلد باشی .  سایر موارد :به عنوان یه فول استک ، باید با نرم افزار های کنترل پروژه مثل Git آشنایی خوبی داشته باشی .همچنین باید بتونی نرم افزاری که میخوایی بسازی کاملا تحلیل کنی که این ینی با uml ها آشنایی خوبیداشته باشی .باید بتونی وبسایت جوری بسازی که از نظر امنیتی مشکلی براش پیش نیاد و در واقع به مباحث امنیتی هم اشراف داشته باشی .امروزه همه میخوان صفحه اول گوگل باشند ، یه بخشی از این خواسته ، منوط به استراتژی تولید محتوا ، یه بخشی هم مربوط به کیفیت ساخت سایته ، پس شما به عنوان توسعه دهنده فول استک وب ، باید با اصول سعو هم آشنایی داشته باشید .حرف آخر :     خب دوستان همونطور که دیدیم ، برای اینکه یه خودت بگی فول استک ، خیلی باید زحمت بکشی ، خیلی باید یادبگیری ، خیلی باید تمرین کنی و کلا به هیچ عنوان آسون نیست ، کسی میتونه به این درجه برسه که علاقه و پشتکار زیادی داشته باشه ، پس تو هم اگه میخوایی به این درجه برسی کار آسونی در پیش نداری ، ولی به نظر من به زحمتش میارزه .دوستان حتما صفحه اینستاگرام و لینکدین منو دنبال کنید ، اونجا کلی از این موارد آموزشی تحلیل گذاشتم ،  کافیه اسممو سرچ کنی ! </description>
                <category>دانیال صناعی</category>
                <author>دانیال صناعی</author>
                <pubDate>Thu, 17 Jun 2021 06:46:57 +0430</pubDate>
            </item>
                    <item>
                <title>چه طور وبسایتی با طراحی دلچسب داشته باشیم ؟</title>
                <link>https://virgool.io/@danial_sanaee/%DA%86%D9%87-%D8%B7%D9%88%D8%B1-%D9%88%D8%A8%D8%B3%D8%A7%DB%8C%D8%AA%DB%8C-%D8%A8%D8%A7-%D8%B7%D8%B1%D8%A7%D8%AD%DB%8C-%D8%AF%D9%84%DA%86%D8%B3%D8%A8-%D8%AF%D8%A7%D8%B4%D8%AA%D9%87-%D8%A8%D8%A7%D8%B4%DB%8C%D9%85-aep6r35gwiqf</link>
                <description>طراحی وبسایت ، اونقدری که میگن هم ساده نیست ، برای طراحی وبسایتی بینظیر باید به خیلی از موارد توجه کنیم ، تا در نهایت کاربر ما بتونه خیلی آسون و بی دردسر از وبسایتی که طراحی کردیم استفاده کنه و لذت ببره حالا اگه بخواییم به این هدف برسیم ، چه نکاتی باید رعایت کنیم ؟ چطوری وبسایتی طراحی کنیم که نظر هر بیننده ای جذب کنه ؟ توی این پست میخوام به 7 نکته مهم اشاره کنم که توی رسیدن به این هدف کمکت میکنه . کاربرتو بشناس و بدون چی میخواد قطعا طراحی دلچسب ، برای کاربری که ۱۵ سالشه ، با اونی که ۴۵ سالشه فرق میکنه ، قطعا طراحی خوب برای سایتی که موضوعش گیمه با سایتی که موضوعش سلامته خیلی فرق میکنه ، به عنوان طراحی وب عالی باید کاربر و نوع سایتی که میخوایی طراحب کنی بررسی کنی و بر اساس سلایق اون دسته از مخاطبان هدفت طراحیتو انجام بدی .بقیه نمونه های طراحی شده ببین فرض کن تصمیم گرفتی سایتی در زمینه املاک درست کنی ولی ایده خاصی نداری و نمیدونی چهارچوب باید چی باشه ، برای این که از این مرحاه به سلامت رد بشی ، کاری انجام بده که من انجام دادم ، ینی بیا ۱۰ تا ۲۰ تا از سایتایی که توی اون زمینه امتیاز های بالایی دارند بررسی کن تا ایده بیاد تو ذهنت ، این نکته خیلی مهمیه حواست باشه !!ساده طراحی کن و کار برای کاربرت آسون کن ببین ، کاربرات قطعا آدمای تنبلی هستند ، خیلی کاری به جزییات ندارند ، اونا برای هدفی وارد سایت تو شدن ، تو باید سایتت جوری طراحی کنی که بتونی در کمترین زمان ممکن نیازشون برطرف کنی ، و حواست به اینم باشه که خیلی سختی نکشند ، مثلا اگه قرار باشه برای ثبت نام ساده من آدرس خونم هم وارد کنم هیچوقت ثبت نام نمیکنم ، یا اگه قرار باشه من برای نوشتن این مقاله سه ساعت بخوام برم وردپرس نصب کنم ، احتمالش خیلی کمه اینکار بکنم از عکس های با کیفیت استفاده کن از عکس های پرمیوم و‌ با کیفیت عالی توی سایتت استفاده کن و معجزه ببین ، درک عکس برای کاربرا آسون تر و جذاب تره ، همونطور که ما وقتی بچه بدون کتاب به خاطر عکساش میخوندیم ، الانم کاربرا با دیدن عکس های با کیفیت میخکوب میشن و اینم بگم ، کلا عکس حس خیلی بیشتر منعکس میکنه .سرعت لود ببر بالا خدااا وکیلی ، خودت وارد سایتی میشی که بیشتر از یک دقیقه طول بکشه باز شه ؟ قطعا نمیشی ، سرعت سایت یکی از مهم ترین عوامل فرار کاربرا از سایته ، و اتفاقا برای گوگل هم خیلی مهمه ، با استفاده از تکنولوژی هایی مثل React , PWA ,  AMP ، فشرده سازی عکس ها و چندتا کار کوچیک دیگه ، میتونی سرعت بسیار بالایی به کاربرات هدیه کنی وبسایت کاملا رسپانسیو کن دنیا ، دنیای موبایله ، الان دیگه کمتر کسی تلفن همراه نداره ، تو به عنوان طراح خوب باید توجه بسیار ویژه ای به کاربرانی که با گوشی یا تبلت وارد میشن داشته باشی و وبسایتت براشون کاملا بهینه کنی ، در مرحله بالا تر میتونی نسخه PWA وبسایتت بسازی ، اینطوری کاربرات میتونن حتی در حالت آفلاینم توی گوشیشون وبسایتت ببیننمتون جذابی استفاده کنببین کاربرات وقتی وارد سایتت میشن ، باید فکر کنن وارد خونه دوستشون شدن ، اونا دوس ندارن با یه ربات و یه سری متونی که همه جا میبینن دست و پنجه نرم کنن ، فرض کن به جای  این که بگیم ، لطفا نظر خود را برای ما ارسال کنید ، بگیم : با عشق پذیرای نظرت هستم‌ .</description>
                <category>دانیال صناعی</category>
                <author>دانیال صناعی</author>
                <pubDate>Tue, 02 Mar 2021 19:17:45 +0330</pubDate>
            </item>
                    <item>
                <title>نقد و بررسی React Native در سال 2021</title>
                <link>https://virgool.io/@danial_sanaee/%D9%86%D9%82%D8%AF-%D9%88-%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C-react-native-%D8%AF%D8%B1-%D8%B3%D8%A7%D9%84-2021-qnn1xzmprb6m</link>
                <description>نقد بررسی ریکت نیتیو مقدمه همیشه آرزوی برنامه نویس ها این بوده که تکنولوژی ساخته بشه که بتونند فقط با یه بار کد زدن برنامه ای بنویسند که در همه پلتفرم ها ، مثل گوشی های اندروید و آی او اس ، وب و حتی برنامه های ویندوز قابل اجرا باشه و دیگه برای بقیه پلتفرم ها نخوان دوباره برنامه نویسی کنند . همچنین کسب و کار ها هم خیلی دوست دارن به جای استخدام چندین نفر برای طراحی اپ اندروید و آی او اس و همچنین وبسایت ، از تعداد افراد پایین تری استفاده کنند تا پول کمتری خرج کنند .فیسبوک که این نیاز درک کرد ، گفت آقا من میخوام این تکنولوژی بسازم ، خلاصه توی سال 2015 این تکنولوژی توسط فیسبوک ساخته شد و برنامه نویس ها و صاحبان کسب و کار به آرزوی خودشون رسوند . ریکت نیتیو چیه ؟ ریکت نیتیو در واقع یه فریمورک جاوا اسکریپته که باهاش میتونی اپلیکیشن های نیتیو اندروید و آی او اس همزمان بسازی ، این اپلیکیشن ها از نظر قدرت و عملکرد هیچ فرقی با اپ های معمولی ندارند و حتی گاها بهتر از اونا هم هستند .با React Native  یک “Mobile Web App” یا “Hybridapp”  نمی سازی ، با این شاهکار فیسبوک ، میتونی اپلیکیشن واقعی موبایل بسازی ، که از برنامه ساخته شده با Objective-c یا Java  که زبان های برنامه نویسی مربوط به آی او اس و اندروید هست ، قابل تشخیص نیست .استفاده از کتابخانه‌هایی مانند React Native for Web یا ReactXP به توسعه دهنده اجازه می‌ده تا یک برنامه کراس پلتفرم بسازد که در وب هم اجرا بشه حتی !!!ریکت نیتیو چه هدفی دنبال میکنه ؟ ریکت نیتیو دوس داره همه چیز در عین این که با کیفیت اجرا میشه ، سریع هم باشه ، دوست داره برنامه نویس ها یه برنامه فقط یه بار بسازند ، هم چنین اونایی که کسب و کاری هم دارند بتونند با برنامه نویس های کمتر کارشونو راه بندازن ، اینجوری ، دنیای اپلکیشن ها سریعتر و بیشتر رشد میکنه . همچنین با توجه به این که استفاده از موبایل بسیار بیشتر از لبتاب و سیستم های شخصی ، و با اقبال عمومی بیشتری مواجه ، تصمیم گرفته ، کار توسعه اپ های موبایل برای کسایی که قبلا فقط سایت طراحی میکردن راحت کنه . عملکرد ریکت نیتیو ؟ شاید بعضی ها بیان بگن هیچ چیز جای اپ های نیتیوی که کد زنی اختصاصی دارند نمیگیره ، تا حدودی این جمله درسته ، حتی با ریکت نیتیو هم نمیشه بعضی از قابلیت هایی که برخی برنامه ها دارند پیاده سازی کرد ولی اپلیکیشن هایی که با ریکت نیتیو نوشته میشه در مقایسه با نسخه های نیتیوی که با Java و یا Objected-c کدنویسی شده اند به هیچ وجه ضعف عملکردی مشاهده نمیشه و اتفاقا در خیلی از موارد بهتر هم هستند .چرا باید از ریکت نیتیو استفاده کنیم ؟ مولتی پلتفرم قابلیت بسیار عالی که و بییینظیری که ریکت نیتیو داره همین مولتی پلتفرم بودنشه ، ینی درواقع برای ساخت برنامه ای برای اندروید و ای او اس دیگه نیازی نیست دوباره کد بزنی و با یکبار کد زنی هم برای اندروید برنامه ساختی و هم آی او اس ، اینجوری دیگه نیازی نیست دوتا متخصص اندروید و ای او اس استخدام کنی . عملکرد عالیاکثر برنامه هایی که با ریکت نیتیو ساخته میشن از نظر عملکرد مشابه برنامه های معمولی و گاها حتی بهتر هم هستند . کامپوننت محور یکی از نکاتی که میتونی باعث افزایش محسوس سرعت کد زنیت بشه ، این ماژولار و کامپوننت محور بودنه ، همیشه میگن نیازی نیست چرخ از اول اختراع کنی ، توی دنیایی ریکت نیتیو همه چیز مثل پازل میمونه ، واسه اکثر مواردی که میخوایی توی برنامت پیاده سازی کنی پکیج هست که میتونی با یک خط کد اون پکیج به برنامت اضافه کنی ، اینجوری دیگه نیاز نیست ، همون کاری که اون پکیجه میکنه ، خودت کد بزنی . همچنین میتونی از هر قسمت برنامه ای که ساختی ، توی برنامه های دیگه استفاده کنی . توسعه سریع  ویژگی کامپوننت محور بودن ، کدنویسی همزمان برای هر دو پلتفرم و همچنین توسعه رابط کاربری با استفاده از Html  و Css باعث شده ، توسعه برنامه هایی که با این فریمورک ساخته میشن فوقالعاده سریع بشه . یادگیری آسون ریکت نیتیو یه کتابخونه جاوااسکریپتی و درواقع چیزی جز جاوااسکریچت نیست ، ظاهر اپلکیشن هایی که ساخته میشه هم با استفاده از HTML و Css ساخته میشند ، یعنی شما برای یادگیری ریکت نیتیو باید HTML , Css ,Javascript بلد باشید ، که یادگیری هر سه مورد بسایر آسونه ، حالا اگه بخوایی اپی که با ریکت نیتیو زدی با جاوا یا سویفت بزنی ، مدت زیادی باید برای یادگیری این زبان ها صرف کنی !!استفاده از سرویس های برنامه نویسی نیتیوشاید برا بعضیا سوال باشه ، اومدیم ما بخواییم برنامه ای بسازیم که نیاز به پکیجی داره که اون پکیج برای خود اندروید یا آی او اس هست ولی برای ، ریکت نیتیو نیست ، حالا باید چه کنیم ؟؟ریکت نیتیو چون خیلی باهوشه این مشکل پیش بینی کرده و گفته آقا شما ، بیا اون پکیجه دان کن و توی خود من استفاده کن ، هیچ مشکلی نیست ، اینطوری میتونی از زبان های Java و همچنین Swift  هم توی برنامه ریکت نیتیوتوت استفاده کنید . پشتیبانی قدرتمند ریکت نیتیو ، توسط غول اینترنتی ، یعنی فیس بوک ساخته شده ، از طرفی دنیا هم داره به سمت این نوع تکنولوژی ها میره ، روزانه بیش از ۲۵۰۰ کامیت گیت ، یعنی اقبال عمومی به این تکنولوژی روی خوش نشون دادع فیسبوک هم با پشتیبانی بینظیری که از این تکنولوژی میکنه میخواد جای پای خودش در این زمینه محکم کنه ، پس خیالتون از نظر پشتیبانی راحت باشه هیچ مشکلی نیست .هزینه پایین تر اینم که خیلی واضحه دیگه ، شما به جایی این که بیایی دوتا برنامه نویس اندروید و آی او اس استخدام کنی ماهی 20 میلیون به هر کدومشون بدی ، میایی برنامه نویس ریکت نیتیو با حقوق ماهیانه 15 میلیون استخدام میکنی ، تازه این شخص به جاوااسکریپت و HTML و Css  هم مسلطه . کیا از ریکت نیتیو استفاده میکنند ؟ برترین اپ های نوشته شده با ریکت نیتیو اینستاگرام جوالمارت ایر بی ان بی تسلا  فیسبوک آدیداسآینده ریکت نیتیو چیه ؟ برنامه نویس ها دنبال راحت تر کد زدن هستند ، کارفرما ها دنبال هزینه کمتر ، البته هر دو به دنبال کیفیت بالا هم هستند ، با ریکت نیتیو هر دو گروه درگیر ، نیازاشون برطرف میشه ، در حال حاضر همه کاری نمیشه با ریکت نیتیو انجام داد و توی این زمینه ،ریکت نیتیو ، عقب تر از جاوا و سویفت عمل میکنه ، با این وجود ،  با توجه به این که برنامه نویسان و کارفرما ها عاشق این تکنولوژی هستند و همچنین کمپانی بزرگ فیسبوک این پروژه جلو میبره ، آینده درخشانی در انتطار ریکت نیتیو پیش بینی میشه . معایب ریکت نیتیو چیه ؟جمع بندی کلی ؟ </description>
                <category>دانیال صناعی</category>
                <author>دانیال صناعی</author>
                <pubDate>Tue, 02 Mar 2021 04:44:28 +0330</pubDate>
            </item>
                    <item>
                <title>نقد و بررسی کامل وب اپلیکیشن های پیشرونده (PWA)</title>
                <link>https://virgool.io/@danial_sanaee/%D9%86%D9%82%D8%AF-%D9%88-%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C-%DA%A9%D8%A7%D9%85%D9%84-%D9%88%D8%A8-%D8%A7%D9%BE%D9%84%DB%8C%DA%A9%DB%8C%D8%B4%D9%86-%D9%87%D8%A7%DB%8C-%D9%BE%DB%8C%D8%B4%D8%B1%D9%88%D9%86%D8%AF%D9%87-pwa-dpgnsa0cfmm7</link>
                <description>وب اپلکیشن پیشرونده (PWA) چیه ؟به اپلکیشن هایی که هم قابلیت برنامه های نیتیو موبایل دارند ( تا حدودی ) و هم قابلیت برنامه های تحت وب  ( همون سایت ها )  وب اپلیکیشن های پیشرونده میگن که سال 2015 توسط گوگل معرفی شد . وب اپلیکیشن ها به ما حس و حال استفاده از اپ های نیتیو میدن ، ساختشون نسبت به اپ های موبایل هزینه کم تری داره و کاربران هم بیشتر دوست دارند ازش استفاده کنند .این برنامه ها با HTML , CSS و JavaScript  نوشته میشوند و مثل اپلیکیشن های موبایلی دیگه نیازی نیست Java و Objected c بلد باشی . هدف از به وجود اومدنش چیه ؟تا  قبلا از سال 2015 برنامه ها کلا دو نوع بودند که یکیشون برنامه های تحت وب بودن ، یکی دیگشون برنامه های موبایلی یعنی همون اندروید و آی او اس . هر دو نوع این برنامه ها ویژگی های مثبت خوبی داشتند و البته نقطه ضعف هایی هم داشتند که قابل چشم پوشی نبود برای اینکه دقیق تر بفهمی چرا باید از PWA استفاده کنی مزیت ها و معایب وب اپ و اپ های نیتیو باید بدونی : مزیت های وب اپ ها نسبت به اپ های نیتیو : میتونی از هر جای دنیا با هر وسیله ای ( موبایل ، لبتاب ، ساعت های هوشمند و . . . )  به وب اپلیکیشن ها دسترسی پیدا کنی خیلی راحت میتونی اون وبسایت به اشتراک بزاری به نصب چیزی نیازی نداری و همه چیز آمادست مزیت های اپ های نیتیو نسبت به وب اپ ها  :به منابع زیادی از سیستم دسترسی دارند ، به خاطر همین از نظر کارایی و امکاناتی که میتونند ارایه بدند یه سر و گردن از وب اپ ها بالاترند  راحتی بیشتری برای کاربراشون دارند دسترسی بهشون آسون تره و خیلی راحت میتونی دانلودشون کنی بدون اتصال اینترنت هم کار میکنند حالا این وسط ، گوگل میاد میگه ، بیا این دوتا یعنی برنامه های وب و برنامه های نیتیو ، با هم دیگه ترکیب کنیم تا هم بتونیم از امکانات برنامه های نیتیو استفاده کنیم و هم بتونیم امکانات بینظیر وب اپ ها را داشته باشیم ، این جوری شد که PWA درست شد . چرا باید از PWA استفاده کنیم ؟ میشه همه جا ازش استفاده کرد حس و حال کار کردن با اپلیکیشن های معمولی میدن از پروتکل HTTPS استفاده میکنند و به همین خاطر امنیت بالایی دارند خیلی سریع آپدیت میشن و نیازی نیست نسخه جدید از مارکت ها دانلود کنی قابل نصب هستند دقیقا مثل اپلیکیشن های معمولی به راحتی به اشتراک گذاشته میشنمیشه به صورت آفلاین ازش استفاده کرد هزینه و زمان ساخت بسیار کمتری نسبت به اپ معمولی ( نیتیو ) نیازه  میشه حتی در حالتی که کاربر اپ بسته براش Push Notification بفرستیم چه کمبود های داره ؟ آی او اس ازش ساپورت نمیکنه از باطری بیشتری استفاده میکنه به منابع سیستم دسترسی محدودی دارهچه طوری کار میکنه ؟ آیا جایگزین اپ نیتیو میشه ؟اگر اپلیکیشن خیلی پیچیده ای در نظر دارید ، که دایما با منابع و سرویس های سیستمی ، در ارتباطه ، فکر ساخت PWA از سرت خارج کن ، چرا ؟؟ چون اپلیکیشن PWA از منابع سیستمی مثل رم و پردازنده و . . . نمیتونه خیلی استفاده کنه و در واقع بر بستر موتور مرورگر شما پیاده سازی میشه . کاربرد این تکنولوژی بیشتر در سرویس هایی مثل همین ویرگول ، توییتر ، اینستاگرام ، لینکدین ، فیسبوک و در کل سرویس هایی که زیاد سنگین نباشند و توان پردازشی بالایی از سیستم انتظار نداشته باشند ، همچنین نیاز به استفاده و دسترسی های زیادی نداشته باشند . کی باید از PWA به جای اپ نیتیو استفاده کنیم ؟ بودجه بالایی نداری وقت کمی برای اجرای پروژه داری دیده شدن توی گوگل و سایر موتور های جستجو برات مهمه آپدیت های زیادی ارایه میکنی میخوایی برنامت توی همه پلتفرم ها اجرا بشه کی نباید از PWA به جای اپ نیتیو استفاده کنیم ؟ خیلی مهمه که توی استور ها قرار بگیره برنامت سرعت و روان بودن برنامه خیلی برات مهمه برنامت نیاز به منابع سخت افزاری متنوعی داره برنامت بخواد با سایر برنامه های دیگه سینگ بشهچه تکنولوژی هایی میتونند در کنار PWA شاهکار بسازند ؟ ReactJs : یه کتابخونه جاوااسکریپتی ، که برای ساخت رابط کاربری استفاده میشه Angular : یه فریمورک جاواسکریپتی کامل و جامع که برای ساخت رابط کاربری استفاده میشه AMP : تکنولوژی گوگل برای اینکه در اولین بازدید صفحه به سرعت باز بشه چند نمونه از اپلیکیشن های PWA معروف ؟ InstagramlinkedinGoogle MapsTwitter LitePinterest</description>
                <category>دانیال صناعی</category>
                <author>دانیال صناعی</author>
                <pubDate>Thu, 25 Feb 2021 17:41:10 +0330</pubDate>
            </item>
                    <item>
                <title>بررسی کامل React و دلایل استفاده از آن</title>
                <link>https://virgool.io/@danial_sanaee/%D9%86%D9%82%D8%AF-%D9%88-%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C-%DA%A9%D8%A7%D9%85%D9%84-%D8%B1%DB%8C%DA%A9%D8%AA-fiw5e69tzvd9</link>
                <description>ریکت اصن چیه ؟؟ اگه توسعه دهنده وب باشی ، میدونی که کار ساخت وبسایت به دو بخش Frontend و Backend تبدیل میشه ، حالا دوستامون که توی بخش Frontend کار میکنند ، با ظاهر سایت کار دارند و سعی دارند اونو به بهترین شکل ممکن پیاده سازی کنند طبیعتا این دوستامون باید متخصص HTML , CSS , JavaScript  باشند و این موارد از خودشون بهتر بشناسند ، ولی حتی وقتی اینا عالی بلد باشی ، ممکنه با چالش ها و مشکلات زیادی رو به رو بشی ، اتفاقی که برای خودم افتاد و واقعا دمار از روزگارم در اومد !!!حالا این وسط ، ریکت میگه ،  اگه بیایی از من استفاده کنی دیگه خیلی از اون چالش ها و مشکلات نداری ، نیازی نداری یه کد هزار بار بزنی ، نیازی نداری همه چیز از صفر کد بزنی و . . . پس در واقع ریکت ، یه کتابخونست از جنس جاوااسکریپت ، که برای ساخت رابط کاربری یا همون شکل شمایل سایت ازش استفاده میشه و طبق تجربیات من تو کارش حرف نداره !!! این پسر خوشگلمون سال 2011 از دل شرکت بزرگ Facebook بیرون اومد و توی بسیاری از پروژه ها و سایت های بزرگ ازش استفاده میشه با اینکه مدت زمان زیادی از به وجود اومدنش نمیگذره ، ولی خیلی خیلی محبوب شده و از دوستاش ینی Vue و Angular  طرفدارای بیشتری داره چرا باید از ریکت استفاده کنم ؟؟1- معماری ماژولار و کامپوننت محور توضیح معماری ماژولار ریکتیه پازل در نظر بگیر که مثلا 5 قسمت داره ، با کنار هم گذاشتن این 5 قسمت شما پازل تکمیل کردی ، حالا توی ریکت هر کدم از این قطعه های پازل بش میگن کامپوننت ، در واقع ساختار یه صفحه وبی که با ریکت طراحی میشه ، مجموعه ای از این کامپوننت هاست مثلا اون عکس بالایی که میبینی ، سمت راستش یه صفحه وبه ، سمت چپش کامپوننت هایی که اون صفحه تشکیل میدن دقیقا مثل پازل ، با کنار هم گذاشتن این کامپوننت ها اون صفحه وب اصلی ساخته میشه به این نوع معماری میگن معماری کامپوننت محور ، استفاده از این روش خیلی مزیت داره که در ادامه بهش اشاره شده ولی یکی از بزرگترین مزیت هایی که داره اینه که اگر مثلا جایی کامپوننت Header  کد زنی کردید ، میتونید هر جایی از پروژتون ازش استفاده کنید و دوباره مجبور نیستید همون کدا بزنید . 2- یه بار کد میزنی هزار جا استفاده میکنیبا استفاده از طراحی ماژولار و کامپوننت محور میتونیم هر بخشی که کد میزنیمو در قسمت های مختلف پروژمون یا حتی سایر پروژه های دیگمون استفاده کنیم و این مزیت خیلی خیلی بزرگی چون شما برای سایر قسمت های سایت و سایر پروژه های دیگه ، دوباره چرخ اختراع نمیکنید ، میتونی بدون وجود کوچکترین مشکلی نظیر تداخل کد ها ، به هم ریختگی قالب ، عمل نکردن توابع و سایر موارد دیگه کداتون هر جایی دیگه دوست داشتید اضافه کنید . به مرور زمان ، هر چی جلو تر میری و پروژه های بیشتری برمیداری ، کامپوننت های بیشتری هم داری ، و خیلی سریع تر میتونی اون استایلی که دوست داری کپی کنی و بدون مشکل توی پروژه جدیدت استفاده کنید 3- هر چیزی از صفر کد نمیزنی و هزاران پکیج حرفه ای داره ریپازیتوری Npm برای دانلود پکیج های Reactفرض کن داری فرمی طراحی میکنی که باید به سمت سرور ارسال بشه و پردازش بشه ، این فرم پر از سلکت باکس ها ، ادیتور های متن ، آپلودر ها و سایر موارد دیگست  خب بدون شک اگر بخواییم خودمون همه این موارد طراحی کنیم هم زمان بسیار زیادی طول میکشه ، هم ممکنه حرفه ای و ماژولار نشه و نتونیم جاهای دیگه به خوبی ازش استفاده کنیم و خیلی مشکل دیگه این وسط ممکنه پیش بیاد از طرفی اگر هم بیاییم و از کد های آماده استفاده کنیم مشکلات فرآوانی داره ، عدم سازگاری ، عدم اعتبار مرجع ، کیفیت پایین کد ، فقط بخش کوچیکی از این موارد هستن برای حل این مشکلات ، ما میاییم از پکیج های ریکت استفاده میکنیم ، تقریبا برای هر کاری که بخوایید انجام بدید ، پکیج هایی موجوده که توسط افراد و تیم های مختلف کد زنی شده اند و میتونید فقط با یک دستور اونا نصب کنید و ازشون استفاده کنید این پکیج ها معمولا جامع و کامل هستند و همه نیاز هات توی اون زمینه ای که میخوایی برآورده میکنه ، همچنین هر جاییشو خواستی میتونی به راحتی ادیت کنی و شخصی سازیش کنی 4- حجم کدی که میزنی خیلی کم میشه خیلی واضحه با توجه به ساختار ماژولار ، وجود پکیج های بینظیر و حرفه ای و همچنین قابلیت Vertical DOM حجم کدهایی که میزنی خیلی خیلی کم میشه و همین عامل باعث میشه بتونی راحت تر پروژت مدیریت کنی ، خطا ها راحت تر پیدا کنی و کارهات سریع تر انجام بدی 5- میتونی خیلی راحت کدات تست کنی کتابخانه react در زمینه تست پذیری بسیار عملکرد مناسبی داشته و فرد استفاده کنند این امکان را خواهد داشت تا کامپوننت ها و توابع خود را به آسانی با پارامتر ها و خروجی های مورد نظرش چک نماید و در بحث دقت و زمان صرفه جویی بسیار مناسبی را ایجاد کند. همچنین عملکرد کتابخانه ری اکت در مقایسه با انواع مختلف دیگر کتابخانه‌ها و فریم ورک هایی که در جاوا اسکریپت موجود هستند بسیار عملکرد بهتری را ارائه می نماید.7- سرعت بسیار زیاد و دقیقا مثل اپلکیشن ها وقتی کاربرات با اپلکیشن تحت وبی که با ریکت درست کردی کار کنن ، دیگه زمانی برای لود صفحات منتظر نمیمونند ، همه چیز خیلی سریع و دقیقا شبیه اپلکیشن های نیتیوی و یا برنامه های ویندوزی 8- ساخت وب اپلکیشن ها اکثر وب اپلکیشن ها با استفاده از React پیاده سازی میشوند ، ترکیب React و PWA برای ساخت وب اپلکیشن های تک صفحه ای حرفه ای ،  غوغا میکنه9- ساخت اپلکیشن های اندروید و آی او اس به شکل موازی فرض کن پروژه ای گرفتی که کارفرما میخواد علاوه بر وبسایت ، وب اپ و اپ های موبایل برای اندروید و آی او اس هم ساخته بشه ، اگر بخوایی عادی کد بزنی باید به صورت متوالی سه بار به ترتیب وبسایت و وب اپ ، اندروید و آی او اس کد بزنی . بنده به شخصه عده محدودی میشناسم که توانایی پیاده سازی سه پلتفرم داشته باشند ، معمولا یا وب کار میکنند یا اندروید یا آی او اس پس اگر همچین پروژه به پستتون خورد به احتمال زیاد از دستش میدید .مورد بعدی این که وقتی که شما برای طراحی سه پلتفرم صرف میکنید بسیار زیاده و ممکنه به قیمت پیشنهادی نصرفه در این صورت هم پروژه از دست خواهید داد . در صورتی که اگر بیاید از React Native  استفاده کنید در واقع هر سه پلتفرم به شکل موازی پیش میروند ، پس شما اون دو مشکل بالا نخواهید داشت 10 - یادگیریش آسونه و داکیومنت بینظیری داره  این گزینه به عنوان یک ویژگی مثبت برای کتابخانه ری اکت به حساب می‌آید چرا که کتابخانه و فریم ورک های دیگری مانند Angular و Vue پیچیده بوده و یادگیری آنها نیز کاری کمی سخته اینم بگم ، درسته یادگیری React  آسونه ولی حتما حتما باید پیشنیازهاشو کامل یادبگیری و درک کنی مخصوصا جاوااسکریپت خیلی عمیق و مفهومی باید یادبگیری در غیر این صورت مطمعن باش React خوب یاد نمیگیری و درک نمیکنی پیش نیاز یادگیری ریکت چیه ؟ HtmlCSSJavaScriptآینده ریکت ؟ دنیای برنامه نویسی داره به سمت سادگی میره ، هم برای توسعه دهنده ها و هم برای استفاده کننده ها ، اگر تکنولوژی باشه که بتونه بمون کمک کنه ، با یکبار کد زنی ، برنامه های اندروید و آی او اس ، سایت ، وب اپلکیشن با قدرت خوب بسازیم ، به شدت استقبال میشه ، همین طور که تا الان شده ، هم از طرف مردم ، هم از طرف مارکت های بزرگ ، بدون شک با برطرف کردن برخی مشکلات جزیی ،  در آینده نزدیک دنیای برنامه نویسی ، استفاده گسترده از این نوع تکنولوژی ها که گل سرسبدشون ریکته ، روی میاره !!!چه پروژه هایی که با React پیاده سازی شدن ؟ DropBoxInstagram PayPalCloudflareAirbnbNetflix</description>
                <category>دانیال صناعی</category>
                <author>دانیال صناعی</author>
                <pubDate>Thu, 25 Feb 2021 00:42:43 +0330</pubDate>
            </item>
            </channel>
</rss>