<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های احسان رضایی</title>
        <link>https://virgool.io/feed/@developit</link>
        <description>#ISTJ / Backend Developer / Gopher / PHP(Yii2, Laravel) / [ http://www.developit.ir ]</description>
        <language>fa</language>
        <pubDate>2026-06-16 13:53:00</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/77929/avatar/Jv3jt4.png?height=120&amp;width=120</url>
            <title>احسان رضایی</title>
            <link>https://virgool.io/@developit</link>
        </image>

                    <item>
                <title>معرفی کتاب refactoring (ریفکتورینگ)</title>
                <link>https://virgool.io/@developit/%D9%85%D8%B9%D8%B1%D9%81%DB%8C-%DA%A9%D8%AA%D8%A7%D8%A8-refactoring-%D8%B1%DB%8C%D9%81%DA%A9%D8%AA%D9%88%D8%B1%DB%8C%D9%86%DA%AF-hqxuab6q7o1g</link>
                <description>ریفکتورینگ مجموعه‌ای از تکنیک‌هاست که به منظور اصلاح و بهبود کدهای قبلی بدون تغییر در عملکرد و رفتارشان جهت خوانایی، کارامدی و قابلیت نگهداری بیشتر انجام می‌شود.در کتاب Refactoring اثر Martin Fowler نوشته شده: refactoring تکنیک مرتب/منظم سازی برای تجدید ساختار کد موجود است. تغییر ساختار داخلی کد بدون تغییر رفتار خارجی آن.مطالعه کتاب</description>
                <category>احسان رضایی</category>
                <author>احسان رضایی</author>
                <pubDate>Mon, 08 Nov 2021 16:26:50 +0330</pubDate>
            </item>
                    <item>
                <title>دیزاین پترن،‌ الگوی طراحی Builder</title>
                <link>https://virgool.io/coderlife/%D8%AF%DB%8C%D8%B2%D8%A7%DB%8C%D9%86-%D9%BE%D8%AA%D8%B1%D9%86-%D8%A7%D9%84%DA%AF%D9%88%DB%8C-%D8%B7%D8%B1%D8%A7%D8%AD%DB%8C-builder-eebncfnqqnjo</link>
                <description>http://www.developit.ir/design-patternsمثال در دنیای واقعیتصور کنید در فست فود یک غذای ویژه را سفارش می‌دهید. میگویید پیشنهاد سرآشپز! و آن‌ها بدون هیچ سؤالی سفارش شما را انجام و تحویل می‌دهند. این یک مثال از simple factory بود. اما مواردی وجود دارد که برای instantiation مراحل بیشتری نیاز داریم.مثلاً برای سفارش همبرگر چه نوع نانی را می‌خواهید؟ چه سس و یا پنیری و… در چنین مواردی builder به کمک ما می‌آید.تعریف instantiationبه ایجاد یک نمونه از یک شئ/کلاس گفته می‌شود.var manager = new Manager();به بیان سادهبه شما این اماکن را می‌دهد تا ضمن جلوگیری از کثیف کردن constructor، انواع مختلفی از یک شئ را ایجاد کنید. دقیقاً منظورمان چیست؟ همه ما تابع سازنده ای مثل این نمونه را دیده ایم(یک نمونه کثیف).public function __construct($size, $cheese = true, $pepperoni = true, $tomato = false, $lettuce = true)همانطور که میبینید پارامتر های تابع زیاد و ممکن است تعداد آن از دست برنامه نویس خارج شود و یا اینکه ترتیب چیدمان آن را فراموش کند. همچنین ممکن است به دلیل توسعه، لیست پارمتر ها افزایش یابد. اصطلاحاً به این موضوع telescoping constructor anti-pattern میگویند.مثال برنامه نویسیجایگزین مناسب استفاده از الگوی builder است. در ابتدا میخواهیم همبرگر خود را درست کنیم.class Burger
{
    protected $size;
    protected $cheese = false;
    protected $pepperoni = false;
    protected $lettuce = false;
    protected $tomato = false;
    protected $tomato = false;

    public function __construct(BurgerBuilder $builder)
    {
        $this-&gt;size = $builder-&gt;size;
        $this-&gt;cheese = $builder-&gt;cheese;
        $this-&gt;pepperoni = $builder-&gt;pepperoni;
        $this-&gt;lettuce = $builder-&gt;lettuce;
        $this-&gt;tomato = $builder-&gt;tomato;
    }
}و سپس builder همبرگر را می‌نویسیم.class BurgerBuilder
{
    public $size;
    public $cheese = false;
    public $pepperoni = false;
    public $lettuce = false;
    public $tomato = false;

    public function __construct(int $size)
    {
        $this-&gt;size = $size;
    }

    public function addPepperoni()
    {
        $this-&gt;pepperoni = true;
        return $this;
    }

    public function addLettuce()
    {
        $this-&gt;lettuce = true;
        return $this;
    }

    public function addCheese()
    {
        $this-&gt;cheese = true;
        return $this;
    }

    public function addTomato()
    {
        $this-&gt;tomato = true;
        return $this;
    }

    public function build(): Burger
    {
        return new Burger($this);
    }
}و استفاده$burger = (new BurgerBuilder(14))
    -&gt;addPepperoni()
    -&gt;addLettuce()
    -&gt;addTomato()
    -&gt;build();قابلیت استفاده.- برای حل مشکل telescopic constructor.- هنگامی که از یک شئ انواع مختلفی ساخته می‌شود. تفاوت آن با الگوی factory ایجاد اشیاء در چندین گام/مرحله است.مطالعه رایگان و خرید کتاب</description>
                <category>احسان رضایی</category>
                <author>احسان رضایی</author>
                <pubDate>Mon, 27 Apr 2020 16:54:29 +0430</pubDate>
            </item>
                    <item>
                <title>دیزاین پترن،‌ الگوی طراحی Strategy</title>
                <link>https://virgool.io/@developit/%D8%AF%DB%8C%D8%B2%D8%A7%DB%8C%D9%86-%D9%BE%D8%AA%D8%B1%D9%86-%D8%A7%D9%84%DA%AF%D9%88%DB%8C-%D8%B7%D8%B1%D8%A7%D8%AD%DB%8C-strategy-hqwxv1wup1wl</link>
                <description>http://www.developit.ir/design-patternsمثال در دنیای واقعیمرتب سازی data را در نظر بگیرید. ابتدا از مرتب سازی bubble sort استفاده می‌کنیم اما با افزایش آیتم ها این الگوریتم خیلی کند می‌شود. quick sort را جایگرین آن می‌کنیم. هر چند عمل‌کرد بهتری با مجموعه داده‌های بزرگ دارد، اما برای مجموعه داده‌های کوچک‌تر بسیار کند است. به این منظور یک استراتژی برای پیاده‌سازی در نظر می‌گیریم. روی مجموعه داده‌های کوچک bubble sort انجام شود و برای بزرگ‌تر ها quick sort.به بیان سادهالگوی strategy این امکان را می‌دهد تا الگوریتم ها بر اساس موقعیت و شرایط متفاوت تغییر کنند.در این الگو خانواده‌ای از الگوریتم ها را تعریف می‌کنیم و هر یک را در کلاس جداگانه و مستقل قرار می‌دهیم تا قابل انتخاب یا تعویض باشند.در ویکی پدیا گفته شدهالگوی strategy قابلیت انتخاب یک الگوریتم در زمان اجرا را ممکن می‌سازد. این الگو:- یک خانواده از الگوریتم‌ها را معرفی می‌کند- هر الگوریتم را کپسوله می‌کند- و باعث می‌شود الگوریتم‌های آن خانواده به‌طور قابل تعویض قابل استفاده باشند.الگوی strategy یکی از الگوهای موجود در کتاب مشهور الگوهای طراحی است که توسط گاما و دیگران نوشته شده‌است و مفهوم استفاده از الگوهای طراحی برای توصیف نحوه طراحی انعطاف‌پذیر و قابل استفاده مجدد شئ گرا در نرم‌افزار را محبوب ساخت.مثال برنامه نویسیمثال همین قسمت را انجام می‌دهیم. ابتدا ما یک interface از strategy و strategy های متفاوت جستجو را پیاده‌سازی می‌کنیم.interface SortStrategy
{
    public function sort(array $dataset): array;
}

