<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های Kamal Farahani</title>
        <link>https://virgool.io/feed/@Kamal</link>
        <description>یک علاقه مند به علوم کامپیوتر نظری، هوش مصنوعی، یادگیری ماشین و علوم اعصاب!</description>
        <language>fa</language>
        <pubDate>2026-06-10 14:47:09</pubDate>
        <image>
            <url>https://static.virgool.io/images/default-avatar.jpg</url>
            <title>Kamal Farahani</title>
            <link>https://virgool.io/@Kamal</link>
        </image>

                    <item>
                <title>جاوااسکریپت: لعنت یا نعمت؟</title>
                <link>https://virgool.io/tehranjs/javascript-p7lx5txaay8j</link>
                <description>جاوااسکریپت وب را گرفته است و به سرعت در حال نفوذ به حوزه های دیگر است در این پست به ویژگی های این زبان عجیب می پردازم:خیلی خوب یادم هست که بعد از یک روز که حسابی روی یک پروژه با جاوااسکریپت کار کرده بودم و ویژگی های غیر منتظره و عجیب این زبان حسابی من را گیج و صد البته عصبانی کرده بود در یکی از شبکه های اجتماعی مخصوص توسعه دهنده ها به اسم devrant مطلبی پست کردم و هرچی فوحش و ناسزا که از دهنم در می آمد به جاوااسکریپت و طراحانش دادم. جدای از اینکه بسیاری از افراد درون آن شبکه اجتماعی به خاطر این پست پرمحتوا و ستیزه جویانه از من تقدیر کردند و کامنت هایی در تایید مزخرف بودن این زبان گذاشتند و پست من رو لایک کردند اما کامنت یک فرد با بقیه متفاوت بود و آن کامنت این بود:When I hear some body says f**k this or that thing I realize that he/she actually doesn&#x27;t understand that well.و این کامنت درست می گفت در اون مقطع من جاوااسکریپت رو کامل درک نکرده بودم اما این تقصیر من نبود تقریبا هر فردی که با جاوااسکریپت کار کرده تجربه گیج شدن و نفرت از این زبان را داشته.خوب اما چرا جاوااسکریپت اینطور است؟ جواب را باید در تاریخچه عجیب این زبان جستجو کرد:باور بکنید یا نه جاوااسکریپت حداقل ۲۱ سال سن داره. ۲۱ سال پیش جاوااسکریپت توسط براندون آیک در کمپانی Netscape به وجود آمد، هدف از ساخت جاوااسکریپت زبانی بود که بتواند در صفحات وب به کمک Designer ها بیایید و صفحات ایستای HTML را به صفحات پویا تبدیل کند. البته در ابتدای کار قرار بود نام زبان Mocha باشد و زبانی تابع محور باشد، اما ظاهرا زبان جاوا در آن زمان سر و صدای زیادی به پا کرده بود و خیلی ها این زبان را یک زبان عالی می دونستند و به طبع در اون مقطع جامعه جاوا به سرعت به سمت رشد می رفت و متاسفانه قبل از کار براندون آیک جاوا وارد دنیای وب هم شده بود (اگر یادتون باشه خیلی قدیمترها تکنولوژی های جاوا در مرورگر برای طراحی برنامه ها و رابط های کاربری استفاده می شد که به دلیل مشکلات امنیتی زیاد و قدیمی شدن الان منسوخ شده است) و چون جاوا یک زبان خیلی شئ گرا هست مدیر پروژه Mocha در وسط کار براندون آیک به این فکر افتاد که به این زبان تابع محور امکانات شئ گرایی شبیه جاوا اضافه کند و یک روز رفت توی اتاق براندون آیک و گفت:ببین براندون جاوا الان خیلی رو بورسه می بینی که جدیدا وارد وب هم شده جامعه اش هم رو به رشده، اگر بخوای یه زبان جدید بزنی  هیچ کس به ما توجهی نمی کنه ما باید یه کاری کنیم که توسعه دهنده ها فکر کنند زبان ما مثل جاوا هست تا بتونیم توجه ها رو به سمت زبونمون جلب کنیم پس خواهشا هر چند که می دونم برات سخته تو این زبان تابع محورت یه سری امکانات شئ گرا شبیه جاوا بگنجون، اسم زبون هم با من یه ترفند تبلیغاتی دارم که نگو و نه پرسو بله اینطور شد که Mocha شد جاوااسکریپت.اما قضیه اینجا تموم نمی شود بعد از فراگیر شدن جاوااسکریپت در وب هر کمپانی ای رفت و یک موتور(مفسر) جاوااسکریپت رو برای مرورگر خودش توسعه داد و امروزی که من این متن رو می نویسم حداقل چهار موتور بسیار خوب و قوی جاوااسکریپ توسعه داده شده توسط گوگل، موزیلا، اپل و مایکروسافت دارند با هم رقابت می کنند.کمپانی های متفاوت همانا و style های متفاوت کد زنی همانا. اگر شما از دنیای زبان هایی مانند پایتون یا جاوا بیایید قطعا در مواجه با جاوااسکریپت دچار سکته ناقص می شوید؛ چرا؟ مثلا زبان پایتون را در نظر بگیرید استایل کد زنی در پایتون بسیار دقیق توسط یکسری افراد میانسال و پیر که خودشون توسعه دهنده های این زبان بودند مشخص شده و شما به مراجعه به پایگاه اصلی پایتون می تونید جزوه ها و آموزش های مربوط به این زبان رو بخونید و لذت ببرید.اما برای جاوااسکریپت هیچ پایگاه رسمی ای مثلا مثل javascript.org وجود نداره که شما بتونید از اونجا document های مربوط به این زبان رو مطالعه کنید و بنابراین style یا format خاصی برای کد زدن در جاوااسکریپت وجود ندارد تا جایی که اگر یکی از شعارهای رسمی پایتون &quot;برای هر مسئله ای فقط یک راه وجود دارد&quot; باشد شعار غیر رسمی جاوااسکریپت &quot;برای هر مسئله ای بینهایت راه وجود دارد&quot; هست.یک مثال ساده: کد زیر را در پایتون در نظر بگیرید:Dog class خیلی ساده یک class تعریف کردیم به اسم Dog که Property ای به اسم sound دارد و با Method ای به اسم talk که sound را روی کنسول نمایش می دهد.برای نوشتن چیزی شبیه این کلاس در جاوااسکریپت (از ES6 به بعد) حداقل سه راه! می شناسم:1-Vanilla-js way:2- classes (after ES6):3-Factory functions:روش آخر با استفاده از ویژگی های تابع محور جاوااسکریپت ممکن است.پس می بینید که در این مساله ساده این راه حل های متفاوت در جاوااسکریپت وجود دارد و همه آنها توسط توسعه دهنده های مختلف بنابر سلیقه انتخاب می شود، مثلا خود من راه حل آخر  را بیشتر می پسندم چون با طبیعت تابع محور جاوااسکریپت بیشتر جور درمی آید.اگر از من بپرسید بزرگترین مشکل جاوااسکریپت چیست من قطعا جامعه آن را مورد هدف قرار می دهم، خود زبان اگر به درستی استفاده بشود می تواند زبان شیرین و جالبی باشد اما متاسفانه جامعه جاوااسکریپت پر هست از برنامه نویسان کم سواد یا حتی بیسواد! که به طرزی بد کد می نویسند که واقعا قابل خواندن نیست این باعث می شود که پیچیدگی و تفاوت style کدهایی که با این زبان نوشته می شود به طرز وحشتناکی بالا برود.زبان های زیادی برروی جاوااسکریپت ساخته شده اند (مانند coffee script و typescript) که هدف همه آنها تمیزتر کردن جاوااسکریپت و قابل استفاده تر کردن آن در پروژه های بزرگ بوده است.خلاصه اینکه این انعطاف پذیری جاوااسکریپت هم نقطه قوت و هم نقطه ضعف این زبان هست و اینکه به یاد داشته باشید جاوااسکریپت بیشتر یک زبان تابع محور (functional) هست تا یک زبان شئ گرا اما جامعه توسعه دهندگان این زبان دقیقا برعکس این نکته رفتار می کنند.</description>
                <category>Kamal Farahani</category>
                <author>Kamal Farahani</author>
                <pubDate>Sat, 09 Sep 2017 18:13:20 +0430</pubDate>
            </item>
                    <item>
                <title>وراثت در شئ گرایی: قسمت اول مفهوم وراثت</title>
                <link>https://virgool.io/@Kamal/inheritance-r41ncf6ukhf5</link>
                <description>در برنامه نویسی مفهومی وجود دارد به اسم code reuse یا استفاده مجدد از کد که به زبان ساده یعنی اجتناب از کار بیهوده کردن برای مثال: فرض کنید شما در صد جا از کد برنامه تان نیاز دارید که بفهمید یک عدد اول است یا نه، به جای اینکه صد بار در صد جای مختلف قطعه کدی که مربوط به شناسایی اعداد اول هست را بنویسید آن قطعه کد را به یک تابع تبدیل می کنید و هر جا که نیاز به شناسایی یک عدد اول داشتید آن تابع را با ورودی عدد مورد نظر فراخوانی می کنید و تمام؛ بنابراین یک بار کد را می نویسید و هر چندبار که خواستید از آن استفاده می کنید.وراثت هم مفهومی هست که برای استفاده مجدد از کد در سطح class های برنامه به وجود آمده است اجازه بدهید مثالی بزنم:فرض کنید شما در برنامه خود یک class به اسم Person با Property ها و Method های نشان داده در شکل زیر دارید:Person classکه در شکل بالا قسمت سبز Property های کلاس ما و قسمت آبی Method های آن هستند.حالا فرض کنید که ما در همین برنامه نیازمند یک کلاس دیگر به اسم Customer می شویم با Method ها و Property های زیر:customer classهمانطور که می بینید تمام ویژگی ها و رفتارهای کلاس Person با کلاس Customer یکسان هستند به جز یک Property در کلاس Customer به اسم customerNumber.حال ما می توانیم که دوباره از اول کلاس Customer را مثل کلاس Person بنویسیم و فقط یک Property به نام customerName به آن اضافه کنیم یا اینکه به کلاس Person یک Property به اسم customerNumber اضافه کنیم و دیگر کلاس Customer را ایجاد نکنیم و به جای آن از کلاس Person استفاده کنیم. اما هردوی این روش ها مشکل دارند در روش اول کار اضافی می کنیم و در روش دوم که بدتر است کلاس Person را خراب می کنیم چون هر شئ Person یک Property به اسم customerNumber ندارد و این Property هیچ ربطی به کلاس Person ندارد.اما اگر از زاویه ای دیگر به این قضیه نگاه کنیم متوجه رابطه ای بین این دو کلاس می شویم و آن رابطه این است که در واقع Customer یک Person است به علاوه یک Property اضافی به اسم customerName.اگر جمله بالا را فهمیده باشید در حقیقت مفهوم وراثت را در شئ گرایی فهمیده اید به نظر من وراثت یا Inheritance واژه مناسبی برای این مفهوم نیست و واژه مناسب تری که می شد برای این مفهوم انتخاب شود گسترش یا Extension است چون مثلا در این مثال کلاس Customer کلاس Person را گسترش می دهد و ویژگی ها یا رفتارهای جدیدی علاوه بر آنهایی که داشت به آن اضافه می کند. گفته می شود در وراثت رابطه is a بین دو کلاس برقرار است یعنی اینکه در این مثال:Customer is a Person.پس کلاس Customer از کلاس Person می تواند ارث بری کند اما نه برعکس. و وقتی کلاس Customer از کلاس Person ارث بری می کند تمام Property ها و Method های آن کلاس را به دست می آورد و بعد از آن می تواند  Property ها و Method های دیگری به آن اضافه کند.نکته: به کلاسی که شئ دیگر از آن ارث می برد Supercalss یا Parent class و به کلاسی که از کلاس دیگری ارث بری می کند Subclass یا Child class می گویند.مثلا در مثال بالا Person یک Superclass و Customer یک Subclass است.درضمن وراثت را روی نمودار با یک فلش توخالی از Subclass به Superclass نشان می دهند مانند:نمودار وراثتپس وقتی بین دو کلاس رابطه is a برقرار است ما به جای نوشتن دوباره کد از وراثت استفاده می کنیم.در پست بعدی نحوه پیاده سازی وراثت را در زبان های مختلف با کد بررسی می کنیم.</description>
                <category>Kamal Farahani</category>
                <author>Kamal Farahani</author>
                <pubDate>Tue, 05 Sep 2017 11:04:41 +0430</pubDate>
            </item>
                    <item>
                <title>شئ گرایی: قسمت سوم چگونگی تعریف شئ در برنامه نویسی</title>
                <link>https://virgool.io/@Kamal/oop3-xshj0dpw9nxj</link>
                <description>خوب توی این  قسمت قراره ببینیم اکثر زبان های برنامه نویسی که شئ گرایی را ساپورت می  کنند چطور راه حلی برای پیاده سازی این ایده (ایده شئ گرایی) پیدا کردند و  اساسا در این زبان ها چطور می توان یک شئ جدید را تعریف و ایجاد کرد.زبان  های مختلف راه های مختلفی برای پیاده سازی ایده شئ گرایی در پیش گرفتند  ولی اکثر زبان های پرطرفداری که شئ گرایی را ساپورت می کنند در زمان نوشتن  این متن از چیزی استفاده می کنند به اسم class. حالا برای اینکه دقیقا  بفهمیم که این class چه چیزی هست باید ببینیم معنی class در زبان انگلیسی  چیست:معنی class: طبقه، نوع، رده، دسته، گروه، گونه.بنابر  این با توجه به معانی بالا ما کلمه class را در برنامه نویسی نه به معنای  کلاس درس(!) که به عنوان کلمه ای برای مشخص کردن یک گونه از اشیا استفاده  می کنیم.برای اینکه دقیق تر بشوم مثالی می زنم:فرض کنید می خواهید  ساختمانی درست کنید، اکثر افراد قبل از ساختن یک ساختمان روی نقشه ای طرحی  که برای آن ساختمان در نظر دارند رو می کشند و بعد بر اساس آن طرح کلی  ساختمان را می سازند.پس یک کلاس طرح کلی یک گروه از اشیا هست  همانطور که شما نمی توانید با طرح یک ماشین رانندگی کنید یا توی نقشه یک  ساختمان زندگی کنید از class هم نمی توانید به عنوان یک شئ از آن گروه  استفاده کنید اما همانطور که از نقشه و طرح کلی برای ساختن یک ساختمان یا  ماشین جدید استفاده می شود می توانید از کلاس برای ساختن یک شئ جدید  استفاده کنید.همانطور که یک طرح یک ماشین را می کشیم و بعد می توانیم  از روی آن هزاران نسخه از آن ماشین را تولید کنیم (به شرط داشتن منابع  کافی)، کلاس را یک بار تعریف می کنیم و بعد هر چند بار که خواستیم از روی  آن شئ جدید مربوط به آن کلاس را می سازیم.پس تا اینجا می توانیم بفهمیم که یک کلاس قطعا یک اسم دارد (اسمی که به ما می گوید چه دسته ای را توصیف می کند) مثلا: ماشین، سیب.  و بنابر تعریف شئ که قبلا  داشتیم باید ویژگی ها و احتمالا رفتارهایی داشته باشد. ویژگی ها یعنی اینکه شئ ما چه داده هایی را درون خود دارد که وضعیت کنونیش را توصیف می کند مثل: رنگ، ارتفاع، حجم.و رفتارها یعنی اینکه شئ ما چه کارهایی می تواند انجام دهد مثل: حرکت کردن، بسته شدن.بنابرین تا اینجای کار به دو نتیجه مهم می رسیم:۱-ویژگی ها از جنس داده هستند.۲-رفتار ها از جنس عمل(operation) یا فعل هستند.اگر  آشنایی کمی با برنامه نویسی داشته باشید باید با داده ها و تعریف کردن  آنها آشنا باشید دادهایی مثل : Integer ,Float ,Char. و اگر برای بیشتر از ۱  ساعت برنامه نویسی کرده باشید با توابع یا function ها هم آشنایی دارید.به  داده هایی که ویژگی های یک شئ را مشخص می کنند Properties یا Attributes  در اصلاح فنی گفته می شود و به توابعی که رفتارهای یک شئ را مشخص می کنند  Method گفته می شود پس یک Property داده ای است که به یک شئ تعلق دارد و  Method تابعی است که به یک شئ تعلق دارد.خوب حالا که تعاریف را می  دانیم بهتر است مقداری شبه کد با سینتکس کلی (این سینتکس به هیچ زبانی تعلق  ندارد ولی بیشتر شبیه جاوا است) ببینیم تا بقیه مفاهیم را بهتر بفهمیم:فرض  کنید می خواهیم یک شئ حساب بانکی در برنامه خود داشته باشیم پس اول باید  کلاس شئ حساب بانکی را بسازیم، قدم اول این است که یک اسم مناسب برای class  این شئ استفاده کنیم پس اسم BankAccount را انتخاب می کنیم:class BankAccount {}خوب این از قدم اول، قدم دوم این هست که از خودمان  بپرسیم که یک حساب بانکی چه داده هایی را در خود نگهداری می کند؟ جوابی که  برای هر حساب ساده ای به ذهن من می رسد این است: اسم صاحب حساب و مقدار  پولی که درون حساب است؛ حالا باید از خودمان بپرسیم که هریک از این داده ها  چه جنسی دارند؟ واضح است که اسم صاحب حساب از جنس string است و برای مقدار  پول درون اکانت هم با مقداری تسامح می توانیم جنس float را انتخاب کنیم و  بعد برای هر یک از این داده ها اسم مناسب انتخاب می کنیم من برای نام صاحب  ownerName و برای مقدار پول balance را انتخاب می کنم پس تا به اینجای کار  class ما به این شکل در می آید:class BankAccount {    string ownerName;    float balance;}در مرحله بعد باید از خودمان بپرسیم که این حساب  بانکی چه رفتارهایی دارد؟ رفتارهایی که به ذهن می رسد یکی اعلام مقدار پول  درون حساب ، تعیین نام صاحب حساب، اعلام نام صاحب حساب، واریز پول به حساب و  برداشت پول از حساب.برای اعلام پول درون حساب مقدار balance را بر می گردانیم.برای تعیین نام صاحب حساب مقدار ownerName را برابر نام داده شده قرار می دهیم.برای اعلام نام صاحب حساب مقدار ownerName را بر می گردانیم.برای واریز پول به حساب باید توجه کنیم که اولا وقتی پول به حساب واریز می شود این مقدار واریز شده به مقدار  پول درون اکانت (balance) اضافه می شود و اینکه نمی شود مقدار منفی به  اکانت واریز کرد. برای برداشت پول از حساب اگر مقدار درخواست شده برای  برداشت پول بیشتر از مقدار پول درون اکانت باشد نباید اجازه برداشت داده  شود چون مقدار کلی پول فرد منفی می شود و این نادرست است و برای اینکه شخصی  که از اکانت برداشت می کند متوجه شود که مقدار مجازی درخواست کرده اگر  مقدار مجاز بود true و اگر مجاز نبود false را بر می گرداند.من  رفتار اعلام مقدار پول حساب را getBalance، اعلام نام صاحب حساب را  getOwnerName، واریز به حساب را deposit و رفتار برداشت از حساب را  withdraw می نامم، تا به اینجای کار تعریف class ما اینطور می شود:class BankAccount {    string ownerName;    float balance;     float getBalance() {        return balance;    }    string getOwnerName() {        return ownerName;    }    void setOwnerName(string name) {        ownerName = name;    }    void deposit(float amount) {        if (amount &gt; 0) {            balance = balance + amount;        }     }    boolean withdraw(float amount) {        if (amount &lt; balance) {            balance = balance - amount;            return true;        }        return false;    }}حال برای این معرفی ساده همین مقدار کفایت می کند و  class حساب بانکی ما آماده است که از روی آن اشیا جدید ایجاد کنیم پس در  شبه کد زیر ما می خواهیم در جایی از برنامه اشیایی جدید از این کلاس ایجاد  کنیم:{    kamalBankAccount = new BankAccount();    kamalBankAccount.setOwnerName(&quot;Kamal&quot;)    kamalBankAccount.deposit(100);    // returns true    kamalBankAccount.withdraw(20);     aliBankAccount = new BankAccount();    aliBankAccount.setOwnerName(&quot;Ali&quot;)    aliBankAccount.deposit(120);     // returns false    aliBankAccount.withdraw(200);     // output: &quot;Kamal&quot;    print( kamalBankAccount.getOwnerName() );    // output: 80    print( kamalBankAccount.getBalance() );     // output: &quot;Ali&quot;    print( aliBankAccount.getOwnerName() );    // output: 120    print( aliBankAccount.getBalance() );} پس با این مثال با امیدارم متوجه فرق بین یک class و  شئ از آن class شده باشید ما در تعریف کلاس فقط Property ها و منطق  (Methods) را مشخص می کنیم.وقتی شئ جدید از آن کلاس می سازیم حالا می  توانیم مقادیر Property ها را هم مشخص کنیم و توجه کنید که داده ها و  رفتارهای هر شئ از شئ دیگر جدا است.به فرآیند ساختن یک شئ در اصلاح فنی Instantiation می گویند.امیدوارم با مفاهیم پایه برنامه نویسی شئ گرا آشنا  شده باشید اگر این مفاهیم را فهمیده باشید مطالب بعدی بسیار آسان تر خواهد  بود درست است که بسیاری از مفاهیم دیگر مثل Abstraction, Encapsulation,  Polymorphism, Inheritance را در این پست پوشش ندادم اما تمام آنها چیزی  نیستند جز بازی با این مفاهیم پایه در پست های بعدی شما را با این مفاهیم  آشنا می کنم.</description>
                <category>Kamal Farahani</category>
                <author>Kamal Farahani</author>
                <pubDate>Sun, 03 Sep 2017 09:18:29 +0430</pubDate>
            </item>
                    <item>
                <title>شئ گرایی: قسمت دوم شئ در برنامه نویسی</title>
                <link>https://virgool.io/@Kamal/oop2-hceyeikuazgk</link>
                <description>در قسمت قبل فهمیدیم که شئ گرایی برای پاسخ دادن به چه نیازهایی به  وجود آمده و تعریف یک شئ در دنیای واقعی چیست حال می خواهیم به این  بپردازیم که اشیا در یک زبان برنامه نویسی چه هستند و چطور شباهت های  چشمگیری با اشیا در دنیای واقعی دارند.اگر به یاد داشته باشید در  پست قبل سه مولفه هویت، ویژگی ها و رفتارها چیزهایی بودند که در بین اشیا  در دنیای واقعی مشترک بودند و هر شئ بر اساس همین سه مولفه توصیف می  شدند.خوب حالا می رویم سراغ مولفه های اشیا در زبان های برنامه نویسی :  دقیقا همین سه مولفه چیزهایی هستند که اشیا را در یک زبان برنامه نویسی  توصیف می کنند بنابراین اگر شما با این سه در دنیای واقعی آشنا باشید نباید  مشکلی با آنها در یک زبان برنامه نویسی داشته باشید.یک شئ در یک  برنامه کامپیوتری هویت جدا از سایر اشیا دارد که با آدرس آن در حافظه مشخص  می شود همچنین ویژگی های مخصوص خودش را دارد یعنی اطلاعاتی که وضعیت کنونی  آن شئ را مشخص می کند و رفتارهای مخصوص خودشان را دارند یعنی کارهایی که می  توانند بکنند (بعدا خواهیم دید ویژگی ها و رفتارهای یک شئ در یک زبان چطور  تعریف می شوند).حالا از شما می خواهم به یک نکته خیلی مهم توجه  کنید : ما معمولا در دنیای واقعی اسم شئ را بر چیزهایی می گذاریم که می  توانیم ببینیم و یا حس کنیم اما بر اساس ویژگی هایی که در قسمت قبلی گفته  شد در برنامه نویسی می توانیم حتی این محدوده را گسترش دهیم به چیزهایی که  در دنیای واقعی نه می توانیم ببینیم و نه حس کنیم، برای مثال حساب بانکی یا  تاریخ یا رویداد؛ البته خواهش می کنم توجه کنید که همه ی این چیزهایی که  گفتم شامل تعریف شئ در دنیای واقعی می شوند مثلا حساب بانکی هویت مخصوص  خودش را دارد: حساب بانکی شما از حساب بانکی من جدا است، حساب بانکی ویژگی  های مخصوص خودش را دارد: نام شخصی که صاحب آن حساب است و مقدار پولی که  درون آن حساب است را نگهداری می کند، حساب بانکی  رفتارهای مخصوص خودش را  دارد: شما می توانید از یک حساب بانکی پول بردارید یا به آن پول واریز  کنید، می توانید حساب بانکی را باز یا بسته کنید، صد البته ممکن است شما در  برنامه ای که می نویسید شئ ای را داشته باشید که در دنیای واقعی هم به آن  شئ می گویند مثل شئ ماشین.و همانطور که خیلی از اشیا نمود فیزیکی  ندارند خیلی از آنها نمود تصویری هم روی صفحه کامپیوتر ندارند، البته هستند  اشیایی مثل دکمه و تصاویر و ... که نمود تصویری رو صفحه دارند اما همیشه  اینطور نیستند مثل شئ آرایه یا حساب بانکی.بنابراین تا اینجای کار به دو نتیجه خیلی مهم در مور اشیا در برنامه نویسی می رسیم:۱-اشیا همیشه نمود فیزیکی در دنیای واقعی ندارند.۲-اشیا همیشه نمود تصویری روی صفحه کامپیوتر ندارند.پس  ممکن است تا اینجا این سوال برای شما پیش بیاید که: پس من وقتی برنامه می  نویسم از کجا بفهمم که چیز جدیدی که می خواهم به برنامه ام اضافه کنم یک شئ  جدید هست یا نه؟تعریف کردن اشیا جدید وقتی که می دانیم چیزی که می  خواهیم یک شئ در دنیای واقعی مثل ماشین، کتاب یا میز هست آسان هست. اما  مشکل وقتی به وجود می آید که مثلا بخواهیم یک برنامه مدیریت رویدادها را  بنویسیم، آیا رویداد یک شئ است؟.خوب یک راه حل این است که ببینیم آن  چیز در تعریف شئ که قبلا ارائه کردیم می گنجد یا نه؟ اما اگر این راه به  نظر شما سخت است یک راه حل ساده تر برای این مشکل وجود دارد، ببنید کلمه آن  چیزی که می خواهید تعریف کنید یک اسم است یا نه؟ البته منظور من از اسم،  اسم اشخاص نیست بلکه تعریف اسم در زبان فارسی را مد نظر دارم:تعریف اسم : «کلمه ای است که برای نامیدن شخص یا حیوان و یا چیزی به کار می رود. مانند : سینما، زمین، آهو، زمان»اگر آن کلمه اسم بود (نه فعل یا صفت یا ...) یعنی آن چیز یک شئ جدید است.این  راه حل در اکثر موارد درست کار می کند و برای افرادی که تازه برنامه نویسی  شئ گرا را شروع کرده اند یک راه کار عالی است اما قطعا بعد از مدتی که فرد  حرفه ای شد دیگر نیازی به این کارها نیست و به صورت خودکار متوجه می شود  که چه چیز شئ است و نیست.در قسمت بعدی توضیح خواهم داد که چطور در زبان های برنامه نویسی مختلف اشیا تعریف و ساخته می شوند.</description>
                <category>Kamal Farahani</category>
                <author>Kamal Farahani</author>
                <pubDate>Sun, 03 Sep 2017 09:08:44 +0430</pubDate>
            </item>
                    <item>
                <title>شئ گرایی: قسمت اول تعریف شئ</title>
                <link>https://virgool.io/@Kamal/object-oriented1-shd4tv2agkeq</link>
                <description>اشیابرای فهمیدن یک راه حل ابتدا باید صورت سوال را فهمید؛ برنامه نویسی شی  گرا یک راه حل است برای یک مسائله قدیمی در برنامه نویسی و مهندسی نرم  افزار:چطور کدی بنویسیم که منعطف(در برابر غیرقابل تغییر)، شفاف(در برابر مبهم) و ساده(در برابر پیچیدگی غیر ضروری) باشد؟به این پرسش پاسخ های مختلفی داده شده و شئ گرایی یکی از این پاسخ ها است.تا اینجای موضوع به دو نتیجه مهم می رسیم:۱-شئ گرایی به انسان مربوط می شود نه به ماشین.۲-شئ گرایی یک الگوی برنامه نویسی هست.بنابراین دغدغه ما در برنامه نویسی شئ گرا تولید کدهای خوانا، منطعف و ساده هست.حال  ببینیم شی گرایی چطور در این هدف به ما کمک می کند: راه حلی که شی گرایی  پیشنهاد می دهد یک راه حل الهام گرفته از دنیای واقعی و طبیعت است خوب این  یعنی چی؟در دنیا یکسری شئ داریم که با اشیا دیگر در در تعامل و ارتباط  هستند. سوالی که در وهله اول پیش می آید این هست که اصلا تعریف شئ در طبیعت  چی هست؟ آیا یک سیب یک شئ است آیا یک میز یا ماشین بنر یک شئ است؟ جوابی  که هر انسانی به این سوال می دهد این است که بله قطعا اونها یک شئ هستند پس  ویژگی هایی که از یک شئ در ذهن ما هست اینها هستند:۱-ما متوجه  هستیم که اشیا از یکدیگر جدا هستند(وجود و هویت خودشان را دارند): برای  مثال وقتی به دو سیب شبیه هم نگاه می کنیم متوجه هستیم که با اینکه شبیه هم  هستند ولی اگر من یکی از سیب ها را بخورم دیگر سیب همچنان سالم باقی می  ماند اشیا در هم پیچیده نیستند برای مثال سیب و هواپیما دو شئ هستند که از  هم جدا هستند حال ممکن است ما یک سیب را داخل یک هواپیما ببریم اما با این  کار هرگز هویت سیب و هواپیما یکی نمی شود پس اشیا ممکن است اشیا دیگر را  داخل خود داشته باشند اما باز هم در این شرایط هویت و وجود این دو شئ از هم  جدا است.۲-هر شئ مشخصه های مربوط به خودش را دارد (ویژگی هایی که  وضعیت کنونی شئ را توصیف می کنند): یک سیب ممکن است زرد یا سبز یا قرمز  باشد یک لیوان ممکن است ظرفیت ۱ یا ۱۰ لیتر داشته باشد یک لامپ ممکن است  خاموش یا روشن باشد و این ها همان چیزهایی است که به عنوان مشخصه یا ویژگی  از یک شئ نامبرده می شود برای مثال ویژگی رنگ ویژگی ظرفیت یا ویژگی  روشن/خاموش بودن. ویژگی ها مقادیری از جنس خودشان دارند برای مثال ویژگی  ظرفیت با لیتر تعریف می شود و نمی توان گفت که لیوان من ۱۰ متر حجم آب  دارد. مقادیر این ویژگی ها وضعیت کنونی شئ را تعیین می کنند واضح است که  ویژگی یک شئ از اشیا دیگر جدا هست مثلا من لامپ اتاق خودم را خاموش می کنم  اما این کار تمام لامپ های جهان را خاموش نمی کند. اکثر اشیا  بیشتر از یک  ویژگی دارند یک لیوان می تواند حجم ۱ لیتر داشته باشد ولی در همان زمان  ممکن است زرد، آبی یا رنگ دیگری باشد.۳-در دنیای واقعی اکثر اشیا  رفتارهایی مخصوص نوع خود دارند: یک ماشین حرکت می کند یک سیب فاسد می شود  یک موبایل زنگ می زند و هرکدام از این رفتارها مخصوص نوع آن شئ است مثلا  دیده نشده که یک سیب زنگ بزند یا موبایل پرواز کند.در پست بعدی توضیح خواهم که چطور تعریف اشیایی که در برنامه نویسی داریم با تعریف اشیا در دنیای واقعی شباهت زیادی دارند.</description>
                <category>Kamal Farahani</category>
                <author>Kamal Farahani</author>
                <pubDate>Sun, 03 Sep 2017 08:59:00 +0430</pubDate>
            </item>
            </channel>
</rss>