<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های بهزاد علیزاده</title>
        <link>https://virgool.io/feed/@behzadalizadeh</link>
        <description>برنامه نویس</description>
        <language>fa</language>
        <pubDate>2026-06-16 11:37:58</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/60484/avatar/avatar.png?height=120&amp;width=120</url>
            <title>بهزاد علیزاده</title>
            <link>https://virgool.io/@behzadalizadeh</link>
        </image>

                    <item>
                <title>فهرست گزیده هایی از کتاب PRO ASP.NET CORE 6</title>
                <link>https://virgool.io/@behzadalizadeh/%D9%81%D9%87%D8%B1%D8%B3%D8%AA-%DA%AF%D8%B2%DB%8C%D8%AF%D9%87-%D9%87%D8%A7%DB%8C%DB%8C-%D8%A7%D8%B2-%DA%A9%D8%AA%D8%A7%D8%A8-pro-aspnet-core-6-ifmawaviwjdi</link>
                <description>سلام ، در اینجا فهرست بخش هایی از کتاب PRO ASP.NET CORE 6 نوشته ی Adam Freeman از انتشارات Apress رو با شما دوستان به اشتراک خواهم گذاشت. امید که مفید باشه.Pro Asp.net Core 6 بخش 1نگاهی گذرا به ساختار Asp.net core</description>
                <category>بهزاد علیزاده</category>
                <author>بهزاد علیزاده</author>
                <pubDate>Sun, 16 Oct 2022 14:39:05 +0330</pubDate>
            </item>
                    <item>
                <title>نگاهی گذرا به ساختار Asp.net core</title>
                <link>https://virgool.io/@behzadalizadeh/%D8%B3%D8%A7%D8%AE%D8%AA%D8%A7%D8%B1-aspnet-core-ycbi2flp8m3r</link>
                <description>✔ فهرست گزیده هایی از کتاب PRO ASP.NET CORE 6مایکروسافت Asp.net core رو به عنوان پلتفرمی برای توسعه وبسایت ارایه داده [ البته از نگاه صرفا نرم افزاری می تونیم  فریمورک هم بهش بگیم ]. جد بزرگوارش Asp.net اولیه، در سال 2002 معرفی شده بود که با چندین و چند بازنگری اساسی، در حال حاضر به نسخه پایدار Asp.net core 6 رسیده. [که در ماه نوامبر 2022 نسخه 7 اون ارایه می شه]  مطابق تصویر زیر، Asp.net core شامل پلتفرمی برای پردازش درخواست های سمت وب، یه سری فریمورک های اصلی برای توسعه برنامه ها، و همچنین فریمورک هایی کاربردی، برای ارایه امکانات کمکی هست.ساختار Asp.net coreدرباره Application Frameworks            این فریمورک ها مکمل همند و می تونن مشکلات متفاوتی رو حل کنند، یا در مواردی یک مشکل رو با راه حل های متفاوت حل کنند. فهم ارتباط بین این فریمورک ها به فهم تغییر در استفاده الگوهای طراحی (Design patterns) بستگی دارهفریمورک MVC فریمورک Razor pagesفریمورک Blazorفریمورک MVC فریمورک MVC تقریبا در زمان معرفی Asp.net، مدت ها قبل .Net core و .Net 6 معرفی شده بود. واژه MVC (کوتاه شده ی Model-View-Controller) ، الگوی طراحی ای است که با رعایت اصل تفکیک نگرانی ها (Separation of concerns)، حوزه های عملکردی برنامه رو به طور مجزا تعریف می کنه. نسخه های اولیه Asp.net، برای توسعه WebPageها از همون تجربه توسعه نرم افزار دسکتاپ استفاده می کردند؛ که نتیجه ش می شد پروژه های وب غیر قابل تحمل، با مقیاس پذیری(scalability) ضعیف!الگوی طراحی MVC راه حلی بود برای تولید صفحات وبی که با معماری نامشخص توسعه داده می شدند. نسخه های اولیه MVC بر پایه Asp.net ، به طور خاص برای تولید Web Pageها ارایه شده بودند.بعد ها با کوچ کردن از Asp.net به Asp.net core ، فریمورک MVC به صورت متن باز (Open source)، توسعه پذیر (Extensible) و چند سکویی (Cross-platform) بازتولید شد.گرچه در این کوچ، MVC به عنوان بخش مهمی از Asp.net core باقی موند اما با افزایش برنامه های تک صفحه ای (SPA)، روش استفاده از اون تغییر داشت. [ مثلا در نوشتن وب سرویس های مورد استفاده ، ما فقط از Model و Controller استفاده کرده و از View استفاده نمی کنیم ]الگوی MVC گام مهمی در سیر تکاملی Asp.net بود و بستری شد تا از مدل Web form رها بشه. برنامه های با مدل Web form ، دچار مشکلاتی در مدیریت و پنهان سازی جزییات درخواست ها و پاسخ های HTTP می شدنفریمورک MVC، در حقیقت به Asp.net جان داد و پایه و اساس این رو فراهم کرد تا به Asp.net core برسه؛ جوری که پشتیبانی از Web form را قطع و فقط در استفاده از الگوی MVC متمرکز شد.همونطور که Asp.net core تکامل یافت ، شیوه های دیگه ای در ساخت برنامه های تحت وب نیز پذیرفته شدند ، و فریمورک MVC تنها یکی از این شیوه های ساخت برنامه هاست.وجود شیوه های دیگه از مفید بودن MVC کم نمی کنه، اما الان MVC نقش محوری در توسعه برنامه ها در Asp.net core نداره ، و ویژگی هایی که قبلا منحصر در فریمورک MVC بود ، الان با شیوه های دیگه ای هم در دسترس هستند مانند Razor pages و Blazor.نتیجه این که برای توسعه برنامه ها در Asp.net core ، درک الگوی MVC دیگر یک پیش نیاز الزام آور نیست.فریمورک Razor pagesیه ایراد فریمورک MVC اینه که برنامه برای آماده سازی محتوا ، می تونه کارهای مقدماتی زیادی ببره. و در مورد WebPageها با وجود مشکلات ساختاری ، داستان این بود که ساخت یه برنامه ساده می تونست یکی دو ساعت زمان ببره.استفاده از Rezor pages توسعه ی صفحات وب رو دلپذیرتر کرده و در پیاده سازی ، از همون ویژگی های مورد استفاده در فریمورک MVC استفاده می کنه. با ترکیب کد و محتوا صفحات مستقلی ایجاد می شه که این بدون برخی مشکلات اساسی ، باعث افزایش سرعت توسعه صفحات وب می شه.می توان Razor pageها رو در کنار فریمورک MVC استفاده کرد. [ در واقع استفاده از MVC در بخش های اصلی برنامه و استفاده از Razor داخل View ]فریمورک Blazorدر فریمورک Blazor می توان در سمت UI برنامه ، یک صفحه وب رو با استفاده از زبان C# به جای زبان JavaScript ایجاد کرد.دو نسخه ی Blazor Server و Blazor WebAssembly داریم.Blazor Serverدر نسخه ی Blazor Server ، رویدادهای سمت مرورگر از طریق اتصال SignalR به سمت سرور ارسال می شودBlazor WebAssemblyدر نسخه ی Blazor WebAssembly ، اجرای برنامه سمت سرویس گیرنده (Client-Side) است بطوری که کدهای C# در مرورگر اجرا شوند.درباره Utility Frameworksفریمورک Entity Framework Core ، فریمورک ORM مایکروسافت است ، که داده های ذخیره شده در دیتابیس رو به عنوان اشیای دات نت ارایه می ده. در برنامه های دات نت معمولا برای دسترسی به دیتابیس استفاده می شه.و فریمورک Asp.net core Identity مایکروسافت برای اعتبارسنجی و بررسی دسترسی کاربران به امکانات نرم افزار استفاده می شه.درباره ASP.NET Core Platformپلتفرم Asp.net core دارای امکانات سطح پایین (low-level) مورد نیاز برای دریافت و پردازش درخواست HTML و همچنین ساخت پاسخ آن است.مجموعه ای است یکپارچه از HTTP Server ، سیستمی با کامپوننت های Middleware برای مدیریت درخواست ها، و امکانات اصلی که Application Frameworkها به اونا بستگی دارن، مانند URL Routing و Blazor view engine.ما بیشتر با Application frameworkها سروکار داریم اما برای اینکه استفاده موثری از Asp.net core داشته باشیم ، نیاز هست که قابلیت های قدرتمندی که پلتفرم ارایه می ده رو بدونیم. قابلیت هایی که فریمورک های سطح بالاتر،  بدون آن ها نمی توانند کاری از پیش ببرند.در آینده درباره نحوه عملکرد پلتفرم ، که زیربنای بسیاری از جنبه های Asp.net core هست ، بیشتر خواهیم دانست.درباره SignalR هم در بیانی کوتاه، برای برقراری کانال ارتباطی کم تاخیر بین دو برنامه استفاده می شه. و gRPC (Google Remote Procedure Call) هم استاندارد ارایه شده توسط گوگل هست که برای فراخوانی از راه دور متدهاست و می تونه در هر محیطی اجرا بشه (Cross-platform). اما از آن جایی که نیازمند کنترل سطح پایین روی پیام های HTTP داره، فعلا پیشنهاد خوبی در برنامه های تحت وب نیست. البته می توان از آن در ارتباطات بین Back-end serverها استفاده کردبرگرفته از کتاب Pro ASP.NET Core 6 (9th edition) نوشته ی Adam Freeman</description>
                <category>بهزاد علیزاده</category>
                <author>بهزاد علیزاده</author>
                <pubDate>Sun, 16 Oct 2022 14:35:05 +0330</pubDate>
            </item>
                    <item>
                <title>ابزار ORM به بیان ساده</title>
                <link>https://virgool.io/@behzadalizadeh/%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1-orm-%D8%A8%D9%87-%D8%A8%DB%8C%D8%A7%D9%86-%D8%B3%D8%A7%D8%AF%D9%87-tix1bau5w4lc</link>
                <description>نگاشت داده ها به انواع قابل فهم بین دو محیطبه بیان ساده ، هر محیطی داده ها رو در انواعی که برای خودش قابل فهم باشه نگهداری می کنه. اگر داده ای بخواد از محیطی به محیط دیگه انتقال پیدا کنه، باید یکی باشه براش قابل فهم کنه.برای نمونه اطلاعات شخصی رو در نظر بگیرید که ویژگی هایی مثل نام، نام خانوادگی، قد، وزن و ... داره.در محیط برنامه نویسی شی گرا ، این اطلاعات با عنوان شی (Object) شخص دیده می شه.  پیاده سازی به صورت کلاس (Class) شخص که دارای یه سری ویژگی (Property) هست.public class Person
{
        public long Id { get; set; }
        public string Name { get; set; }
        public string Family { get; set; }
        public int Age { get; set; }
}اما در محیط پایگاه داده رابطه ای ، این اطلاعات بصورت جدول (Table) شخص هست که ویژگی ها در یه سری ستون (Column) نگهداری می شه.Person tableحال به فرض می خوایم در محیط برنامه نویسی شی گرا، اطلاعات شخصی رو از محیط پایگاه داده رابطه ای واکشی کنیم.ما کد واکشی اطلاعات رو در زبان برنامه نویسی مورد نظرمون می نویسیم و دیگه کاری به کوئری نویسی سمت پایگاه داده نداریم.به بیان ساده ، ORM اون کد رو از ما میگیره ، به کوئری قابل فهم سمت دیتابیس تبدیل می کنه و به عنوان واسط ، نگاشت داده ها به انواع قابل فهم بین دو محیط رو فراهم می کنه.برای هر زبان برنامه نویسی ای ORM هایی وجود داره.مثلا برای زبان سی شارپ : EF Core ، NHibernate</description>
                <category>بهزاد علیزاده</category>
                <author>بهزاد علیزاده</author>
                <pubDate>Mon, 19 Sep 2022 15:11:45 +0430</pubDate>
            </item>
                    <item>
                <title>نصب Elasticsearch ، Logstash ، Kibana (ELK) به عنوان سرویس ویندوزی</title>
                <link>https://virgool.io/@behzadalizadeh/elk-t2b0mdotd3qt</link>
                <description>نصب Elasticsearch ، Logstash ، Kibana (ELK) به عنوان سرویس ویندوزی1 - نصب Elasticsearch به عنوان سرویس ویندوزیابتدا دانلود و نصب JDKسپس متغیر JAVA_HOME رو در Environment Variables حتما به صورت System Variable تعریف کرده و مقدار آن را مسیر نصب java تنظیم کنید. مثلا :C:\Program Files\Java\jdk-16.0.1دانلود Elasticsearchبعد دانلود در مسیری دلخواه از حالت فشرده درآورده ، وارد پوشه config شده و به انتهای فایل elasticsearch.yml این تنظیمات را اضافه کنیدnode.name: masternode.master: truenetwork.host: 0.0.0.0 # دسترسی از بیرون cluster.initial_master_nodes: [&amp;quotmaster&amp;quot]xpack.license.self_generated.type: basicالبته برای تمیزی فایل تنظیمات ، می توان موارد را یافته ، از حالت comment درآورده و تغییر دهید.حال وارد پوشه bin شده و cmd.exe را در همین مسیر اجرا و دستور زیر را اجرا کنید.\elasticsearch-service.bat install “&lt;service name&gt;”سپس دستور زیر را اجرا کنید.\elasticsearch-service.bat manager “&lt;service name&gt;”داخل پنجره‌ی باز شده، وارد تب Java بشید و مطمئن شوید که java.io.tmpdir دارای مقدار هستدر صورتی که این مقدار به طور کلی وجود نداشت یا خالی بود، با مسیر دلخواه ایجادش کنید-Djava.io.tmpdir=C:\elasticTempحال می توانید سرویس ویندوزی Elasticsearch  را از Services.msc مشاهده ، Service Type آن را از Manual به Automatic تنظیم و سپس Run کنید.بعد چند لحظه که Elasticsearch بالا آمد ، روی آدرس http://localhost:9200/ صفحه زیر قابل مشاهده هست2 – نصب Kibana به عنوان سرویس ویندوزیدانلود Kibanaدر مسیری دلخواه از حالت فشرده درآورده ، وارد پوشه config شده و برای اینکه از بیرون ماشین یا سرور هم بتوانیم به kibana دسترسی داشته باشیم ، تنظیم زیر را به انتهای فایل kibana.yml اضافه کنیدserver.host: &amp;quot0.0.0.0&amp;quotاگر Elasticsearch را در سرور دیگری نصب کرده اید ، عبارت elasticsearch.hosts  را با آدرس سرور Elasticsearch مقداردهی کنیدبرای نصب Kibana به عنوان سرویس، لازمه از ابراز NSSM استفاده کنیمبعد از دانلود و اکسترکت NSSM، وارد پوشه‌ای که داخل آن فایل nssm.exe وجود داره بشوید و به روش گفته شده در بالا، PowerShell یا Command Prompt رو اجرا کنید؛ بعد، این دستور رو وارد کنید.\nssm install kibanaمقدار Path را با مسیر فایل kibana.bat ، از پوشه ی kibanaیی که قبلا اکسترکت کرده اید پر کنید.سپس وارد سربرگ Dependencies شده و نام سرویس ویندوزی Elastic search یی که قبلا ساخته اید را بنویسیداگر نام سرویس ویندوزی Elasticsearch را فراموش کرده اید ، روی سرویس مزبور کلیک راست کرده ، در Properties ، مقدار Service name را ببینیدبا این کار تا زمانی که Elastic search بالا نیامده، Kibana اجرا نشود و اگر Elastic search متوقف شد، Kibana هم متوقف شود.سپس وارد سربرگ I/O شده و آدرس فایل‌های Log را به مسیری دلخواه مقداردهی کنیددر آخرین گام ، دکمه Install service را کلیک کنیداکنون در services.msc می توانید سرویس مورد نظر را ببینید.بعد از اجرای سرویس ویندوزی kibana و گذشت زمانی کوتاه [که بستگی به سیستم دارد] ، روی آدرس http://localhost:5601 ، kibana قابل مشاهده است3 – نصب LogStash به عنوان سرویس ویندوزیمی خواهیم لاگ هایی که سمت Mongodb درج می شوند را توسط Logstash به Elasticsearch بفرستیم تا index شوند.دانلود Logstashدانلود درایور جاوایی Mongodb از صفحه ی زیرhttps://dbschema.com/jdbc-driver/MongoDb.htmlتنظیمات در فایل configفایلی با نامی دلخواه مانند logstash.conf ایجاد کرده و با تنظیمات زیر مقداردهی می کنیم :input {
     jdbc {     jdbc_driver_library =&gt; &amp;quotF:/.../MongoDbJdbcDriver/mongojdbc3.1.jar&amp;quot     jdbc_driver_class =&gt; &amp;quotcom.dbschema.MongoJdbcDriver&amp;quot     jdbc_connection_string =&gt; &amp;quotjdbc:mongodb://&lt;IP&gt;/&lt;MongoDBName&gt;&amp;quot     jdbc_validate_connection =&gt; true     jdbc_user =&gt; &amp;quot&amp;quot     record_last_run =&gt; true     last_run_metadata_path =&gt; &amp;quotF:/.../path/.stored_sql_last_value_file&amp;quot     schedule =&gt; &amp;quot*/10 * * * * *&amp;quot     clean_run =&gt; false     use_column_value =&gt; true     tracking_column =&gt; &amp;quotTStamp&amp;quot     tracking_column_type =&gt; &amp;quotnumeric&amp;quot     sql_log_level =&gt; &amp;quotdebug&amp;quot     statement =&gt; &amp;quot          var lastValue = :sql_last_value          db.TestTbl2.aggregate([          {               $project :               {                    &#039;_id&#039;: false,                    &#039;Title&#039;: true,                    &#039;CreateDate&#039;: true,                    &#039;TStamp&#039;: {                         $subtract: [ &#039;$CreateDate&#039;, new Date(&#039;1970-01-01&#039;) ]                    }               }          },          {               $match: {                    &#039;TStamp&#039;: {$gt: lastValue}               }               },               { $limit: 1 },               { $sort:{ &#039;TStamp&#039;: 1 } }          ]); &amp;quot     }     }     output {          elasticsearch {               hosts =&gt; [&amp;quotlocalhost:9200&amp;quot]               index =&gt; &amp;quothbindextest&amp;quot               doc_as_upsert =&gt; true               document_id =&gt; &amp;quot%{[document][TStamp]}&amp;quot     }     stdout { codec =&gt; rubydebug }}jdbc_driver_library : مسیر درایور JDBC مربوط به MongoDBjdbc_connection_string : رشته اتصال به MongoDBlast_run_metadata_path : مسیر فایلی که حاوی آخرین مقدار tracking_column ایندکس شدهuse_column_value : آیا tracking_column استفاده شود؟tracking_column :ستون سمت MongoDB که می خوایم با مقدار آن متوجه شویم تا کجا ایندکس شده.ما برای آزمایش ، در کد واکشی ، ستون TStamp که سمت MongoDB وجود نداشت را ساختیم و از آن برای ردگیری استفاده کردیم.اگر ستون مورد نظر از قبل در MongoDB وجود داشته باشد ، تغییرات زیر را باید انجام داد تا Logstash بتواند آن ستون را یافته و از مقدار آن استفاده کندبه مسیر زیر برویدF:\...\logstash-7.13.3\vendor\bundle\jruby\2.5.0\gems\logstash-integration-jdbc-5.0.7\lib\logstash\plugin_mixins\jdbc\jdbc.rb : line 236تابع get_column_value(row) را تغییر دهیدpublicdef get_column_value(row)if !row.has_key?(@tracking_column.to_sym)     if !row.dig(:document, @tracking_column).nil?     @sql_last_value = row.dig(:document, @tracking_column)     elsif !@tracking_column_warning_sent     @logger.warn(&amp;quottracking_column not found in dataset.&amp;quot, :tracking_column =&gt; @tracking_column)     @tracking_column_warning_sent = trueend# If we can&#039;t find the tracking column, return the current value in the ivar@sql_last_valueelse# Otherwise send the updated tracking columnrow[@tracking_column.to_sym]endendبا این تغییر ستون مورد نطر را در زیر مجموعه document می یابدtracking_column_type : نوع tracking_column (یا numeric یا timestamp)از مسیر زیر قابل مشاهده استF:\...\logstash-7.13.3\vendor\bundle\jruby\2.5.0\gems\logstash-integration-jdbc-5.0.7\lib\logstash\inputs\jdbc.rb : line 174حال می توان به دو شیوه Logstash را اجرا کرد :اجرا از طریق cmdنصب به صورت سرویس ویندوزی توسط NSSM و اجرااجرای Logstash از طریق cmd1 - ابتدا Cmd را در این مسیر اجرا2 - و دستور زیر را وارد کنیدF:\...\logstash-7.13.3\bin\logstash -fF:\...\config\logstash.confنصب Logstash به عنوان سرویس ویندوزی1 – اجرای cmd به عنوان Administrator2 – اجرای دستور زیرF:\...\nssm-2.24\win64\nssm.exe install &lt;logstash service name&gt; &amp;quotF:\...\logstash-7.13.3\bin\logstash.bat&amp;quot &amp;quot-f F:\...\config\logstash.conf&amp;quotبرای شروعF:\...\nssm-2.24\win64\nssm.exe start &lt;logstash service name&gt;برای خاتمهF:\...\nssm-2.24\win64\nssm.exe stop &lt;logstash service name&gt;برای ویرایشF:\...\nssm-2.24\win64\nssm.exe edit &lt;logstash service name&gt;برای حذفF:\...\nssm-2.24\win64\nssm.exe remove &lt;logstash service name&gt;</description>
                <category>بهزاد علیزاده</category>
                <author>بهزاد علیزاده</author>
                <pubDate>Tue, 06 Sep 2022 10:59:34 +0430</pubDate>
            </item>
                    <item>
                <title>تفاوت Platform و Framework در دنیای برنامه نویسی</title>
                <link>https://virgool.io/@behzadalizadeh/platform-vs-framework-ngqkn5jrq4pf</link>
                <description> تفاوت Platform و Framework فریمورک (Framework) مجموعه ای از مولفه های صرفا نرم افزاری است که برای ساخت برنامه از آن استفاده می شود. مانند :فریمورک Asp.net coreفریمورک های AngularJs ، NodeJsفریمورک های Xamarin ، Flutterپلتفرم (Platform) مجموعه ای از مولفه های نرم افزاری و سخت افزاری است که محیط ساخت و اجرای برنامه را فراهم می کند.مانند : نرم افزار موبایل در پلتفرم Android یا پلتفرم IOS اجرا می شهوبسایت طراحی شده با فریمورک Asp.net core برای اجرا به پلتفرم Windows server نیاز داره</description>
                <category>بهزاد علیزاده</category>
                <author>بهزاد علیزاده</author>
                <pubDate>Thu, 01 Sep 2022 10:07:21 +0430</pubDate>
            </item>
                    <item>
                <title>اصول شی گرایی (۴ از ۴) : وراثت (Inheritance)</title>
                <link>https://virgool.io/@behzadalizadeh/%D8%A7%D8%B5%D9%88%D9%84-%D8%B4%DB%8C-%DA%AF%D8%B1%D8%A7%DB%8C%DB%8C-%DB%B4-%D8%A7%D8%B2-%DB%B4-%D9%88%D8%B1%D8%A7%D8%AB%D8%AA-inheritance-n6lhdv7ffqmo</link>
                <description>گذاشتن اطلاعات مشترک در یک کلاس اصلی (والد) و ارث بری دیگر کلاس ها از آندر دنیای واقعیموجودیت ها رو می تونیم به صورت سلسله مراتبی دسته بندی کنیم ؛ که هر زیرگروه ویژگی های گروه بالاتر خودش رو به ارث ببره.برای مثال  در ابتدا می توان &quot;سگ&quot; ها رو بر اساس برخی ویژگی های مشترکی مانند &quot;داشتن چهار پا&quot; و &quot;خز&quot; دسته بندی کرد. باز می شه اون ها رو با در نظر گرفتن نژادشون ، به زیرگروه هایی با ویژگی هایی مانند &quot;اندازه&quot; و &quot;رفتار&quot; دسته بندی کرد.در دنیای برنامه نویسی شی گرا !گذاشتن اطلاعات مشترک در یک کلاس اصلی (والد) و ارث بری دیگر کلاس ها از آنهمونطور که می دونیم در برنامه نویسی شی گرا همه چیز بر پایه ی شی (Object) یا در واقع نمونه هایی از کلاس (Class) هست. ما می تونیم اشیا (Objects) رو ، بر اساس ویژگی ها (Characteristics) و توابعشون (Functions) دسته بندی کنیم.اینجوری کار با اشیا ساده تر و خواناتر شده ، در نتیجه نگهداری و تولید در برنامه نویسی ساده تر خواهد شد. چون این امکان رو می ده که ما بیایم ویژگی های عمومی و مشترک بین اشیا رو بیرون کشیده و در یک شی اصلی (والد) بذاریم ، جوری که این ویژگی ها توسط آن اشیا (فرزندان) به ارث برده شه.برای نمونه می تونیم برای یک شرکت ، شی &quot;کارمند&quot; ایجاد کنیم و همه ویژگی های عمومی و مشترک کارمندان آن شرکت رو در اون بذاریم.بعد شی &quot;مدیر&quot; رو ایجاد کنیم که ویژگی های شی &quot;کارمند&quot; رو به ارث ببره و همچنین ویژگی هایی هم که خاص مدیر اون شرکت هست رو به شی &quot;مدیر&quot; اضافه کنیم.اینجوری اگر بعدا تغییراتی در شی &quot;کارمند&quot; بدیم ، به طور خودکار برای شی &quot;مدیر&quot; هم در نظر گرفته می شه.public class Manager : Employee { ... }کلاس اصلی یا والد (Base/Parent class) ، کلاسی است که توسط دیگر کلاس ها ارث بری می شود.کلاس مشتق شده یا فرزند (Derived/Child class) ، کلاسی هست که از کلاس اصلی ارث می برد.یک کلاس می تونه با ارث بری (Inherit) از کلاس دیگه ، کلاس اصلی رو سفارشی یا گسترش بده.وراثت از یک کلاس این امکان رو به ما می ده که از تابعی رو که در اون کلاس اصلی وجود داره بارها استفاده کنیم ، بدون اینکه مجبور باشیم هر بار شبیه همون تابع رو از ابتدا بسازیم.یک کلاس فقط مجازه از یک کلاس دیگه ارث بری کنه ولی خودش میتونه توسط تعداد زیادی کلاس دیگه به ارث برده شه برگرفته از :Beginning C# Object-Oriented Programming (Apress - Dan Clark)C# 8.0  in a Nutshell The Definitive Reference (OReilly - Joseph Albahari &amp;  Eric Johannsen)</description>
                <category>بهزاد علیزاده</category>
                <author>بهزاد علیزاده</author>
                <pubDate>Wed, 22 Jul 2020 12:10:39 +0430</pubDate>
            </item>
                    <item>
                <title>اصول شی گرایی (۳ از ۴) : چندریختی (Polymorphism)</title>
                <link>https://virgool.io/@behzadalizadeh/%D8%A7%D8%B5%D9%88%D9%84-%D8%B4%DB%8C-%DA%AF%D8%B1%D8%A7%DB%8C%DB%8C-%DB%B3-%D8%A7%D8%B2-%DB%B4-%DA%86%D9%86%D8%AF%D8%B1%DB%8C%D8%AE%D8%AA%DB%8C-polymorphism-ytdp1kiv6gz2</link>
                <description>انجام کاری یکسان با روش هایی متفاوتدر دنیای واقعی !برای درک ملموس تر ، در دنیای واقعی کاری یکسان رو در نظر بگیرید که به روش هایی متفاوت قابل انجام باشه. مثلا در بین حیوانات ، صحبت کردن با روش هایی متفاوت انجام می شه. ? گرگ با &quot;زوزه کشیدن&quot; ، سگ با &quot;هاپ هاپ&quot; و اردک با &quot;کواک کواک&quot; کردن ولی همشون دارن کار یکسان صحبت کردن رو انجام می دن.یا به کارگیری کلمات در زبان فارسی ، بسته به اینکه در چه جمله ای قرار بگیره معنای متفاوتی می گیره. برای مثال کلمه &quot;راست&quot; می تونه در یک جمله به معنی &quot;درست&quot; و در جمله ای دیگر به معنی &quot;مستقیم&quot; باشه.در دنیای برنامه نویسی شی گرا با دو روش زیر مفهوم چندریختی (Polymorphism) رو پیاده سازی می کنیم :استفاده از متدهایی که هم نام هستند ، ولی پارامترهای ورودیشون در تعداد ، نوع و ترتیب متفاوت باشه (Method overloading)بازنویسی متدی از کلاس اصلی ، در درون کلاس هایی که ازش ارث بردن (Method overriding)برگرفته از :Beginning C# Object-Oriented Programming (Apress - Dan Clark) C# 8.0  in a Nutshell The Definitive Reference (OReilly - Joseph Albahari &amp;  Eric Johannsen)</description>
                <category>بهزاد علیزاده</category>
                <author>بهزاد علیزاده</author>
                <pubDate>Tue, 14 Jul 2020 13:59:05 +0430</pubDate>
            </item>
                    <item>
                <title>اصول شی گرایی (۲ از ۴) : محصور سازی (Encapsulation)</title>
                <link>https://virgool.io/@behzadalizadeh/encapsulation-w1tiec0yexyv</link>
                <description>جلوگیری از دسترسی مستقیم به داده هامحصور سازی (Encapsulation) فرآیندی هست که اجازه نمی دیم دسترسی مستقیمی به داده ها وجود داشته باشه. بجاش داده ها پنهان هستند و با تعامل با یک شی (Object) به اون ها اجازه دسترسی می دیم.شما محصور سازی رو در زندگی روزمره تون می تونین ببینین. مثلا &quot;واحد منابع انسانی&quot; یه سازمان رو در نظر بگیرین ، اونها اطلاعات کارمندان رو محصور سازی (Encapsulation) و پنهان می کنن. اونها هستند که تعیین می کنن کدوم داده ها قابل استفاده باشن. در واقع هر درخواست اطلاعات کارمندی باید از مسیر واحد منابع انسانی رد بشه. مثال دیگه &quot;واحد فناوری اطلاعات&quot; هست که اطلاعات امنیتی شبکه از دید کاربران شبکه محصور سازی (Encapsulation) می شه. و هر نوع درخواستی برای اطلاعات امنیتی شبکه باید از طریق مدیر امنیت شبکه باشه.ما با محصور سازی داده ها ، کاری کرده ایم که داده های برنامه امن و قابل اطمینان باشن.از اونجایی که مشخص هست که چه داده هایی قابل دسترس هست و چه عملیاتی روی این داده ها انجام میشه ، نگهداری (Maintenance) برنامه راحت تر ، و اشکال زدایی (Debugging) آن بسیار ساده تر شه.برای اجرای محصور سازی (Encapsulation) ، از تغییردهنده های دسترسی (Access modifiers) در پیاده سازی ها استفاده می کنیم.برگرفته از :Beginning C# Object-Oriented Programming (Apress - Dan Clark) C# 8.0  in a Nutshell The Definitive Reference (OReilly - Joseph Albahari &amp;  Eric Johannsen)</description>
                <category>بهزاد علیزاده</category>
                <author>بهزاد علیزاده</author>
                <pubDate>Tue, 14 Jul 2020 01:40:44 +0430</pubDate>
            </item>
                    <item>
                <title>اصول شی گرایی (۱ از ۴) : مفهوم ذهنی انتزاع (Abstraction)</title>
                <link>https://virgool.io/@behzadalizadeh/abstraction-lbugjltilwua</link>
                <description>درک مفهوم انتزاع (Abstraction) وقتی در دنیای واقعی به دور و بر خودمون نگاه کنیم ، می تونیم یه سری موجودیت پیدا کنیم که بخشی از اونها با هم مشترک هست و یک مفهوم کلی و انتزاعی رو به ذهن میاره.&quot;اسب&quot; ، &quot;شتر&quot; ، &quot;فیل&quot; موجودیت هایی هستند ، که بهشون می گیم &quot;حیوان&quot;. (چرا؟)چون وقتی می گیم &quot;حیوان&quot; ، یعنی یه سری ویژگی و رفتار مشترک هم در &quot;اسب&quot; ، هم در &quot;شتر&quot; و هم در &quot;فیل&quot; وجود دارد.&quot;ماشین سواری&quot; و &quot;ماشین باربری&quot; موجودیت هایی هستند ، که بهشون می گیم &quot;خودرو&quot;. (چرا؟)چون وقتی می گیم &quot;خودرو&quot; ، یعنی یه سری ویژگی و رفتار مشترک هم در &quot;ماشین سواری&quot; و هم در &quot;ماشین باربری&quot; وجود دارد.مثلا در دنیای واقعی هر موجودیتی که در ویژگی ها (Attributes) و رفتارهای (Behaviors) زیر مشترک باشند ، به عنوان &quot;خودرو&quot; می شناسیم.ویژگی ها (Attributes) :چرخمیزان سرعتفرمانصندلیچراغبوقرفتارها (Behaviors) :حرکت کردنروشن و خاموش شدنروشن کردن مسیر حرکت در شببوق زدنیه چیزی! در مثال بالا برای مفهوم انتزاعی &quot;خودرو&quot; ، ویژگی ها (Attributes) و رفتارهای (Behaviors) دیگه ای وجود نداشت که بگیم؟ چرا فقط همین چند تا رو گفتیم؟نکته اینجاست که در انتزاع کردن (Abstraction) ،  بسته به نیاز فقط اون مواردی که می خوایم قابل مشاهده باشه رو بیان می کنیم و مواردی که از نظر ما مهمه و نباید قابل مشاهده باشه رو ذکر نکرده تا پنهان بمونن.مثلا راننده نیاز داره بدونه که سرعت خودرو چقدره ، اما به دلیل اتوماتیک بودن خودرو نمی خوایم بدونه که تعداد دور در دقیقه موتور (RPM) چقدره! پس در بین ویژگی های مفهوم &quot;خودرو&quot; ، ویژگی RPM رو بیان نکردیم تا پنهان باشه.اما چرا به &quot;خودرو&quot; و &quot;حیوان&quot; مفاهیم انتزاعی (Abstract) می گیم؟این ها مفاهیمی ذهنی و کلی هستند که در دنیای واقعی ، به خودی خود وجود ندارند و قابل پیاده سازی نیستند.اگر به کسی بگین که &quot;من حیوان دیدم&quot; ، بهتون می گه چه نوع حیوانی؟ یا اینکه &quot;من خودرو خریدم&quot; ، می گه چه نوع خودرویی؟ چون مفهومی ذهنی ، طرحی کلی ، و الگویی هستند که انواعی از آن ها در دنیای واقعی پیاده سازی شده اند نه خود آن ها.آنچه در دنیای واقعی می بینیم ، انواعی از خودرو یا انواعی از حیوان هستند که پیاده سازی شده اند.در برنامه نویسی شی گرا !در برنامه نویسی شی گرا کلاس های Abstract یی داریم که به خودی خود اجازه نمونه سازی (Instantiate) ندارن ؛ ولی می تونیم از کلاس هایی دیگه که ازشون ارث بری کردن نمونه (Instance) بگیریم.به کلاس های قابل نمونه سازی می گن Concrete Classes و به کلاس هایی که نمی شه ازشون نمونه گرفت می گن Abstract Classesاینترفیس ها و کلاس های Abstract ، ابزارهایی هستند برای تعریف مفاهیم انتزاعی.برگرفته از :Beginning C# Object-Oriented Programming (Apress - Dan Clark) C# 8.0  in a Nutshell The Definitive Reference (OReilly - Joseph Albahari &amp;  Eric Johannsen)</description>
                <category>بهزاد علیزاده</category>
                <author>بهزاد علیزاده</author>
                <pubDate>Sat, 11 Jul 2020 12:30:12 +0430</pubDate>
            </item>
            </channel>
</rss>