class BubbleSortStrategy implements SortStrategy
{
    public function sort(array $dataset): array
    {
        echo &amp;quotSorting using bubble sort&quot;
        // Do sorting
        return $dataset;
    }
}

class QuickSortStrategy implements SortStrategy
{
    public function sort(array $dataset): array
    {
        echo &amp;quotSorting using quick sort&quot;
        // Do sorting
        return $dataset;
    }
}سپس کلاس مرتب سازی که می‌تواند از strategy های جستجو استفاده کند.class Sorter
{
    protected $sorter;

    public function __construct(SortStrategy $sorter)
    {
        $this-&gt;sorter = $sorter;
    }

    public function sort(array $dataset): array
    {
        return $this-&gt;sorter-&gt;sort($dataset);
    }
}و استفاده$dataset = [1, 5, 4, 3, 2, 8];

$sorter = new Sorter(new BubbleSortStrategy());
$sorter-&gt;sort($dataset); // Output : Sorting using bubble sort

$sorter = new Sorter(new QuickSortStrategy());
$sorter-&gt;sort($dataset); // Output : Sorting using quick sortقابلیت استفاده.زمانی که کلاس‌های مشابهی دارید که فقط در رفتارهایشان متفاوت هستند.میتوان با استفاده از این الگو منطق تجاری یک کلاس را از جزئیات اجرای آن جدا کرد. به شرطی که این جزئیات برای آن منطق مهم نباشد.و یا هنگامی که کلاس شما برای اجرای الگوریتم ها به شروط متفاوتی بستگی دارد.مطالعه رایگان و خرید کتاب</description>
                <category>احسان رضایی</category>
                <author>احسان رضایی</author>
                <pubDate>Sun, 26 Apr 2020 22:04:28 +0430</pubDate>
            </item>
                    <item>
                <title>دیزاین پترن،‌ الگوی طراحی Adapter</title>
                <link>https://virgool.io/@developit/%D8%AF%DB%8C%D8%B2%D8%A7%DB%8C%D9%86-%D9%BE%D8%AA%D8%B1%D9%86-%D8%A7%D9%84%DA%AF%D9%88%DB%8C-%D8%B7%D8%B1%D8%A7%D8%AD%DB%8C-adapter-k7aos03yd9lq</link>
                <description>http://www.developit.ir/design-patternsمثال در دنیای واقعیتبدیل شارژر تلفن همراه را در نظر بگیرید. یک شارژر با پایه سه شاخه که در جعبه تلفن همراه موجود است را نمی‌توانید به پریز دو شاخه منزل وصل کنید. نیاز به پایه تبدیل دارید تا این دو را با هم سازگار کند. این وسیله تبدیل یک adapter است.به بیان سادهبه اشیاء با رابط های ناسازگار امکان همکاری می‌دهد.این الگو، یک شئ غیر سازگار را در یک adapter برای سازگاری با سایر کلاس‌ها پنهان می‌کند. adapter این اجازه را می‌دهد که دو یا چند شئ ناسازگار با هم ارتباط یا تعامل برقرار کنند.معمولاً با این هدف مورد استفاده قرار می گیرد که بدون تغییر در کد اصلی، بتوان استفاده از کلاس های فعلی را مقدور ساخت.مثال برنامه نویسیبازی شکارچی شیر را در نظر بگیرید. ابتدا یک interface از شیر داریم که با استفاده از آن انواع شیر ها(با نژاد های مختلف) را پیاده‌سازی می‌کنیم.interface Lion
{
    public function roar();
}

class AfricanLion implements Lion
{
    public function roar()
    {
    }
}

class AsianLion implements Lion
{
    public function roar()
    {
    }
}و شکارچی که البته برایش فرقی نمی‌کند کدام نژاد از شیر را شکار خواهد کرد. او برای شکار به دنبال صدای غرش شیر است.class Hunter
{
    public function hunt(Lion $lion)
    {
        $lion-&gt;roar();
    }
}حالا بیایید سگ‌های وحشی را هم اضافه کنیم تا شکارچی بتواند آن‌ها را هم شکار کند. اما یک مشکل داریم. سگ مانند شیر غرش نمی‌کند، پارس می‌کند و در فضای برنامه نویسی یعنی سگ interface متفاوتی دارد. اینجا برای سازگاری سگ و شیر از adapter استفاده می‌کنیم.// This needs to be added to the game
class WildDog
{
    public function bark()
    {
    }
}

// Adapter around wild dog to make it compatible with our game
class WildDogAdapter implements Lion
{
    protected $dog;

    public function __construct(WildDog $dog)
    {
        $this-&gt;dog = $dog;
    }

    public function roar()
    {
        $this-&gt;dog-&gt;bark();
    }
}بدین صورت ناسازگاری کلاس سگ‌های وحشی را(متد پارس سگ) درAdapter پنهان کردیم تا سایر مولفه های مرتبط بدون مشکل کار خود را انجام دهند.$wildDog = new WildDog();
$wildDogAdapter = new WildDogAdapter($wildDog);
$hunter = new Hunter();
$hunter-&gt;hunt($wildDogAdapter);قابلیت استفاده.برای استفاده از کلاس‌هایی که دارای روابط ناسازگار هستند یا functionality مشترکی با هم ندارند.مطالعه رایگان و خرید کتاب</description>
                <category>احسان رضایی</category>
                <author>احسان رضایی</author>
                <pubDate>Sun, 26 Apr 2020 10:34:51 +0430</pubDate>
            </item>
                    <item>
                <title>شروع کار جاب ترند، تجزیه و تحلیل هوشمند آگهی و نیازمندی های بازار کار در سطح اینترنت.</title>
                <link>https://virgool.io/@developit/%D8%B4%D8%B1%D9%88%D8%B9-%DA%A9%D8%A7%D8%B1-%D8%AC%D8%A7%D8%A8-%D8%AA%D8%B1%D9%86%D8%AF-%D8%AA%D8%AC%D8%B2%DB%8C%D9%87-%D9%88-%D8%AA%D8%AD%D9%84%DB%8C%D9%84-%D9%87%D9%88%D8%B4%D9%85%D9%86%D8%AF-%D8%A2%DA%AF%D9%87%DB%8C-%D9%88-%D9%86%DB%8C%D8%A7%D8%B2%D9%85%D9%86%D8%AF%DB%8C-%D9%87%D8%A7%DB%8C-%D8%A8%D8%A7%D8%B2%D8%A7%D8%B1-%DA%A9%D8%A7%D8%B1-%D8%AF%D8%B1-%D8%B3%D8%B7%D8%AD-%D8%A7%DB%8C%D9%86%D8%AA%D8%B1%D9%86%D8%AA-uauzrvkwyp82</link>
                <description>http://job-trends.developit.ir/به طور خیلی غیر رسمی و یهویی شروع کار جاب ترندُ اعلام میکنم :)جاب ترند به کمک ابزار های هوش مصنوعی(فعلا تا 70 درصد خودکار) آگهی و نیازمندی های بازار کارُ در اینترنت تجزیه و تحلیل میکنه و گزارش میده. در حال حاضر بخش های اولیه و عمومی پروژه قابل استفاده است تا به مرور زمان ویژگی های بیشتریُ به اون اضافه کنم. ویژگی های در حال انجام &quot;مقایسه محبوبیت برچسب ها، گزارش شهر هایی که بیشتر به تخصصتون نیاز دارن و همچنین گراف برچسب های مرتبط هست&quot;. ازتون ممنون میشم اگر پیشنهادی دارین مطرح و مهمتر اینکه جاب ترندُ به دوستان و آشنایانتون معرفی کنید.همچنین میتونید جاب ترندُ در شبکه های اجتماعی دنبال و گزارش های اختصاصی که اونجا منتشر میشه رو ببینید.اینستاگرام و توییتر:https://www.instagram.com/jobtrendshttps://twitter.com/ir_jobtrendsگزارش های اولیه هم اختصاصی و مربوط به تخصص خودمونه :دی</description>
                <category>احسان رضایی</category>
                <author>احسان رضایی</author>
                <pubDate>Tue, 03 Dec 2019 16:20:45 +0330</pubDate>
            </item>
                    <item>
                <title>Hashids، تولید یک شناسه منحصر به فرد از اعداد صحیح</title>
                <link>https://virgool.io/@developit/hashids-%D8%AA%D9%88%D9%84%DB%8C%D8%AF-%DB%8C%DA%A9-%D8%B4%D9%86%D8%A7%D8%B3%D9%87-%D9%85%D9%86%D8%AD%D8%B5%D8%B1-%D8%A8%D9%87-%D9%81%D8%B1%D8%AF-%D8%A7%D8%B2-%D8%A7%D8%B9%D8%AF%D8%A7%D8%AF-%D8%B5%D8%AD%DB%8C%D8%AD-sued6xprgwrr</link>
                <description>یه کتابخانه متن باز و کوچیکه که شناسه هایی کوتاه، منحصر به فرد و غیر متوالی از اعداد تولید میکنه.به عنوان مثال عدد 347 تبدیل به رشته ی “yr8” یا آرایه ای شامل اعداد [27, 986] تبدیل به “3kTMd” میشه.شما همچنین میتونید شناسه ها رو decode کنید، یعنی رشته های تولید شده به وسیله Hashids برگشت پذیر خواهند بود. حتی طول رشته تولید شده قابل تعریفه.مثالی که توی وب شاید بارها دیدین:https://url.ir/lqY9Xقابلیت ها.ایجاد شناسه های کوتاه، منحصر به فرد و قابل بازگشت از اعداد مثبت و صفر.سفارشی سازی با استفاده از salt.طول رشته تولید شده افزایشی هست. قبلا گفتم میتونید طول Hash رو تعریف کنید اما این موضوع بستگی به اعداد شما و salt هم داره و ممکنه به این دو علت و ماندگاری Hash زیادتر بشه.حجم کمی داره(حدود 350 خط کد)، سریع هست و به کتابخانه دیگری وابستگی نداره.این کتابخانه در JavaScript, Ruby, Python, Java, Scala, PHP, Perl, Perl 6, Swift, Clojure, Objective-C, C, C++11, D, F#, Go, Erlang, Lua, Haskell, OCaml, Elixir, Rust, Smalltalk, ColdFusion, Kotlin, Nim, VBA, Haxe, Crystal, Elm, ActionScript, Bash, R, TSQL, PostgreSQL, PLpgSQL, Dart, Io  و .NET قابل استفاده است.python version.hashids = Hashids(salt=&amp;quotthis is my salt&amp;quot)
