<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های bagher2g</title>
        <link>https://virgool.io/feed/@bagher2g</link>
        <description></description>
        <language>fa</language>
        <pubDate>2026-06-21 21:41:49</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/106342/avatar/3nigu2.png?height=120&amp;width=120</url>
            <title>bagher2g</title>
            <link>https://virgool.io/@bagher2g</link>
        </image>

                    <item>
                <title>پارادوکس Catch-22</title>
                <link>https://virgool.io/@bagher2g/%D9%BE%D8%A7%D8%B1%D8%A7%D8%AF%D9%88%DA%A9%D8%B3-catch-22-oiau7t8i29wy</link>
                <description>پارادوکس یا تناقض Catch-22 در واقع یک تناقض منطقیه، این تناقض به نوعی از جملات اشاره میکنه که برای جنگ با یک پدیده مجبورید به اون پدیده تن بدید. در واقع این تناقض وقتی به وجود میاد که شرایط مساله جلوی حل مساله رو بگیرن . مثلاً گزاره &quot;برای پیدا کردن شغل باید رزومه داشته باشید&quot; یک نوع تناقض Catch-22 محسوب میشه، چرا که شما نمی‌تونید رزومه داشته باشید اگر کاری نداشته باشید و نمی‌تونید کاری داشته باشید اگر رزومه نداشته باشید.Catch-22 در ابتدا توسط جوزف هلر توی رمانی به همین اسم مطرح شد. شخصیت اصلی این رمان کاپیتان جوزف یوساریان عضو نیروی هوایی ارتش ایالات متحده، در شرایط Catch-22 قرار گرفت. کاپیتان می‌دونست که یک حمله خطرناک موشکی در راهه و تنها راه فرار از این مهلکه این بود که ثابت کنه دیوانه‌س. از طرفی هیچ دیوانه ای نمیتونه خلبان موشک باشه. در نتیجه کاپیتان هیچ راهی برای فرار از مهلکه نداره. یک مثال دیگه.جوون ها پول ندارن و بانک فقط به آدمهایی پول قرض میده که چیزی شبیه سند خونه رو به عنوان وثیقه بذارن، چون جوونها پول ندارن پس نمیتونن سند خونه رو وثیقه کنن پس بانک به جوونهایی که پول ندارن پول نمیده.کافیه یک نگاهی به اطراف بندازیم تا متوجه بشیم در اکثر مواقع در شرایط Catch-22 قرار میگیریم و راهی برای گریز نیست.</description>
                <category>bagher2g</category>
                <author>bagher2g</author>
                <pubDate>Tue, 01 Sep 2020 21:24:53 +0430</pubDate>
            </item>
                    <item>
                <title>نکاتی برای غلبه برا ناامنی‌های ناشی از ظاهر</title>
                <link>https://virgool.io/@bagher2g/%D9%86%DA%A9%D8%A7%D8%AA%DB%8C-%D8%A8%D8%B1%D8%A7%DB%8C-%D8%BA%D9%84%D8%A8%D9%87-%D8%A8%D8%B1%D8%A7-%D9%86%D8%A7%D8%A7%D9%85%D9%86%DB%8C%D9%87%D8%A7%DB%8C-%D9%86%D8%A7%D8%B4%DB%8C-%D8%A7%D8%B2-%D8%B8%D8%A7%D9%87%D8%B1-ypcmo6yitnze</link>
                <description>وقتی حرف از Body insecurity وسط میاد داریم درباره بازه بزرگی صحبت میکنیم، از ناامنی از بزرگی شکم، تا صورت یا بازوها و ... . به تدریج که بالغ تر میشدم احساسات ناامنی زیادی از ظاهر و صورتم داشتم؛ به خصوص جوش‌ها. Body insecurity حالات مختلفی داره. روزهایی بود که نسبت به ظاهرم احساس بدی نداشتم و روزهایی بود که حس میکردم هیچ چیز روی بدنم سر جاش قرار نداره.اینجا چند نکته برای غلبه بر این حس میگممثبت اندیشانه با خودتان صحبت کنیدبه طور قابل فهمی خود ما بزرگترین منتقدان خودمون هستیم، خودمون رو خیلی خوب میشناسیم و چون خودمون رو خیلی خوب میشناسیم خیلی راحت میتونیم از خودمون ایراد بنی اسرائیلی بگیریم. روان‌درمان کاتی مورگان معتقده اگر یک روز رو مثبت شروع کنیم نتیجه زمین تا آسمون فرق میکنه.خب این قدم ها خیلی کوچیک به نظر میرسه، منظورم اینه که اینها بیشتر هندونه‌س که می‌ذاریم زیر بغلمون، اما اینها کمک کننده‌س. هرچی بیشتر خودتون رو در دنیای چیزهای مثبت محاصره کنید در مواجهه با چالش‌ها کمتر درگیر می‌شید.از اینکه آسیب پذیر باشید نترسید!در سالهای گذشته، به شخصه بیشتر و بازتر درباره اینسکیوریتی‌هام و اهمیت سلامت روانی صحبت کردم؛ متوجه شدم که هرچی بیشتر و باز تر صحبت می‌کردم توسنتم با آدم‌های بیشتری ارتباط بگیرم.از اینکه آسیب‌پذیر باشید نترسید، چرا که اون بیرون آدم‌های زیادی هستند که نه تنها نمیتونن اینجوری باهاتون ارتباط بگیرن بلکه دوست دارن تا کسی باشه و حرفهاشونو بفهمه بدون اینکه اونها رو قضاوت کنه.آسیب پذیری بیشتر از اینکه نقطه ضعف باشه نقطه قوته!خودتونو دور بدیدگاهی که خیلی توی خودم میرم، تصمیم میگیرم تا برای مدتی از اتاقم بیام بیرون، اگرچه برای رفتن به خیابون باشه، خرید از مغازه باشه یا حتی گوش دادن به موسیقی باشه. فقط از سرتون بیاید بیرون، چه فیزیکی چه روانی.  معمولاً وقتی برمیگردم احساس آرامش بیشتری دارم و حالا میتونم برگردم سر کارهام.با بدنتون خردمندانه تر برخورد کنیدضرب المثل &quot;شما همون چیزی هستید که میخورید&quot; بی دلیل نیست. یک مقایسه ساده انجام دادم بین هفته‌ای که با استرس زیاد چیزی جز فست فود نخوردم و هفته‌ای که اتفاقاً وعده‌های غذاییم رو با دقت انتخاب کردم. در هفته‌ای که فقط فست فود میخوردم از آزمایش کوچیکم باخبر بودم، همچنین در هفته‌ای که رژیم غذایی بهتری داشتم زودتر میخوابیدم. در طول روز احساس بی‌حوصلگی نداشتم. پس با بدنتون خردمندانه‌تر برخورد کنید، چرا که رفتار شما با بدنتون به صورت فیزیکی روی مغزتون تاثیر میذاره.صبور باشیدمهم‌تر از همه، صبور باشید. تغییر، ریکاوری و درمان، اینها نیاز به زمان دارن. برای خودتون هدف تعیین کنید اما اهداف غیر واقعی نباشن. شما با کسی به غیر از خود سابقتون نمی‌جنگید. همیشه به یاد داشته باشید شما بزرگتر از درگیری‌هاتون هستین.با کمی تلخیص از Lily در youngminds.org.uk</description>
                <category>bagher2g</category>
                <author>bagher2g</author>
                <pubDate>Sun, 30 Aug 2020 11:19:59 +0430</pubDate>
            </item>
                    <item>
                <title>آشنایی با S.O.L.I.D</title>
                <link>https://virgool.io/@bagher2g/solid-qme2nxnuqsxi</link>
                <description>  راستش دنبال یک فرصت شغلی جدید بودم که با یک چیز جالب مواجه شدم، تو اکثر آگهی های کاریابی &quot;آشنایی با solid&quot; رو دیدم و تصمیم گرفتم تا یکم درباره این چارچوب تحقیق کنم. نتیجه تحقیقاتم که ترجمه  چند تا مقاله از سایت های مختلف بود رو با شما به اشتراک میذارم.اصول S.O.L.I.D  سولید شامل 5 نکته برای طراحی و برنامه نویسی OOP ئه. اگر این نکات ساده رو رعایت کنیم توسعه و نگهداری برای دولوپر بسیار راحت میشه. همچنین سولید باعث میشه تا برنامه نویس ها مرتکب - code smell - نشن ، کد ها رو خیلی سریع refactor کنن و همچنین استفاده از این دیزاین پترن بخشی از agile  و متد توسعه نرم افزاره.S.O.L.I.D بر پایه اصول زیرهS - Single-responsiblity principleO - Open-closed principleL - Liskov substitution principleI - Interface segregation principleD - Dependency Inversion Principle  بیاید بررسی کنیم ببینیم هر کدوم از این نکات به طور فردی چه کاری انجام میده تا در نهایت بفهمیم سولید چجوری ما رو تبدیل به برنامه نویسای بهتری میکنهSingle-responsibility Principle  هر کلاس تنها باید یک وظیفه داشته باشد  برای مثال فرض کنید ما یک سری شی داریم و میخوایم مساحت کل اشیا رو حساب کنیم! تا اینجاش که ساده بود درسته؟class Circle {
    public $radius;

    public function construct($radius) {
        $this-&gt;radius = $radius;
    }
}