id = hashids.encode(1, 2, 3)
numbers = hashids.decode(id)php version.$hashids = new Hashids\Hashids(&#039;this is my salt&#039;);
$id = $hashids-&gt;encode(1, 2, 3);
$numbers = $hashids-&gt;decode($id);javascript version.var hashids = new Hashids(&amp;quotthis is my salt&amp;quot),
id = hashids.encode(1, 2, 3),
numbers = hashids.decode(id);وبلاگ من اینجاست...</description>
                <category>احسان رضایی</category>
                <author>احسان رضایی</author>
                <pubDate>Tue, 12 Nov 2019 21:04:11 +0330</pubDate>
            </item>
                    <item>
                <title>رعایت اصول و سبک کدنویسی PSR-2</title>
                <link>https://virgool.io/@developit/%D8%B1%D8%B9%D8%A7%DB%8C%D8%AA-%D8%A7%D8%B5%D9%88%D9%84-%D9%88-%D8%B3%D8%A8%DA%A9-%DA%A9%D8%AF%D9%86%D9%88%DB%8C%D8%B3%DB%8C-psr-2-ges6sf6tivqv</link>
                <description>معمولا سبک کدنویسی که در فریمورک و extension ها استفاده میشه دارای اصول، قواعد و قانون های خودش هست. پس اگر تصمیم دارید چیزی به اونها اضافه کنید باید این قواعد رو در نظر بگیرید حتی در غیر این صورت هم رعایت این موارد خالی از لطف نیست و توصیه میکنم این کارُ انجام بدین. در حالی که میتونید راحت باشید، شما مجبور به رعایت این سبک در application خودتون نیستید...نگاه کلیبه طور کلی ما در این مطلب از سبک PSR-2 استفاده میکنیم و هر چیزی که در این سبک وجود داره اینجا هم هست.- در فایل ها باید از برچسب های php?&gt; و =?&gt; استفاده شود.- در پایان هر فایل باید یک خط جدید(newline) داشته باشید.- فایل encoding برای کد های php باید UTF-8 without BOM باشد.-  به جای tab از 4 فضای خالی(space) استفاده کنید.- نام کلاس ها باید به صورت StudlyCaps تعریف شوند.- ثابت های داخل کلاس تماما باید با حروف بزرگ و گاهی با جداکننده &quot;_&quot; تعریف شوند.- نام متد ها و پراپرتی ها باید به صورت camelCase تعریف شوند.- پراپرتی های خصوصی(private) باید با &quot;_&quot; شروع شوند.- همیشه از elseif جای else if استفاده کنید.فایل ها- در فایل ها باید از برچسب های php?&gt; و =?&gt; استفاده کرد نه از ?&gt; .- در انتهای فایل های php نباید از تگ &lt;? استفاده کنید.- در انتهای هر خط نباید space وجود داشته باشد- پسوند فایل هایی که شامل کد php هستند باید php. باشد.-فایل encoding برای کد های php باید UTF-8 without BOM باشد.کلاس ها- نام کلاس ها باید به صورت CamelCase تعریف شوند.- آکولاد باز باید در خط بعدی، زیر نام کلاس نوشته شود.- تمام کلاس ها باید بلاک مستندات مطابق استاندارد PHPDoc داشته باشند.- برای تمام کد های داخل کلاس باید با 4 space فاصله ایجاد کنید. - فقط یک کلاس داخل هر فایل php باید موجود باشد.- تمام کلاس ها باید namespaced داشته باشند.- نام کلاس باید معال نام فایل و namespace باید مطابق مسیر آن باشد./** * Documentation */
class MyClass extends \yii\Object implements MyInterface
{
    // code
}ثابت ها- ثابت های داخل کلاس تماما باید با حروف بزرگ و گاهی با جداکننده &quot;_&quot; تعریف شوند.&lt;?php
class Foo
{
    const VERSION = &#039;1.0&#039;;
    const DATE_APPROVED = &#039;2012-06-01&#039;;
}پراپرتی ها- از کلید واژه های public، protected و private استفاده کنید.- پراپرتی های public و protected باید در بالای کلاس و قبل از متد ها تعریف شوند. private هم همینطور اما ممکن هست کاهی قبل از متدی که با آن مرتبط هست آورده شود.- ترتیب تعریف پراپرتی ها باید به صورت اول public، دوم protected و سپس private باشد! هیچ قانون سختی برای رعایت این مورد نیست...- برای خوانایی بهتر میتونید از خط خالی بین گروه های public، protected و private استفاده کنید.- متغییر های private باید مثل varName_$ باشند.- اعضای عمومی داخل کلاس باید به صورت camelCase تعریف شوند.(حرف اول کوچک، با CamelCase فرق میکنه).- بهتره از نام هایی مثل i$ و j$ استفاده نکنید.&lt;?php
class Foo
{
   public $publicProp1;
   public $publicProp2;
   
   protected $protectedProp;
   
   private $_privateProp;
   
   public function someMethod()
   {
      // ...
   }
}متد ها- توابع و متد ها باید camelCase باشند.- نام باید هدف رو نشون بده.- از کلید واژه های public، protected و private استفاده کنید.- آکولاد باز باید در خط بعدی یعنی زیر نام متد قرار بگیره./** * Documentation */
class Foo{
/**
 * Documentation
 */
   public function bar()
   {
      // code
      return $value;
   }
}ادامه مطلب...وبلاگ من اینجاست...</description>
                <category>احسان رضایی</category>
                <author>احسان رضایی</author>
                <pubDate>Tue, 29 Oct 2019 16:59:19 +0330</pubDate>
            </item>
                    <item>
                <title>مدل سازی داده و طراحی پایگاه داده چند زبانه</title>
                <link>https://virgool.io/@developit/%D9%85%D8%AF%D9%84-%D8%B3%D8%A7%D8%B2%DB%8C-%D8%AF%D8%A7%D8%AF%D9%87-%D9%88-%D8%B7%D8%B1%D8%A7%D8%AD%DB%8C-%D9%BE%D8%A7%DB%8C%DA%AF%D8%A7%D9%87-%D8%AF%D8%A7%D8%AF%D9%87-%DA%86%D9%86%D8%AF-%D8%B2%D8%A8%D8%A7%D9%86%D9%87-zlumdxcletqh</link>
                <description>توسعه دهندگان نرم افزار همیشه علاقمند به گسترش فعالیت و رفتن به سمت بازار های جدید هستن. به این معنی که سعی میکنن محصولات خودشون رو در مناطق مختلف قرار بدن. در این مطلب چند روش برای بومی سازی یا مدل سازی داده و طراحی پایگاه داده چند زبانه توضیح داده میشه. مخصوصا بومی سازی در سطح محتوای نرم افزار.بومی سازی یا محلی سازی به فرآیند تطبیق محصول در بازار های مختلف گفته میشه. این یه موضوع مهم برای دستیابی و فروش در سایر بازار هاست. با این فرآیند کاربران احساس میکنن که یک محصول برای زبان، فرهنگ و نیاز اونها تولید شده.زمانی که درباره بومی سازی فکر میکنیم در درجه اول ترجمه محتوا ذهن ما رو به خودش مشغول میکنه. ما نیاز به یک مدل پایگاه داده قوی و کارآمد برای ذخیره محتوای ترجمه شده در چندین زبان داریم.برای درک بیشتر و با توجه به نیاز های مختلف روش های متفاوتی رو بررسی میکنیم. هر کدوم از این روش ها مزایا و معایب خودشون رو دارن. در نتیجه انتخاب بر عهده ی شما و نیازمندی های خاص خودتون هست.روش اول - اضافه کردن ستون زبان برای هر فیلد. ساده ترین روش از نظر توسعه و طراحی. کافیه برای هر زبان داخل جدول یک ستون در نظر بگیرید.مزایا.- پیاده سازی ساده.- هنگام نوشتن SQL Query هیچ پیچیدگی خاصی وجود نداره. مثلا:Select p.product_name_FR, p.description_FR, p.price,
c.name_FR, c.address_FR, c.contact_name
from order_line o, product p, customer c
Where o.product_id = p.id and o.customer_id = c.id
And id = &lt;order number&gt;;معایب.- عدم وجود مقیاس پذیری. هر زمان که زبان جدیدی اضافه بشه باید ستونش رو داخل جدول بسازید.- وقت گیر هست اگر زبان های زیادی در سیستم داشته باشید.روش دوم - ایجاد جدول جداگانه برای ترجمه(translation table).در این روش یک جدول جدا برای ترجمه محتوا در نظر میگیریم(جدول translation). که شامل یک ستون به ازای هر زبان هست.مزایا.- برای یک مدل داده ی از قبل آماده شده روش خوبی به منظور پیاده سازی هست.- تغییرات در صورت اضافه شدن زبان جدید به علت یک جدول ترجمه مجزا آسون تر هست.- میشه متون تکراریُ فقط یک بار ترجمه و سپس از شناسه اون در جداول مختلف استفاده کرد.معایب.- اگر یکی از مدل ها فقط یک زبان را پشتیبانی کنه یا یک فیلد تمام زبان ها رو برای ترجمه نیاز نداشته باشه، مشکل مقادیر NULL در جدول زبان به وجود میاد.- به دلیل JOIN با جدول ترجمه در صورتی که رکورد های زیادی داخل این جدول وجود داشته باشه. SQL Query کند میشه. یه راه حل برای این موضوع جدا کردن جدول ترجمه به ازای هر جدول هست.روش سوم - یک جدول ترجمه همراه با یک سطر به ازای هر زبان.شبیه به روش قبلی هست با این تفاوت که زبان ها رو به جای قرار دادن در ستون، به صورت ردیف میبینیم.ادامه مطلب...وبلاگ من اینجاست...</description>
                <category>احسان رضایی</category>
                <author>احسان رضایی</author>
                <pubDate>Mon, 21 Oct 2019 16:10:39 +0330</pubDate>
            </item>
                    <item>
                <title>دانشگاه یا موز!</title>
                <link>https://virgool.io/@developit/%D8%AF%D8%A7%D9%86%D8%B4%DA%AF%D8%A7%D9%87-%DB%8C%D8%A7-%D9%85%D9%88%D8%B2-wb5anjkljivq</link>
                <description>اگر هم سن و سال من باشید، به احتمال زیاد پدر و مادر هاتون در مورد تجربه خوردن موز در دوران کودکی و اینکه هر کسی موز نمیخورد برای شما خاطراتی تعریف کردن. حقیقتش زمان اونها موز میوه گرون قیمتی بود و فقط خانواده هایی با سطح درآمد بالا موز میخوردن :)) در نتیجه این میوه رو بیشتر در میهمانی های اعیان و اشراف میشد دید.اما با گذشت زمان و اینکه موز الان جزو میوه های ارزون حساب میشه باز در میمهانی های رسمی، عروسی ها و... وجود داره. به این دلیل که ارزش موز تغییر کرده اما طرز فکر مردم در موردش نه.دانشگاه هم مثل موز میمونه! یه زمان قبولی دانشگاه بسیار سخت بود، توی این رقابت سنگین برای ادامه تحصیل افراد کم و شاخصی موفق میشدن از سد کنکور بگذرن. کسی که حتی مدرک کاردانی میگرفت جایگاه خاصی بین خانواده، اقوام و دوستانش پیدا میکرد، کار بهتری بهش میدادن چون مدرک معیار مهمی بود و... .دانشگاه ها زیاد شدن...، آزاد، غیر انتفاعی، پیام نور و...، ظرفیت ها/صندلی ها افزایش پیدا کرد، قبولی در دانشگاه آسون شد و حتی شیوه ی پذیرش دانشگاه تغییر کرد مثل پذیرش بدون کنکور با ضمانت قبولی. بعضی ها رو که هیچ جایی راهشون نمیدادن شدن استاد! و بچه های مردمُ برای خانه نشینی تعلیم دادن. https://www.aparat.com/v/uv1b9 ارزش دانشگاه پایین اومده و اوضاع به خصوص توی محیط کار فرق کرده، مهارت شما اولویت اول و مدرک و تحصیلات دانشگاهی اولویت چهارم/پنجم و یا اصلا اولویت و اهمیتی براشون نداره.توی شهر ما، هر ترم چند صد فارغ التحصیل کارشناسی نرم افزار کامپیوتر داره اما از بینشون 2 تا برنامه نویس خوب به زور میتونید پیدا کنید.نمیخوام بگم دانشگاه بده، به نظرم داشتن تحصیلات دانشگاهی برای هر کسی مفیده و حداقل مدرک لیسانس در جامعه لازمه اما میخوام بگم اگر رویکرد شما صرفا دانشگاه محور باشه یا مثل قدیمی ها که میگفتن &quot;برو دانشگاه درس بخون یه کاری یاد بگیر تا یه جای خوبی استخدام بشی&quot;  فکر کنید کلاهتون پس معرکه است.اما مقصر واقعی کی میتونه باشه؟ من سه نفرو مورد اتهام قرار میدم در درجه ی اول، از خودمون شروع میکنم...اول، دانشجو.دانش + جو. هزار بار شنیدیم، کسی که به دنبال دانش میرود اما چقدر بهش عمل میکنیم؟ اکثرا متکی به مدرک تحصیلی و اتمام این دوره هستیم تا راحت شیم! در دانشگاه لیستی از دروس تدریس میشه که بنا بر تشخیص استاید برای دانشجو لازمه. ممکنه در دنیای واقعی! تعدادی از این دروس برای شما اصلا کاربردی نداشته باشن. به دروس مفید هم اگر خوب پرداخته بشه با توجه به زمان محدود یک ترم میشه گفت تنها مقدمات اون تدریس شده و حالا نوبت خود شماست که در کنار تحصیلات دانشگاهی شروع به کسب تجربه در اون زمینه بکنید. ممکنه همکلاسی های قدیمیتون رو ببینید که بیکار یا داری شغل نامناسبی هستن. پای درد دل هاشون که بشینید همه رو مقصر میدونن جز خودشونُ...دوم، خانواده.تا الان متوجه شدیم یکی از مشکلاتمون مدرک گرایی مفرطه که متاسفانه برای بدست آوردنش از طرف خانواده هامون تشویق میشیم. شاید بارها &quot;برو درس بخون یه چیزی یاد بگیر تا بتونی جایی کار کنی&quot; رو شنیده باشید. دلیل این تشویق و این طرز فکر میتونه همون دانشگاه یا موز خودمون باشه.سوم، استاد و دانشگاه.تدریس دروس کهنه یا بی مصرف برای خیلی از اساتید به یک امر طبیعی تبدیل شده. استادی که از دانشجوی خودش توقع درس خواندن و یادگرفتن داره حاضر نیست علم خودش رو بروز کنه. حقیقتا تغییر سخته. تدریس شغل استاد شده نه حرفه ی اون و اغلب در بازار کار مربوط به رشته ی خودشون نیستن بلکه از صبح تا شب پای تخته درس میدن. همه اینها باعث میشه تا جسارتا دوباره بگم، اونی که کارُ بلده انجامش میده و اونی که بلد نیست تدریسش میکنه. هر چند دانشجو که قبلا مورد اتهام قرار گرفته معمولا با این مورد مشکلی نداره و به جای حق خواهی از استاد، نمره میخواد! در مورد دانشگاه هم همینطوره، شنیدم که یکی میگفت من اگر میخواستم درس بخونم دانشگاه ... نمیومدم ترمی خدا تومن پول بدم که!نتیجه گیری.این توپ اتهام در زمین همه ما سه تا بود. اینکه خودتون باید تصمیم بگیرید عمر و پولتون رو کی و کجا مصرف کنید حقیقتی است که هر چه زودتر بهش برسید برنده شدین. نه میشه گفت دانشگاه بده و نه میشه گفت این تحصیلات کلاسیک بدرد میخوره. نه میشه از یک حداقل مدرک تحصیلی که به نظرم الان لیسانس هست گذشت و نه میشه به این سفره ای که برای عده ای پهن شده فکر نکرد. تصمیم گیری در موردش سخته و متاسفانه خیلی از ماها مثل من مشکلات رو میدونیم اما راه حل رو نه. فقط تونستم دید خودم و تجربه ی شخصیم رو باهاتون در میون بذارم نه تصمیم گیری. شاید در نبردی که من و خیلی های دیگه شکست خوردن شما پیروز باشید... . پس با خودتون :)در ضمن خوشحال میشم تجربیات شما رو مورد ارتباط تحصیلات دانشگاهی و شغل در نظرات این مطلب بخونم.و در آخر دیدن این مستند کوتاه غم انگیز رو بهتون پیشنهاد میکنم. https://www.aparat.com/v/LBahp وبلاگ من اینجاست...</description>
                <category>احسان رضایی</category>
                <author>احسان رضایی</author>
                <pubDate>Mon, 14 Oct 2019 20:09:03 +0330</pubDate>
            </item>
                    <item>
                <title>آپلود فایل های پروژه به وسیله ی ftp هنگام استفاده از git</title>
                <link>https://virgool.io/@developit/%D8%A2%D9%BE%D9%84%D9%88%D8%AF-%D9%81%D8%A7%DB%8C%D9%84-%D9%87%D8%A7%DB%8C-%D9%BE%D8%B1%D9%88%DA%98%D9%87-%D8%A8%D9%87-%D9%88%D8%B3%DB%8C%D9%84%D9%87-%DB%8C-ftp-%D9%87%D9%86%DA%AF%D8%A7%D9%85-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-git-mcyikhaqcfki</link>
                <description>اگر از git استفاده بکنیم یا نکنیم در نهایت نیاز داریم تا پروژمون رو داخل سرور قرار بدیم. ftp یک روش مرسوم برای این کار هست و Git-ftp این امکان رو بهمون میده تا با آپلود آخرین تغییرات پروژه در سرور زمان و پهنای باند کمتری رو صرف این کار بکنیم. برای تشخیص تغییرات، گزارشی از فایل های آپلود شده در قالب یک فایل log بر اساس شناسه commit داخل سرور نگه داری میشه بنابراین میتونیم به راحتی از branch های مختلف استفاده و یا به عقب برگردیم و یک نسخه ی قدیمی رو آپلود کنیم :)# Setup
git config git-ftp.url &amp;quotftp://ftp.example.net:21/public_html&amp;quot
git config git-ftp.user &amp;quotftp-user&amp;quot
git config git-ftp.password &amp;quotsecr3t&amp;quot

# Upload all files
git ftp init

# Or if the files are already there
git ftp catchup

# Work and deploy
echo &amp;quotnew content&amp;quot &gt;&gt; index.txt
git commit index.txt -m &amp;quotAdd new content&amp;quot
git ftp push
# 1 file to sync:
# [1 of 1] Buffered for upload &#039;index.txt&#039;.
# Uploading ...
# Last deployment changed to ded01b27e5c785fb251150805308d3d0f8117387.وبلاگ من اینجاست...</description>
                <category>احسان رضایی</category>
                <author>احسان رضایی</author>
                <pubDate>Mon, 14 Oct 2019 01:17:55 +0330</pubDate>
            </item>
                    <item>
                <title>تفاوت بین Active Record و Data Mapper</title>
                <link>https://virgool.io/@developit/%D8%AA%D9%81%D8%A7%D9%88%D8%AA-%D8%A8%DB%8C%D9%86-active-record-%D9%88-data-mapper-hqqk8usebqmq</link>
                <description>هنگامی که موضوع کار با داده ها در application مطرح میشه احتمالا نیاز به یک ORM پیدا خواهید کرد. ORM یک لایه بین پایگاه داده و application شماست. که به وسیله اون عملیات CRUD یا به عبارت دیگه create, read, update,  delete به آسونی انجام میپذیره. بیشتر از این به ORM نمیپردازم چون در حال حاضر اکثر فریمورک های مدرن ازش استفاده میکنن و بعید میدونم شما تا الان با اون کار نکرده باشید.دو الگو پیاده سازی محبوب ORM ها Active Record و Data Mapper هست. در این مقاله تصمیم دارم به تفاوت بین این دو الگو بپردازم. مزایا و معایبشون چی هست و چطور میشه یکی از این الگو ها رو برای کار خودمون انتخاب کنیم.- الگوی Active Record.تقریبا محبوب تر و پر استفاده تر از Data Mapper هست. مثال زیر نحوه ی ذخیره کاربر جدید رو نشون میده.user = new User