class Square {
    public $length;

    public function construct($length) {
        $this-&gt;length = $length;
    }
}  در مرحله اول کلاس شی هامونو میسازیم و براشون کانستراکتور درست میکنیم  در مرحله بعد یک کلاس AreaCalulatorدرست میکنیم و منطق محاسبه مساحت اشیا رو براش مینویسمclass AreaCalculator {

    protected $shapes;

    public function __construct($shapes = array()) {
        $this-&gt;shapes = $shapes;
    }

    public function sum() {
        // logic to sum the areas
    }

    public function output() {
        return implode(&#039;&#039;, array(
            &amp;quot&amp;quot,
                &amp;quotSum of the areas of provided shapes: &amp;quot,
                $this-&gt;sum(),
            &amp;quot&amp;quot
        ));
    }
}  برای استفاده از این کلاس به راحتی یک نمونه از اون رو میسازیم و آرایه ای از اشیا رو بهش پاس میدیم بعد هم خروجی رو چاپ میکنیم$shapes = array(
    new Circle(2),
    new Square(5),
    new Square(6)
);

$areas = new AreaCalculator($shapes);

echo $areas-&gt;output();  مشکل با تابع output اینه که کلاس AreaCalulatorوظیفه محسابه مساحت رو برعهده داره، حالا اگه فک نفر بخواد از مساحت خروجی جیسان بگیره تکلیف چیه؟ در حال حاضر همه این وظایف بر عهده AreaCalulatorکه مخالف اصل اول solid هست. طبق اصل اول solid وظیفه AreaCalulatorباید تنها و تنها محاسبه مساحت باشه. برای این کلاس نباید مهم باشه که کاربر چه خروجی ای میخواد؛ جیسان یا Html.برای حل این مشکل میتونیم یک کلاس SumCalculatorOutputter  طراحی کنیم و با این کلاس هندل کنیم که مساحت ها چجوری و با چه فرمتی نمایش داده بشن.$shapes = array(
    new Circle(2),
    new Square(5),
    new Square(6)
);