user-&gt;username = &#039;philipbrown&#039;
user-&gt;save()الگوی Active Record مستقیما یک جدول در پایگاه داده یا به عبارت دیگه یک سطر از یک جدول پایگاه داده رو map میکنه. به عنوان مثال. نمونه ی بالا یک سطر از جدول user در پایگاه داده است.زمانی که مدل User ساخته میشه نیازی نیست که چیزی در مورد ویژگی ها و خواص این شی و اینکه چطور با پایگاه داده مرتبط هست رو بدونید. مدل به طور خودکار خواص/ویژگی ها رو با استفاده از طرح/شِما/schema پایگاه داده به دست آورده.یکی دیگه از مزایای این الگو متد save هست که برای ایجاد یا بروزرسانی استفاده میشه و بسیار کار شما رو آسون میکنه.- الگوی Data Mapper.تفاوتش با الگوی قبلی در این هست که domain شما رو به طور کامل از لایه persistence جدا میکنه. به این معنی که مدل چیزی در مورد پایگاه داده نمیدونه. که این یعنی نوشتن کد بیشتر اما در دراز مدت نگهداری و اصلاح اون آسونتر هست.زمانی که از این سبک استفاده میکنید کد شما چیزی به صورت این نمونه خواهد بود.user = new User
user-&gt;username = &#039;philipbrown&#039;تا اینجای کار تفاوتی بین دو سبک وجود نداره. اما چون اطلاعاتی در مورد پایگاه داده نداریم نمیشه از متد save استفاده کنیم چون در واقع اصلا وجود نداره. در عوض باید از یک سرویس کاملا متفاوت تحت عنوان Entity Manager استفاده کرد.اینجا دیگه لزوما یک شی نماینده یک سطر از جدول نیست و در واقع این محدودیت از بین رفته.user = new User
user-&gt;username = ‘philipbrown’
EntityManager::persist(user)مزیت اصلی این سبک نداشتن اطلاعات در مورد پایگاه داده است چون اون رو سبک تر میکنه. علتش هم مشخصه، داخل مدل چیزی از ویژگی و خواص از جدول و پایگاه داده وجود نداره. اما تعامل با اون رو هم سخت کرده.مزایا و معایب.تا حد کمی تفاوت بین دو سبک رو توضیح دادم در ادامه مزایا و معایب رو بررسی میکنیم. توجه داشته باشید به طور کلی نمیتونیم مشخص کنیم کدوم الگوی مناسب تری هست و مثل باقی مسائل برنامه نویسی پاسخ رو باید در جمله ی &quot;بستگی دارد&quot; پیدا کنیم.دو مورد کلی برای قضاوت در این مورد وجود داره.- اپلیکیشن از چه نوعی هست؟ اولین چیزی که باید در مورد اون فکر کرد. به نظر من دو نوع application داریم. بر پایه CRUD و بر پایه Domain. برای نوع اول(بر پایه CRUD) الگوی Active Record گزینه ی مناسب تری هست. چون کارتون رو آسونتر میکنه و سریعتر میشه application رو توسعه داد. در مقابل application بر پایه Domain مثل پیاده سازی قوانین و رویه های یک کسب و کار Data Mapper گزینه ی مناسب تری هست. چون برای کار با داده ها Restriction های قطعی رو اعمال میکنه. و این امکان رو به شما میده تا قوانین کسب و کارتون رو در موجودیت های خودشون محافظت کنید.- شرایط و استراتژی که هنگام توسعه در نظر دارید.این هم موضوع دیگه ای هست که باید در نظر داشت. اگر تصمیم به تولید یک minimum viable product به منظور شناخت بازار یا ریسک یا ... دارید. Active Record به دلیل ناشناخته بودن کسب و کار و اهمیتش، همچنین عدم اطمینان از معماری گزینه ی مناسب تری هست. از طرف دیگه اگر یک application قدیمی به شما ارث رسیده! منظور برنامه ای هست که تصمیم دارید نسخه ی جدیدی از اون رو توسعه بدین. الگوی Data Mapper مناسب تر هست. چون نرم افزار قدیمی موجود قبلا وارد فاز اجرایی شده به خوبی امکان مشخص کردن فرایند ها و قوانین داخلش وجود داره. مطالعه بیشتر.https://culttt.com/2014/06/18/whats-difference-active-record-data-mapperhttps://www.infinitypp.com/software-patterns/activerecord-vs-datamapper-pattern-php-laravelوبلاگ من اینجاست...</description>
                <category>احسان رضایی</category>
                <author>احسان رضایی</author>
                <pubDate>Sun, 13 Oct 2019 13:04:03 +0330</pubDate>
            </item>
                    <item>
                <title>چرا از framework استفاده میکنم؟</title>
                <link>https://virgool.io/@developit/%DA%86%D8%B1%D8%A7-%D8%A7%D8%B2-framework-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D9%85%DB%8C%DA%A9%D9%86%D9%85-wh7cnqpd81ot</link>
                <description>جدا از زبان برنامه نویسی تفکر عدم استفاده از فریمورک موضوعی هست نه چندان صحیح که گاهی ناخواسته توی بحثش با دیگران به تله میوفتم.صاحبان این طرز فکر معتقد هستن استفاده از فریمورک باعث میشه توسعه دهنده زیر و بم زبان برنامه نویسی رو خوب یاد نگیره. موافق این هستم که برنامه نویس باید مباحث پایه و جزئیات رو بدونه اما نه اینکه از یک فریمورک استفاده نکنه بلکه جدای از اون به دنبال جزئیات بره. اگر از اوپن سورس استفاده میکنه چه بهتر! چون همون سورس فریمورک در این مورد بهش کمک خواهد کرد. از طرفی سرعت و سهولت انجام کار که فریمورک به توسعه دهنده میبخشه رو به بهای آشنایی با جزيیات یا زیر و بم نباید از دست داد!موضوع بعدی کار کوچک و کار بزرگ هست و به نظرم درسته که برای انجام یک کار کوچک نباید از یک فریمورک بزرگ استفاده کرد. این موضوع اصلا ربطی به استفاده یا عدم استفاده از فریمورک نداره. دلیل بعدی استفاده از ابزار ها و پکیج های مورد علاقه است. تا حدودی میشه فریمورک رو کاستوم کرد.یه پله بالاتر،‌ دلیل قانع کننده تری دارن. پرفورمنس! درست میگن. استفاده از فریمورک باعث کاهش پرفورمنس پروژه میشه اما افزایش پرفورمنس توسعه دهنده! یک فریمورک با داشتن جامعه ی بزرگی از استفاده کننده هاش و در نظر گرفتن نیاز های اونها توسعه داده میشه. ممکنه تمام امکانات موجودش به درد شما نخوره و براتون دست و پا گیر بشه. بیایید در درجه اول قبول کنیم به احتمال خیلی کم پرفورمنس به این میزان برای شما اهمیت خواهد داشت و در حد کاستوم کردن فریمورک نیاز شما رو مرتفع میکنه. در درجه دوم به این فکر کنید اگر قرار باشه خودتون از کتابخانه های مورد نیازی که جمع آوری کردین استفاده کنید در آخر یه چیزی مثل فریمورک دست و پا کردین منتها شخصی! سوال اینجاست- آیا از نظر فنی اینقدر کامل و بی عیب و نقص هستین که در این کار اشتباه نکرده باشید؟- امنیت چطور؟ آیا امنیت رو به خوبی تضمین میکنید؟- مستندات کاملی برای اون نوشتین و امکان این وجود داره که نفر جدیدی بدون درد و خونریزی وارد تیم بشه؟- و سوال اخر، آیا مطمئن هستید به پرفورمنسی که دنبالش بودین رسیدین و بهتر از پرفورمنس سایر فریمورک هاست؟!وبلاگ من اینجاست...</description>
                <category>احسان رضایی</category>
                <author>احسان رضایی</author>
                <pubDate>Thu, 10 Oct 2019 00:35:57 +0330</pubDate>
            </item>
                    <item>
                <title>چپ دست ها آدمای خاصی هستن یا چی؟</title>
                <link>https://virgool.io/@developit/%DA%86%D9%BE-%D8%AF%D8%B3%D8%AA-%D9%87%D8%A7-%D8%A2%D8%AF%D9%85%D8%A7%DB%8C-%D8%AE%D8%A7%D8%B5%DB%8C-%D9%87%D8%B3%D8%AA%D9%86-%DB%8C%D8%A7-%DA%86%DB%8C-d7ifysy7ij1s</link>
                <description>به مناسبت روز جهانی چپ دست ها البته با کمی تاخیر! باید بگم به عنوان یک چپ دست فکر نکم! نکته ی قابل توجه اینکه از پیام های داخل شبکه های اجتماعی متوجه شدم 10 درصد جامعه چپ دست نیستن و برعکس، راست دست ها در اقلیت به سر میبرن!خب بیایین واقع بین باشیم، اگر 10 تا از رهبران بزرگ جهان رو تحت عنوان چپ دست های ماندگار تاریخ لیست کردن نماد خاص بودن نیست چون بقیه شون راست دست بودن! در کل فکر نمیکنم این تمایل استفاده از دست چپ به جز تفاوت که ممکنه در دوران رشد جنین اتفاق بیوفته چیز دیگه ای برامون داشته باشه.و البته دردسر! موردی که کمتر بهش اشاره شده. توجه داشته باشین که بسیاری از ابزارها برای افراد راست دست طراحی شده. مثلا خود من با دکمه ی روشن و خاموش ماشین ریش تراشم مشکل دارم و باید از دست راستم برای استفاده اش کمک بگیرم.البته متخصصین همیشه به فکر ما بودن و ابزار هایی مناسب حال ما تولید کردن ولی خب ما نتونستیم جایی پیداشون کنیم. من نوعی توی دانشگاه هیچ وقت موفق نشدم صندلی چپ دست پیدا کنم :|یادمه این موضوع چپ دست بودن رو به نیم کره های مغز هم ربط میدادن که توجه تون رو به این نقل قول جلب میکنم:در مطالعه‌ای در سال ۲۰۱۳، تصاویر سه‌بعدی مغز هزار نفر مورد بررسی قرار گرفت و با استفاده از اسکنر MRI، میزان فعالیت هردو نیمکره اندازه‌گیری شد. نتایج نشان می‌داد که هر انسان، از هردو نیمکره مغزی خود بهره می‌برد و بخشی بر دیگری غالب نیست. البته توجه داشته باشین ما در طول زندگی و فعالیتی که داریم به طور خواسته یا ناخواسته یکی از نیم کره های مغزمون رو قوی و اون یکی رو ضعیف میکنیم.در انتها این روزُ به همه ی چپول ها تبریک میگم و آرزو میکنم با موفقیت هایی که تو زندگی به دست میارین خاص بشین نه این تفاوت.وبلاگ من اینجاست...</description>
                <category>احسان رضایی</category>
                <author>احسان رضایی</author>
                <pubDate>Wed, 09 Oct 2019 13:35:30 +0330</pubDate>
            </item>
                    <item>
                <title>این جماعتِ توسعه دهنده ی خرده گیر</title>
                <link>https://virgool.io/@developit/%D8%A7%DB%8C%D9%86-%D8%AC%D9%85%D8%A7%D8%B9%D8%AA%D9%90-%D8%AA%D9%88%D8%B3%D8%B9%D9%87-%D8%AF%D9%87%D9%86%D8%AF%D9%87-%DB%8C-%D8%AE%D8%B1%D8%AF%D9%87-%DA%AF%DB%8C%D8%B1-clc4smmfqwzb</link>
                <description>به این نتیجه رسیدم توی برنامه نویسی دست رو هر چیزی بذاری(تکنولوژی، فریمورک و...) بازم پیدا میشن که بیان و یه عیبی روش بذارن :)آیا واقعا جای عیب و ایراد گرفتن وجود داره؟ بله. حتما اینطور هست و اتفاقا کار آسونیه :)مزایا و معایب توی حرفه ما همیشه کنار هم بودن و تصمیم گیری در مورد اینکه چه کسی از چه چیزی استفاده کنه به جمله ی &quot;بستگی دارد به...&quot; یا در کل &quot;بستگی دارد ها&quot; گره خورده.موضوع دقیقا اینجا مشخص میشه. ممکن هست انتخاب یک شخص برای من نوعی و یا شخص دیگه ای سم باشه!عمدتا 4 دلیل اصلی برای این موضوع وجود داره.اول. بزرگ جلوه دادن خودشون!طرف مقابل با ایراد گرفتن و گاها مسخره کردن به دنبال بزرگ جلوه دادن خودشه. مثل سیگار که نوجوون ها با گذاشتنش گوشه ی لب حس بزرگی بهشون دست میده. توی برنامه نویسی هم همینطوره. مثلا میتونی بگی فلان زبان برنامه نویسی آشغاله تا بگن wow چه برنامه نویس خفنی و از این جور حرف ها. جالب اینجاست که اغلب نظراتشون پشتوانه و دلیل و مدرک نداره. اصلا دنبال اون موضوعی که در موردش ایراد میگیرن نرفتن و بیشتر حرف های دیگرانُ تکرار میکنن.دوم. سلیقه...شاید بتونم با مورد اولی ها کنار بیام اما دومی نه. اینکه سلیقه ی خودت رو درست بدونی و بقیه رو غلط فاجعه است... یادمه یه مطلب در مورد استاندارد کدنویسی داخل یه فریمورک رو مطالعه میکردم که اولش به این جمله برخوردم:هیچ قانون سختگیرانه ای برای شما وجود نداره...همین برای من کافی بود تا تمام اون مقاله رو چند بار مطالعه کنم! درسته. قانونی وجود نداره. اگر با رعایت استاندارد از روش دیگه ای مساله رو حل کردن. متفاوت با اون چیزی که توی ذهن شما میچرخه اشتباه نیست فقط متفاوته و شاید هم درست تر باشه البته.سوم. جبهه گرفتن.گاها شخص با دیدن اینکه فرد یا افرادی مسیر دیگه ای رو برای خودشون انتخاب کردن. مسیری که نه به سلیقه و نه مورد علاقه شون بوده خودشون رو میبازن. به یکباره سمبلی شدین که باعث ناراحتیشون میشید و آینه ای جلوی روشون که ممکنه عیب هاشون رو به وسیله ی شما ببینن. سخت ترین راه تحقیق و بررسی و در صورت لزوم تغییر هست و راحت ترین را کوبیدن شما...چهارم. اطلاعات کهنه.یادمه با دو نفر در مورد اینکه فلان چیز به درد نمیخوره بحث میکردم. بحث که نبود، ازشون دلیل و سند معتبر میخواستم تا ادعاهاشون رو قبول کنم. اولی که معلوم شد اصلا در جای مناسبی موضوع رو مقایسه نمیکنه و دومی اطلاعاتی که میداد برای حدود 6 سال پیش بود!نتیجه اینکه همیشه ایراد هست و اتفاقا خوبه که باشه  اما دو چیز مهمه. ایراد گیرنده از نظر فنی و اخلاقی انسان بزرگی باشه و اینکه صحبت هاش همراه با پشتوانه معتبری ارائه بشه. این پشتوانه میتونه شامل سند، دلیل و مدرک و نهایتا تجربه باشه.اما اگر به اون 4 دسته از توسعه دهندگان بالا برخوردین هدفونتون رو بذارید گوشتون و با هر چیزی که خوشحالتون میکنه کار کنید. از افرادی که این مسائل ساده رو درک نمیکنن نمیشه توقع ساکت شدن داشت.وبلاگ من اینجاست...</description>
                <category>احسان رضایی</category>
                <author>احسان رضایی</author>
                <pubDate>Tue, 08 Oct 2019 20:33:07 +0330</pubDate>
            </item>
                    <item>
                <title>نامگذاری چیزها</title>
                <link>https://virgool.io/@developit/%D9%86%D8%A7%D9%85%DA%AF%D8%B0%D8%A7%D8%B1%DB%8C-%DA%86%DB%8C%D8%B2%D9%87%D8%A7-m8e5p5wspz7p</link>
                <description>معمولا توسعه دهنده زمان بیشتریُ برای خواندن کد نسبت به نوشتن اون صرف میکنه. این یه موضوع  مهمه که سورس خوانایی لازم رو داشته باشه. در ادامه بر اساس تجربه چند مورد برای نام گذاری آورده شده.- مفهوم.نام، که میتونه نام متغییر، پراپرتی، کلاس، اینترفیس و یا هر چیز دیگه ای باشه باید هدف و اینکه برای چه کاری استفاده خواهد شد رو منعکس کنه.1) از نام های دقیق استفاده کنید. اگر کسی بدون کامنت های شما نمیتونه ایده و هدف شما رو بفهمه اصلا خوب نیست. بدترین حالت زمانی هست که نام به کسی که اون رو میخونه دروغ بگه!2) اجتناب از نام های بی معنی.نام هایی مثل i,j,k و... تنها زمانی قابل قبول هستن که در یک حلقه استفاده بشن. در باقی موارد خوانایی رو سخت میکنن.معمولا توی کتاب های علوم کامپیوتر از این روش برای تعریف یک فرمول(با استفاده از شبه کد به منظور سریعتر نوشتن) استفاده میشه در صورتی که اگر پاراگراف بالای اون فرمول رو مطالعه نکنید چیزی ازش نخواهید فهمید.3) نام کلاس ها، اینترفیس و پراپرتی ها.نام کلاس میتونه شامل یک یا چند اسم باشه. از فعل نباید استفاده کرد. از “data”, “manager”, “info”, “processor”, “handler”, “maker”, “util” و موارد مشابه به علت مبهم بودنشون اجتناب کنید.اینترفیس ها معمولا اسم یا صفت هستن. میتونید از پیشوند (مثلا Interface) هم استفاده کنید.namespace Psr\Log;