$areas = new AreaCalculator($shapes);
$output = new SumCalculatorOutputter($areas);

echo $output-&gt;JSON();
echo $output-&gt;HAML();
echo $output-&gt;HTML();
echo $output-&gt;JADE();Open-closed Principle  این اصل اشاره میکنه که هر کلاس باید به سادگی قابل توسعه باشه بدون اینکه نیاز باشه به اون کلاس دست بزنیم و یا تغییراتی توش اعمال کنیم.  بیاید به کلاس AreaCalulatorبه خصوص متد sum یه نگاهی بندازیمpublic function sum() {
    foreach($this-&gt;shapes as $shape) {
        if(is_a($shape, &#039;Square&#039;)) {
            $area[] = pow($shape-&gt;length, 2);
        } else if(is_a($shape, &#039;Circle&#039;)) {
            $area[] = pi() * pow($shape-&gt;radius, 2);
        }
    }

    return array_sum($area);
}  اگر بخوایم یه کاری کنیم که متد sum مساحت اشیای بیشتری رو محاسبه کنه باید if/else های بیشتری رو به متد اضافه کنیم و این بر خلاف اصل دوم solid هست!  یک راه میتونه این باشه که منطق محاسبه مساحت رو از کلاس Sum برداریم و به هر کدوم از اشیا اضافه کنیم.class Square {
    public $length;

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

    public function area() {
        return pow($this-&gt;length, 2);
    }
}  دقیقا همینکار رو باید برای Circle انجام بدیم، یک متد area باید اضافه بشه حالا محاسبه مساحت اشیا میتونه به راحتی شبیه کد زیر باشهpublic function sum() {
    foreach($this-&gt;shapes as $shape) {
        $area[] = $shape-&gt;area();
    }

    return array_sum($area);
}  حالا میتونیم هر شی دیگه ای رو بسازیم و بدون اینکه به کدمون دست بزنیم مساحت اون رو محاسبه کنیم! حالا از کجا بفهمیم آبجکتی که به داخل AreaCalulatorپاس داده میشه یک Shapeئه و از کجا بدونیم اگر Shape ئه متد area رو داره؟استفاده از interface بخش کلیدی و مهمی از اصول solidئه ؛ راه حل منطقی اینه که یک اینترفیس بسازیم و هر کلاس shape اون اینترفیس رو ایمپلمنت کنهinterface ShapeInterface {
    public function area();
}

class Circle implements ShapeInterface {
    public $radius;

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

    public function area() {
        return pi() * pow($this-&gt;radius, 2);
    }
}تو کلاس AreaCalulatorهم میتونیم چک کنیم که اگر کلاس داده شده از جنس این interface بود که هیچی، اگر نه وارد یک Exception بشه .public function sum() {
    foreach($this-&gt;shapes as $shape) {
        if(is_a($shape, &#039;ShapeInterface&#039;)) {
            $area[] = $shape-&gt;area();
            continue;
        }

        throw new AreaCalculatorInvalidShapeException;
    }

    return array_sum($area);
}Liskov substitution principle  اگر q(x) یک Attribute از ابجکت x که از کلاس T هست باشه اون موقع q(y) که یک attr از کلاس S هست و کلاس S از کلاس T ارث میبره باید درست باشه !  خیلی خب یک بار دیگه !  هر زیر کلاس باید بتونه یک جایگزین برای کلاس پدر یا والد خودش باشه !  فرض کنید ما یک VolumeCalculator داریم که از کلاس AreaCalulator ارث میبرهclass VolumeCalculator extends AreaCalulator {
    public function construct($shapes = array()) {
        parent::construct($shapes);
    }

    public function sum() {
        // logic to calculate the volumes and then return and array of output
        return array($summedData);
    }
}  در کلاس SumCalculatorOutputter  داریم :class SumCalculatorOutputter {
    protected $calculator;

    public function __constructor(AreaCalculator $calculator) {
        $this-&gt;calculator = $calculator;
    }

    public function JSON() {
        $data = array(
            &#039;sum&#039; =&gt; $this-&gt;calculator-&gt;sum();
        );

        return json_encode($data);
    }

    public function HTML() {
        return implode(&#039;&#039;, array(
            &#039;&#039;,
                &#039;Sum of the areas of provided shapes: &#039;,
                $this-&gt;calculator-&gt;sum(),
            &#039;&#039;
        ));
    }
}  اگر بخوایم با مثال جلو بریم همچین چیزی میشه :$areas = new AreaCalculator($shapes);
$volumes = new AreaCalculator($solidShapes);

$output = new SumCalculatorOutputter($areas);
$output2 = new SumCalculatorOutputter($volumes);  برنامه ران میشه اما وقتی میخوایم از $output2 خروجی Html بگیریم با E_NOTICE رو به رو میشیم !  برای حل این مشکل به جای اینکه تو متد sum از VolumeCalculator  آرایه برگردونیم باید به طور ساده به شکل زیر عمل کنیم که خروجی شبیه متد sum توی AreaCalculator بشه به این ترتیب این کلاس میتونه تو کل کدها جایگزین کلاس AreaCalculator باشهfunction sum() {
    // logic to calculate the volumes and then return and array of output
    return $summedData;
}Interface segregation principleکلاینت هرگز نباید مجبور بشه تا interfaceی رو implement کنه که بهش نیاز نداره و ازش استفاده نمیکنه یا نباید به همچین اینترفیسی اصلا نیاز داشته باشه و وابسته باشه .ازاونجایی که ما هنوز از Shape ها استفاده میکنیم و ازاونجایی که اشیا حجیم داریم و از اونجایی که میخواهیم حجم هرکدوم از این اشیا رو به دست بیاریم متد volume رو به اینترفیسمون اضافه میکنیمinterface ShapeInterface {
    public function area();
    public function volume();
}  حالا همه اشیا ما باید این اینترفیس رو پیاده کنن! اما ما میدونیم که دایره مسطحه و حجم نداره . پس بنابراین این اینترفیس دایره رو مجبور میکنه تا متدری رو پیاده سازی کنه که بهش نیاز نداره .  این قضیه مخالف اصل چهارم solidئه ، به جای اینکار شما میتونید یک اینترفیس تعریف کنید به اسم SolidShapeInterface  و اشیایی که حجم دارن مثل مکعب از این اینترفیس استفاده کننinterface ShapeInterface {
    public function area();
}

interface SolidShapeInterface {
    public function volume();
}

class Cuboid implements ShapeInterface, SolidShapeInterface {
    public function area() {
        // calculate the surface area of the cuboid
    }

    public function volume() {
        // calculate the volume of the cuboid
    }
}Dependency Inversion principleموجودیت ها باید به کلیات وابسته باشن نه جزئیات ، در واقع این اصل داره میگه که ماژول های high level نباید به ماژول های low level وابستگی داشته باشن.شاید یکم بد گفته باشم ولی این اصل واقعا آسونه! خب این اصل رو با یک مثال توضیح میدیمclass PasswordReminder {
    private $dbConnection;

    public function __construct(MySQLConnection $dbConnection) {
        $this-&gt;dbConnection = $dbConnection;
    }
}  اول اینکه MysqlConnection یک ماژول low-level ئه اما PasswordReminder یک ماژول high-level ئه و این مخالف اصل پنجم سولید هست . در اینجا کلاس PasswordReminder مجبور شده تا از کلاس MysqlConnection استفاده کنه  جدا از اون اگر شما بخواید دیتابیستون رو عوض کنید باید کلاس PasswordReminder رو دستکاری کنید که این مخالف اصل دوم هست ( گسترش بدون دست بردن توی کد )  در واقعا کلاس PasswordReminder اصلا نباید براش مهم باشه که شما از چه دیتابیسی استفاده میکنید برای اینکار دوباره برمیگردیم به اینترفیس و یک اینترفیس طراحی میکنیمinterface DBConnectionInterface {
    public function connect();
}  حالا DBConnectionInterfaceیک متد داره به اسم connect و جدا از اینکه دیتابیسمون چی باشه PasswordReminder میتونه به دیتابیس وصل شهclass MySQLConnection implements DBConnectionInterface {
    public function connect() {
        return &amp;quotDatabase connection&amp;quot
    }
}

class PasswordReminder {
    private $dbConnection;

    public function __construct(DBConnectionInterface $dbConnection) {
        $this-&gt;dbConnection = $dbConnection;
    }
}  طبق کد بالا میتونید ببینید که چه ماژول های high level و چه ماژول های low level به کلیات وابسته اند و نه جزئیات .نتیجه گیری  در نگاه اول Solid بسیار اذیت کننده به نظر میرسه اما به مرور زمان و کار کردن باهاش میشه بخشی از فرایند کد زدنتون. در نتیجه کد شما رو توسعه پذیر و تست پذیر میکنه .</description>
                <category>bagher2g</category>
                <author>bagher2g</author>
                <pubDate>Sun, 15 Dec 2019 10:52:12 +0330</pubDate>
            </item>
            </channel>
</rss>