/**
 * Describes a logger instance
 */
interface LoggerInterface
{پراپرتی ها اسم یا صفت هستن. برای پراپرتی هایی با مقدار دودویی(0 یا 1) میشه از پسوند هایی مثل “Is”, “Can”یا “Has” در جاهای مناسب استفاده کرد.نام Method باید شامل یک یا چند فعل باشه و کاری که انجام میده رو توضیح بده. نه اینکه چطور اون کار رو انجام میده.ضروری نیست اما بهتره یک کلاس مشتق پسوند کلاس والد رو به همراه خودش داشته باشه.class Exception {}
class InvalidArgumentException extends Exception {}- پایداریاز یک نام تنها برای یک مفهوم استفاده کنید. مثال خوبدر این مورد استفاده از begin/end هست و اگر ازشون به عنوان شروع یا پایان استفاده کردین. کنارش از start/finish به صورت ترکیبی استفاده نکنید!1) دستورالعمل های سبک و چهارچوب کدنویسی رو دنبال کنید.هنگام توسعه ی پروژه، تیم باید در مورد سبک نوشتن کد و قاعده و قانون های مرتبط با کدنویسی توافق کنه. و همه ملزم به رعایتش بشن. در PHP رایج ترین قرارداد PSR-2 هست و اکثر پروژه ها بر اساس اون عمل میکنن. - کامل نویسی1) اجتناب از استفاده مجدد نام هابه دو دلیل از نام ها استفاده مجدد نکنید. اول اینکه همواره باید مفهومش رو داخل ذهنتون نگه دارید. و دوم زمان جستجو در کد به مشکل خواهید خورد.2) اجتناب از خلاصه کردن.هرگز نام ها رو خلاصه نکنید مثل cnt, iter, amnt, impl و... . مثال:function cntBigWrds($data, $length)
{
    $i = 0;
    foreach ($data as $iter) {
        if (mb_strlen($iter) &gt; $length) {
            $i++;
        }
    }
    return $i;
}

$data = [&#039;I&#039;, &#039;am&#039;, &#039;word&#039;];
echo cntBigWrds($data, 3);و حالا کد بالا زمانی که از خلاصه کردن نام ها استفاده نمیکنیم:function countWordsLongerThan(array $words, int $minimumLength)
{
    $count = 0;
    foreach ($words as $word) {
        if (mb_strlen($word) &gt; $minimumLength) {
            $count++;
        }
    }
    return $count;
}

$words = [&#039;I&#039;, &#039;am&#039;, &#039;word&#039;];
echo countWordsLongerThan($words, 3);توجه داشته باشید نام بدون خلاصه نویسی باید کوتاه باشد. در نتیجه زیاده روی نکنید. چیزی مثل ()processTextReplacingMoreThanASingleSpaceWithASingleSpace مطلوب نیست. اگر نام بیش از حد طولانی شده به این معنی هست که میتونید کوتاه ترش کنید.3) اجتناب از کلمت اختصاریاستفاده بیش از حد از کلمات اختصاری مانع بزرگی برای برقراری ارتباط هست. هیچکس واقعا نمیتونه تمام کلمات اختصاری رو داخل ذهن خودش نگه داره و در نتیجه کلمات اختصاری به مرور باعث دردسر خواهند شد.- خواناییکد باید به راحتی قابل خواندن باشه. میتونید نام ها رو از داخل مقالات یا کتاب ها انتخاب و استفاده کنید. به عنوان مثال یک پراپرتی به نام TotalAmount به مراتب خوانا تر از AmountTotal هست.1) دامنه لغاتباید از نام های مورد استفاده در مدل کسب و کار داخل کد استفاده بشه. به عنوان مثال، اگر در پروژه گردشگری از venue به عنوان نام کافه، هتل ها یا جاذبه های توریستی استفاده میکنن ایده ی بدی هست که داخل سورس به جاش از place استفاده کنید. چون شما و کاربران از دو لغت متفاوت استفاده میکنید و این کارتون رو پیچیده خواهد کرد.2) از نام های انگلیسی استفاده کنید.اکثر زبان های برنامه نویسی از زبان انگلیسی استفاده میکنن و بهتره برای نام گذاری هم از این زبان استفاده کنید.منبعرعایت اصول و سبک کدنویسیوبلاگ من اینجاست...</description>
                <category>احسان رضایی</category>
                <author>احسان رضایی</author>
                <pubDate>Tue, 08 Oct 2019 12:33:20 +0330</pubDate>
            </item>
                    <item>
                <title>تم روشن یا تیره؟ کدام برای چشم مفیدتر هست؟</title>
                <link>https://virgool.io/@developit/%D8%AA%D9%85-%D8%B1%D9%88%D8%B4%D9%86-%DB%8C%D8%A7-%D8%AA%DB%8C%D8%B1%D9%87-%DA%A9%D8%AF%D8%A7%D9%85-%D8%A8%D8%B1%D8%A7%DB%8C-%DA%86%D8%B4%D9%85-%D9%85%D9%81%DB%8C%D8%AF%D8%AA%D8%B1-%D9%87%D8%B3%D8%AA-eu8mh2glmeuo</link>
                <description>شاید صرفا مربوط به فضای برنامه نویسی نباشه، در کل به دنبال این بودم که یک صفحه ی روشن با نوشته های تیره برای چشم مفیدتر هست یا نوشته های روشن با صفحه ای تیره؟ در ابتدا فرض رو بر این میگیریم که نور به اندازه کافی در اتاق وجود داره. از دهه 1980 تا الان مطالعات زیادی در این مورد انجام شده و هنوز هم به پایان نرسیده! یکی از اونها که مربوط به همون دهه اول هست میگه مطالعات به ما نشان دادند که متون تیره در یک صفحه/پس زمینه روشن بهتر از حالت دوم یعنی نوشته های روشن با صفحه ی تیره است. به عنوان مثال اونها متوجه شدن که شرکت کننده ها در این آزمایش 26 درصد دقیقتر متون رو مطالعه میکنن اگر نوشته ها تیره و صفحه روشن باشه.علت این موضوع تمرکز بیشتر هست. در این مقاله اومده: رنگ سفید تقریبا به یک اندازه باعث تحریک هر سه گیرنده حساس به رنگ در چشم انسان میشه. در نتیجه با سفت شدن عنبیه، مردمک متمرکز تر خواهد شد. حالا با یک مردمک متمرکز و کوچک شده نوشته های تیره در صفحه ی روشن به راحتی قابل خواندن خواهند بود. هنگام استفاده از یک زمینه تیره باعث خواهید شد تا مردمک بزرگتر شه تا نور بیشتری دریافت کنه اما ممکنه نوشته ها رو تار ببینید. چرا؟!افراد مبتلا به آستیگماتیسم، که تقریبا 50 درصد از کل جمعیت کره زمین رو شامل میشن. برای خواندن یک متن روشن در محیط تیره مشکل دارن. به علاوه عوامل دیگه ای هم روی دقت و خوانایی شما تاثیر میذاره مثل نور محیط، نور نمایشگر و... .وبلاگ من اینجاست...</description>
                <category>احسان رضایی</category>
                <author>احسان رضایی</author>
                <pubDate>Tue, 08 Oct 2019 00:09:34 +0330</pubDate>
            </item>
            </channel>
</rss>