<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های سبحان عطار</title>
        <link>https://virgool.io/feed/@sobhanattar</link>
        <description>علاقه‌مند به تکنولوژی، انسانیت و تحول</description>
        <language>fa</language>
        <pubDate>2026-06-07 05:40:17</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/7703/avatar/3uoZEM.png?height=120&amp;width=120</url>
            <title>سبحان عطار</title>
            <link>https://virgool.io/@sobhanattar</link>
        </image>

                    <item>
                <title>کاتلین در برابر جاوا! آیا باید از کاتلین برای توسعه اندروید استفاده کنیم؟</title>
                <link>https://virgool.io/Software/%DA%A9%D8%A7%D8%AA%D9%84%DB%8C%D9%86-%D8%AF%D8%B1-%D8%A8%D8%B1%D8%A7%D8%A8%D8%B1-%D8%AC%D8%A7%D9%88%D8%A7-%D8%A2%DB%8C%D8%A7-%D8%A8%D8%A7%DB%8C%D8%AF-%D8%A7%D8%B2-%DA%A9%D8%A7%D8%AA%D9%84%DB%8C%D9%86-%D8%A8%D8%B1%D8%A7%DB%8C-%D8%AA%D9%88%D8%B3%D8%B9%D9%87-%D8%A7%D9%86%D8%AF%D8%B1%D9%88%DB%8C%D8%AF-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%DA%A9%D9%86%DB%8C%D9%85-ucqf5kmhzamw</link>
                <description>دیروز داشتم میچرخیدم در وب و به یک مطلب جالبی برخورد کردم که این سوال را مطرح میکرد که برای توسعه اندرویید باید از جاوا استفاده کنیم یا کاتلین؟ چندین وبلاگ را چک کردم و دیدم که موضوع گسترده‌ایه و موافق و مخالف های زیادی داره و هرکدوم هم دلایل خودشون را دارند. اما قبل از اینکه اصلا بخوایم راجع به اینکه جاوا یاد بگیریم یا کاتلین میتونیم این سوال را مطرح کنیم که چرا توسعه اندروید را یاد بگیریم؟!پاسخ به این سوال میتونه این باشه که دور تا دور ما را ابزارهایی گرفتند که بستر آن‌ها سیستم عامل اندرویید یا iOS هست. تلویزیون‌ها، ماشین‌ها، تلفن‌های همراه و یک عالمه چیز دیگه و خوب توی این بازی اندرویید با ۲ میلیارد کاربر فعال در ماه - تایید یا رد نمیکنم - بیشترین میزان گستردگی سیستم عامل را داره. بنابراین شما اگر توسعه اندرویید را یاد بگیرید قادر خواهید بود به جمع ۳.۳ میلیارد اپلیکیشنی که توی گوگل پلی هست بپیوندید. و طبیعتا چون نیاز بازار دنیا و ایران هم هست درآمد خوبی کسب کنید.اما داستان جاوا و کاتلین چیه؟خوب سال‌های سال جاوا به خاطر ویژگی‌های اصلی مثل شی‌گرا بودن، سادگی و قابلیت انتقال و امنیت برای توسعه برنامه های اندروییدی مورد استفاده قرار گرفته. و خوب اندرویید هم با اتکا به جاوا تقریبا روی هر پلتفورمی قابل اجرا بوده و همچنان هم زبان بسیار قدرتمندی برای توسعه اپ موبایل اندروییدی هست.اما موضوعی که وجود داره اینه که جاوا هم مثل هر زبان کامپایلری دیگه‌ای محدودیت های خودش را داره:توی نسخه های قدیمی مثل Java SE 8 و Java SE 7 که از قضا  اغلب برنامه‌نویس‌ها هم از اون استفاده میکنند، تولید خطا میکنه.برنامه‌نویس‌هایی که از جاوا برای توسعه اندرویید استفاده میکنند از نبود برخی از ویژگی‌ها مثل استریم‌ها، لامبدا، متد رفرنس و ... شاکی هستند.یک مشکل اساسی میلیارد دلاری توی جاوا روش هندل کردن null در برنامه است که توی قسمت ۴ کاتلین راجع بهش صحبت کردیم: NullPointerException.  http://vrgl.ir/3tDYs و نکته آخر اینکه برای انجام یک کار خیلی ساده توی جاوا باید کلی کد بزنید :)خوب حالا راه حل چیه؟ کاتلین :)سال ۲۰۱۱ که مغزهای پشت JetBrains در روسیه کم کم به این نتیجه رسیدن که این داستان‌های جاوا داره دردسر ساز میشه تصمیم گرفتند یک زبانی را ارایه کنند که بهترین های جاوا و سایر زبان‌های برنامه‌نویسی بعلاوه کمبودهای جاوا را درخودش داشته باشه. عالیه نه؟خروجی این تفکر شد زبان کاتلین. یک زبان متن باز، با بررسی نوع‌ها در زمان کامپایل و قابل اجرا روی ماشین مجازی جاوا. محبوبیت این زبان هم دلایل زیر میتونه باشه:کد کمتری میزنید و برنامه‌های کوچکتری- با همان عملکرد معادل در جاوا - و با کد خواناتر توسعه میدید.با کدهای جاوایی که زدید همخوانی داره. در نتیجه میتونید جاوا را با کاتلین قاطی کنید.فریمورک جاوا را بازپیاده‌سازی نکرده. و از ویژگی‌هایی مثل سیستم ساخت دوری کرده چون نمونه‌های متن بازش هستن.اپ ها کمتر کرش میکنند چون مشکل NullPointerException را هندل کرده در زمان توسعه زبان.و این اطمینان را داده که اندرویید استادیو ۳ کاتلین را ۱۰۰ درصد پشتیبانی میکنه.و از همه مهمتر اینکه گوگل در کنفرانس Google I/O 2017 زبان کاتلین را به عنوان زبان رسمی توسعه اندرویید اعلام کرد.خلاصه اینکه اگر تجربه قبلی در توسعه اندرویید ندارید کاتلین برای شماست :) ولی اگر از دوستان جاوایی هستید :) کاتلین یک چیز جدیده. یادگرفتنش براتون سخت نیست و زندگی را راحت‌تر میکنه. البته یچیزی را هم بگیم سوء تفاهم نشه: معنی این حرفهایی که زدیم این نیست که جاوا در غروب خودشه و این حرفا؛ خیر. همچنان زبان بسیار قدرتمندیه و بسیاری از ابزارها در حوزه‌های مختلف با این زبان توسعه داده شده که زندگی بدون آنها بسیار سخت میبود!اما خوب اینکه کاتلین در حوزه توسعه موبایل - و خوب در آینده در بسیار دیگر از حوزه‌ها حتی iOS - خیلی از مشکلات و محدودیت‌ها را برطرف کرده میتونه این زبان را برای کسانی که میخوان شروع کنن یا قصد یادگرفتن یک زبان جدید را دارن گزینه بسیار ایده‌الی بکنه.</description>
                <category>سبحان عطار</category>
                <author>سبحان عطار</author>
                <pubDate>Sun, 05 Aug 2018 19:17:16 +0430</pubDate>
            </item>
                    <item>
                <title>کاتلین یاد بگیریم! (قسمت ۶)</title>
                <link>https://virgool.io/@sobhanattar/%DA%A9%D8%A7%D8%AA%D9%84%DB%8C%D9%86-%DB%8C%D8%A7%D8%AF-%D8%A8%DA%AF%DB%8C%D8%B1%DB%8C%D9%85-%D9%82%D8%B3%D9%85%D8%AA-%DB%B6-wdym2hxnnfsd</link>
                <description>کنترل گردش اجرا - Flow Controlسلام و روزبخیر به همه. این هفته بر اساس قولی که داده بودیم میخوایم بریم سراغ «کنترل گردش» یا  Flow Control, در زبان برنامه‌نویسی کاتلین(Kotlin) و قطعا مطالعه قسمت قبل مثل همیشه ضروری هست: http://vrgl.ir/RqYpA در زبان برنامه‌نویسی Kotlin گردش کار و قواعد مورد استفاده در اون بسیار شبیه به زبان‌های دیگه هست. اما بگذارید قبل از اینکه وارد دستورات بشویم، یک توضیحی بدیم در مورد مفهوم کنترل گردش برای کسایی که دارن همزمان با ما برنامه‌نویسی را هم یاد میگیرن:تعریف ساده «کنترل گردش»:تغییر فرآیند اجرای دستورات بر اساس یکسری شروط منطقی با خروجی‌های بله و خیر یا درست و غلط و تصمیم‌گیری روی آن‌ها. مثال: فرآیند درست کردن ماکارونی. مثلاْ توی مرحله اول پختن ماکارونی این سوال را از خودمون میپرسیم که: «آیا ماکارونی داریم؟». اگر(if) جواب مثبت(true) باشه یک کاری میکنیم - مثلا میریم آب داغ میکنیم یا بررسی میکنیم ببینیم سس داریم یا نه - و در غیر اینصورت(else) اگر پاسخ منفی(false) باشه اونوقت یک کار دیگه ای میکنیم - مثلاً میریم ماکارونی میخریم.با این تعریف ساده و نشانه‌هایی که از خودمون در توضیح به جا گذاشتیم میتونیم بریم سراغ اصل ماجرا. در زبان کاتلین دو - یا به عبارتی  هم سه - دستور برای کنترل اجرای برنامه if و  if..else و when.گزاره کنترل گردش ifاولین دستور کنترل گردش دستور if هست. ساختار این دستور به شکل زیر هست: https://gist.github.com/sobhanattar/2113630bdbaad07bed922dfd9b0a9214 در این دستور و در تمام دستورات کنترل گردش مقدار condition تنها می‌تواند مقدار درست  true  یا غلط false داشته باشه. در صورتی که حاصل condition برابر true باشد، گزاره‌های داخل شرط اجرا شده و در غیر اینصورت این دستور اجرا نمیشه. یک مثال دیگه ببینیم: https://gist.github.com/sobhanattar/150d396333c95d44e1a46ae4adb60b7b همونطور که در مثال بالا میبینیم، چون باقی‌مانده number به 2 مقدار 0 دارد و در نتیجه شرط خروجی true دارد، دستورات داخل گزاره شرط اجرا می‌شود. همونطور که گفتیم condition میتونه هر گزاره شرطی باشه که خروجی true یا false داشته باشه. در مثال زیر ما از کلمه کلیدی is برای بررسی نوع ثابت number استفاده کردیم که خروجی آن true یا false هست استفاده کردیم: https://gist.github.com/sobhanattar/9da797bc550c9267d5479e458503e241 گزاره کنترل گردش if..else گزاره if..else روش عملکردش این هست که اگر مقدار condition حاصلش true باشه گزاره‌های داخل if اجرا میشه و اگر حاصل false باشه گزاره‌های داخل else اجرا خواهد شد.  https://gist.github.com/sobhanattar/aa43fe1820fdd0fa7d96b512fb5c5b75 مثال زیر میتونه گویاتر باشه: https://gist.github.com/sobhanattar/33b17b04051fe12ba1907467c7689dd4 همونطور که در مثال بالا میبینیم چون شرط  number % 2 == 0 صادق نیست گزاره‌های داخل  else اجرا شده و خروجی بالا را ایجاد می‌کند. اما یکی از ویژگی‌های فوق‌العاده‌ای که کاتلین داره و خیلی از زبان‌ها ندارند و واقعاً کاربردیه اینه که شما میتونین خروجی اجرای دستورات داخل if..else  را به عنوان مقدار بازگشتی یا return value داخل یک متغیر بریزین! مثال زیر را ببینیم: https://gist.github.com/sobhanattar/caa972f292fc1eb5b352853a7c2afaee همونطور که در مثال بالا میبینیم ما مقدار داخل else را در متغیر result ریختیم و بعد از if..else آن را چاپ کردیم. دقت کنیم ما اینجا از کل if..else به عنوان یک گزاره که یک نتیجه برمیگردونه استفاده میکنیم و در نتیجه این فرآیند برای if تنها امکان‌پذیر نیست و اگر این کار را بکنیم خطای زیر را دریافت میکنیم: https://gist.github.com/sobhanattar/164ac0070909c6425021be2dec2caeaf نکته دیگه‌ای که وجود داره اینه که اگر ما داخل بخش if یا else بیش از یک مقدار برگشتی داشته باشیم فقط مقدار آخر برمیگرده: https://gist.github.com/sobhanattar/809fa2cf10013b26fc9e7df61034f87c و اینکه این مقدار بازگشتی برای هر نوعی امکانپذیره: https://gist.github.com/sobhanattar/0e74090bb1f1692e6e5285eb5c8ffb71 در واقع با این روش کاتلین نیاز به اپراتور سه‌گانه یا ternary operator را حذف کرده و دیگه نیازی بهش نیست.توجه کنید که شما هر تعداد if..else را که بخواهید میتونید توی هم استفاده کنید تا بتونید به بهترین شکل کنترل گردش کدتون را به دست بگیرید ولی حواستون باشه که استفاده if های تو در تو یا nested if میتونه بعداً در بازبینی و نگهداری و تغییر در کد کارتون را خیلی سخت کنه. پس سعی کنید تا میتونید if..else های ساده داشته باشید و برید به سمت if-less programming یا برنامه‌نویسی بدون if .گزاره when گزاره  when که در زبان‌های مختلفی مانند ++C و Java و PHP و غیره با نام‌  switch..case شناخته میشه، کارکردش تصمیم‌گیری در مورد مقدار ورودی به آن هست و بسیار قدرتمندتر از  switch..case است. گزاره when قابلیت انجام اعمال مختلفی روی مقادیر انواع کاتلین مثل  Int   Byte ،  String و  Short و یا هر شی دیگری دارد. مثال زیر را ببینیم: https://gist.github.com/sobhanattar/7d1f37f4f0a93333cf96acd28e84bae8 در مثال بالا  گزاره when مقدار number را بررسی کرده و بر اساس مقدار آن و مقادیری که داخل آن وجود دارد اقدام به تصمیم‌گیری می‌کند که در بالا منجر به چاپ گزاره داخل else که معادل break در switch..case است، شده است. حالا اگر بخواهیم بیش از یک دستور را در زمان یافتن مقدار مورد بررسی در when  انجام دهیم میتونیم از {} استفاده کنیم: https://gist.github.com/sobhanattar/a4d60d3771093c80a66882e7c1df9b45 علاوه بر این میتونیم برای چند مقدار یک عمل خاص را انجام دهیم: https://gist.github.com/sobhanattar/d04162e2b82d56830bdf302599b5537f خوب اینم از بحث گردش کنترل. متوقف نشید و مثال حل کنید. </description>
                <category>سبحان عطار</category>
                <author>سبحان عطار</author>
                <pubDate>Tue, 03 Jul 2018 15:01:55 +0430</pubDate>
            </item>
                    <item>
                <title>کاتلین یاد بگیریم! (قسمت ۵)</title>
                <link>https://virgool.io/@sobhanattar/%DA%A9%D8%A7%D8%AA%D9%84%DB%8C%D9%86-%DB%8C%D8%A7%D8%AF-%D8%A8%DA%AF%DB%8C%D8%B1%DB%8C%D9%85-%D9%82%D8%B3%D9%85%D8%AA-%DB%B5-tnlvvv6lzx7x</link>
                <description>حلقه‌ها - Loopsسلام به دوستان عزیزم و همراهان جانم. قبل از هرچیز باید عذرخواهی بکنم که برنامه هفتگیمون بهم ریخت و هفته قبل محتوایی نگذاشتم. یک ساز و کار جدید برای خودم گذاشتم و اون اینکه از این به بعد حجم مطالب را کمتر میکنم و روال یک هفته را رعایت خواهم کرد. چون به نظر خودم استمرار در این کار مهمتر از حجم مطلب هر دفعه هست. عذرخواهی من را پذیرا باشید و منتظر استمرار باشید :)خوب امروز روز حلقه‌ ها است. بدیهیه برامون که اگر میخواهیم این قسمت را بخونیم باید قسمت قبلی را خونده باشیم https://virgool.io/@sobhanattar/%DA%A9%D8%A7%D8%AA%D9%84%DB%8C%D9%86-%DB%8C%D8%A7%D8%AF-%D8%A8%DA%AF%DB%8C%D8%B1%DB%8C%D9%85-%D9%82%D8%B3%D9%85%D8%AA-%DB%B4-hmkm6adugdpw در زبان برنامه‌نویسی کاتلین ۵ نوع حلقه وجود داره:whiledo-while forforEach repeat ۱. حلقه while حلقه‌ها به طور کلی برای این هستند که ما یک مجموعه از دستورات را برای تعداد مشخصی و یا تا رسیدن به شرایط مشخصی تکرار کنیم. استفاده از حلقه while در زبان کاتلین خیلی شبیه به زبان‌هایی مثل جاوا و PHP است: https://gist.github.com/sobhanattar/2405e18d859f741b2c8b5b0ce7943f6c در مثال زیر میتونیم بهتر ببینیم چه اتفاقی میفته: https://gist.github.com/sobhanattar/bc5d4659353175461aafd14f79a39913 در این حلقه مادامیکه مقدار fuel کوچتر از  5 هست، مقدار fuel چاپ میشه و به مقدارش یکی اضافه میشه. هر زمان که مقدارfuel بزرگتر از  5 شود آنگاه پیامی مبنی بر اینکه  fuel is 5 است چاپ می شود.۲. حلقه do..whileعلاوه بر حلقه while کاتلین شامل حلقه do..while هست. اصلی‌ترین تفاوت این دو تا حلقه این هست که حلقه do..while همیشه حداقل یکبار اجرا میشه. به عبارت دیگه اگر شما از این حلقه استفاده می‌کنیم قصد داریم که حداقل یکبار کد داخل do..while اجرا شود. این موضوع در ساختار این حلقه مشهوده. ببینیم: https://gist.github.com/sobhanattar/7f1de188fabc39f6b41ceb4a17e1e1d2 و مثال زیر بهتر این تفاوت را نشون میده: https://gist.github.com/sobhanattar/2a7b0439867ab2f104f658e78a5d2676 همونطور که در این مثال میبینیم اینجا با وجود اینکه شرط ما برای اجرای این هست که fuel بزرگتر از  1 باشه ولی همونطور که میبینید علیرغم اینکه fuel مقدار 1 داره اما باز هم شرط یکبار اجرا میشه.یک نکته و اون اینکه مراقب شرط‌ها باشیم. چون بعضی وقت‌ها شرط‌های پایانی رخ نمیدهند و در یک حلقه بی نهایت یا Infinite Loop خواهیم افتاد و این خطا را میگیریم: https://gist.github.com/sobhanattar/f5ec08f1ad0c2938ced39548d4e68183 ۳. حلقهfor ساختار حلقهfor با ساختار این حلقه در بسیاری از زبان‌ها از جمله جاوا متفاوت است. ساختار این حلقه به شکل زیر است: https://gist.github.com/sobhanattar/21fad3742fa1a25c59693aa1d0ba9b04 در زبان کاتلین حلقه for روی range ها و دیگر ساختارهای گردش‌پذیر یا iterable ها کار میکنه. اما برای توضیح range یا بازه و کارکرد حلقه بهترین کار زدن یک مثاله :) https://gist.github.com/sobhanattar/95741148a101af21919b77e962785dbe همانطور که در مثال بالا میبینید حلقه for روی اعداد بین 1 تا 5 حرکت کرده و هربار با نسبت دادن یکی از این اعداد به متغیر a، اون را چاپ میکنه. به عبارت دیگه در هر تکرار، حلقه for مقدار بعدی در range را به متغیر a نسبت میده و در داخل حلقه ما میتونیم از این متغیر استفاده کنیم. حلقه for این امکان را به ما میده که روی بازه‌ها، کالکشن‌ها و سایر ساختارهای گردش‌پذیر(iterables) - که در مورد آن‌ها در پست های بعدی صحبت خواهیم کرد - حلقه را اجرا کنیم.اما برای اینکه اینجا بازار داغه الان در مورد آرایه‌ها هم یک مثال میاریم. برای گردش و با توجه به اینکه نیاز داریم به اندیس آرایه برای اشاره به آیتم مورد نظرمون دو روش وجود داره. یکی استفاده از تابع ()withIndex است و دیگری ویژگی indices آرایه. بریم براشون مثال ببینیم: https://gist.github.com/sobhanattar/0e185ce5d6e09e3987ece998364fa073 همانطور که در مثال بالا میبینیم ما برای گردش روی آرایه از تابع ()withIndex روی آرایه numbers استفاده کردیم. همونطور که میبینیم این تابع هر آیتم آرایه در قالب index و value داخل دو متغیری که در ابتدای حلقه ()for قرار دادیم میذاره و داخل حلقه میتونیم ازشون استفاده کنیم.توجه کنیم نام  index و value اختیاری هست و میتونه هر نامی باشهدر نحوه استفاده از indices مثال زیر کاملا گویاست: https://gist.github.com/sobhanattar/939dd9d25e83299424ecf5490db4befc همونطور که در این مثال میبینیم ما با استفاده از ویژگی indices مقدار ایندکس یا شاخص آرایه numbers را داخل متغیر index قرار میدهیم و داخل حلقه با استفاده از اون متغیر میتونیم به المان‌های آرایه دست بیابیم.توجه کنید نام index اختیاری هست و میتونه هر نامی باشهخوب اما یسری نکات باحال بگیم در مورد حلقه  for  و  بازه‌‌‌ها. اینارو تند میگیم اینجا و مثال میزنیم ولی لازمه که حتما باهاشون مثال‌های خلاقانه حل کنید:۱. نکته باحال اینه که range را نمیتونید برعکس استفاده کنید یعنی نمیتونید  1..10 توی حلقه  for بذارید. برای این منظور باید از کلمه کلیدی downTo استفاده کنیم:کلمات کلیدی یا keywords کلماتی هستد که شما نمیتونید از آن‌ها به عنوان نام در برنامتون استفاده کنید. https://gist.github.com/sobhanattar/ca3bb2536b88b02adf60539f3a210046 همونطور که میبینیم براتون سر و ته چاپ میکنه :)۲. برای حذف کردن آخرین مقدار در بازه از کلمه کلیدی  until استفاده میشه:  https://gist.github.com/sobhanattar/04bfa3b07bbc2a431eea89f232d3f8af همونطور که میبینید عدد 4 در خروجی نیست.۳. برای پریدن از روی مقادیر در range از کلمه کلیدی  step استفاده میشه:  https://gist.github.com/sobhanattar/cac7fa2d653ffb58fb4cf4ad0e4b1202 ۴. و خوب میتونیم این‌ها را با هم ترکیب هم بکنیم. سعی کنید با ترکیب این دستورات برنامه های خلاقانه بنویسید. مثلا چاپ اعدد فرد، یا اعداد اول و ... https://gist.github.com/sobhanattar/a36912e3e927daeb92baf863eeaf1acb ۴. حلقه forEach حلقه forEach بدون شک یکی از بهترین انواع حلقه هست که اختراع شده. این نوع حلقه را به دو شکل میشه استفاده کرد. یکی با استفاده از it و یکی هم به شکل توابع بی‌نام یا Lambda Expressions. به مثال‌های زیر توجه کنید: https://gist.github.com/sobhanattar/929c290a3a05b320d108ba1e804484ca در مثال بالا it یک متغیر کلیدی است. یعنی نمیتونید با نام دیگری جایگزینش کنید. این متغیر در واقع روی اعداد موجود در بازه حرکت میکنه و در هربار اجرا، it حاوی عدد بعدی در بازه اعداد 2  تا 5  است. اما اگر حتما بخواین از نام it استفاده نکنین میتونین به این شکل و با استفاده از  Lambda حلقه را بازنویسی کنید: https://gist.github.com/sobhanattar/26c6cc9ea73ea96eae44850fac2aafcf در این مثال همون شرایطی که برای it برقرار بود برای i هم برقرار هست، با این تفاوت که میتونید  i را با هر نام متغیری جایگزین کنید. البته ما در آینده مفصل در مورد توابع و توابع بی‌نام صحبت خواهیم کرد.۵. حلقه repeat آخرین حلقه‌ای که امروز در موردش صحبت میکنیم حلقه repeat هست. این حلقه به ما اجازه میده که برای تعداد دفعات مشخصی دستورات مورد نظرمون را اجرا کنیم: https://gist.github.com/sobhanattar/526459d7e30d5a3f0fe73605c7d7810c در مثال بالا ما برای 3 بار خروجی هایی که میبینید را پشت سر هم تولید میکنیم. توجه کنید که تعداد دفعات تکرار به عنوان پارامتر به حلقه repeat داده میشه. خوب اینم از بحث حلقه ها. جلسه بعد درباره گردش برنامه یا Control Flow صحبت میکنیم. باهامون باشید و تا میتونیم با چیزهایی که تا حالا گفتیم تمرین حل کنیم و باهاشون بازی کنیم. از ترکیب آرایه ها، حلقه ها میشه بازی‌های باحالی ساخت. فرصت را از دست ندیم :)</description>
                <category>سبحان عطار</category>
                <author>سبحان عطار</author>
                <pubDate>Sat, 23 Jun 2018 00:52:57 +0430</pubDate>
            </item>
                    <item>
                <title>کاتلین یاد بگیریم! (قسمت ۴)</title>
                <link>https://virgool.io/@sobhanattar/%DA%A9%D8%A7%D8%AA%D9%84%DB%8C%D9%86-%DB%8C%D8%A7%D8%AF-%D8%A8%DA%AF%DB%8C%D8%B1%DB%8C%D9%85-%D9%82%D8%B3%D9%85%D8%AA-%DB%B4-hmkm6adugdpw</link>
                <description>Null Safetyسلام و امیدوارم هفته خوبی را سپری کرده باشین. هفته پیش در مورد انواع پایه گفتگو کردیم و طبیعتا اکیداً توصیه میکنیم که بخونید بخش قبل را و بعد بیاید سراغ این قسمتمون. خوب قبل از اینکه شروع بکنم لازمه یک نکته‌ای را بگم. من هفته پیش فراموش کردم بگم این هفته که تعطیلات هست نمیتونم بنویسم و طبیعتا وقفه بیشتری خواهیم داشت. ازاینکه این موضوع را فراموش کردم بگم عذرخواهی میکنم :) و بریم سراغ یکی ازجذاب‌ترین موضوعات برنامه‌نویسی یعنی: خطای اشاره‌گر تهی یا NullPointerExceptionقبل از اینکه بریم سراغ این خطا و توانمندی کاتلین در جلوگیری از بروز آن به نظر بهتره یک صحبتی در مورد خود مفهوم null بکنیم. برای این مفهوم معانی زیادی هست مثل «تهی»، «بی‌مقدار» و خیلی تعابیر و معانی دیگه. اما اون معنی که من خیلی دوستش دارم را اولین بار در کتاب «مفاهیم بنیادی پایگاه داده‌ها» تالیف سید محمد تقی روحانی رانکوهی دیدم. در تعریف این واژه آمده:«هیچ‌مقدار» یعنی مقدار ناموجود، مقدار ناشناخته، مقدار غیر قابل اعمال، مقدار تعریف نشده. گذشته از جزییات می‌توان گفت معادل است با همان مفهوم «داده نهست» و یا به تسامح « اطلاع نهست». *خوب حالا که یک تعریف کامل برای این مفهوم داریم، میتونیم بریم سراغ اصل ماجرا که قدرت کاتلین در جلوگیری از بروز این خطا هست. اگر قبلا برنامه‌نویسی کرده باشین به احتمال بسیار زیادی به این خطا برخورد کردید. این خطا به این موضوع اشار داره که شما قصد داشتید با یک شئ هیچ‌مقدار یک فراخوانی انجام بدید - مثلا یک تابع از اون شئ را صدا کنید. این خطا بسیار رایج هست و لازمه جلوگیری ازش اینه که مطمئن بشید شئ‌های برنامه شما همیشه مقدار دارند. اما در کاتلین کار ساده شده و عملا کامپایلر کاتلین به شما اجازه استفاده از یک متغیر null را نمی‌دهد**: https://gist.github.com/sobhanattar/623b26d18514840d2ab6e457453fe6fa به عبارت دیگر درزبان کاتلین امکان داشتن متغیری با مقدار نهست وجود ندارد مگر آن‌ که به‌صورت صریح در کد مشخص کنید که این متغیر قابلیت گرفتن مقدار null دارد: https://gist.github.com/sobhanattar/206c958e4eee31d072fa1158618e45ff توجه کنید که هرگاه ما ? را بعد از نام نوع - مثلا  String  - قرار دهیم به صورت واضح به کامپایلر می‌گوییم که مقدار این متغیر می‌تواند به یک شئ اشاره کرده و یا «نهست»، «هیچ‌مقدار»، null باشد. در مثال بالا ما این موضوع را برای نوع  String  دیدیم ولی به همین شکل برای سایر نوع‌ها نیز امکان‌پذیر است https://gist.github.com/sobhanattar/60646e414f51a61d5e145df96be6ec2e اپراتور فراخوانی امن:خوب تا حالا راجع به اینکه چجوری مقدار null را داخل یک متغیر قرار بدیم صحبت کردیم ولی الان میخوایم بگیم که چجوری کاتلین از این خطای آزاردهنده جلوگیری میکنه. کد زیر را در نظر بگیرید: https://gist.github.com/sobhanattar/e799f6eaf18f5a531857bfa11b2e16f2 کد بالا کامپایل نمیشه چون ما داریم طول یک متغیر از یک شئ null را درخواست میکنیم که خوب بی‌معنی هست و در زبان‌های دیگه به شما خطای NullPointerException را میدهد. اما اینجا کامپایلر کاتلین اجازه کامپایل این کد را نمی‌دهد و در نتیجه این کد به مرحله اجرا نخواهد رسید چون ممکن است که متغیر ما مقدار null داشته باشد. در واقع کاتلین اجازه کامپایل کدی را که احتمال بروز این خطا را بدهد نمی‌دهد.برای رفع این مشکل کاتلین اپراتوری با نام اپراتور فراخونی امن .? معرفی کرده که در مثال زیر کاربرد اون را میبینیم:  https://gist.github.com/sobhanattar/f837f2e3e80806f4ca894858b42cfcf9 در مثال بالا با افزودن «اپراتور فراخوانی امن» یا همان .? به متغیر پیش از فراخوانی یک ویژگی از آن، ما به طور مشخص به کامپایلر اعلام می‌کنیم که تنها در صورتی ویژگی length متغیر را فراخوانی کند که متغیر نهست یا null نباشد. در صورتی که متغیر null باشد، کامپایلر کاتلین رشته &quot;null&quot; را به عنوان «نتیجه» عبارت v?.length در نظر گرفته و آن را چاپ می‌کند. این موضوع نه تنها برای ویژگی‌ها بلکه برای متدها و توابع شئ نیز صادق است.توجه داشته باشید که زمانی که تابعی از یک متغیر «هیچ‌مقدارپذیر» را فراخوانی ‌می‌کنید، مقدار بازگشتی آن نیز  «هیچ‌مقدار پذیر» یا nullable خواهد بود. بنابراین و برای مثال در کد زیر مقدار بازگشتی از  عبارت v?.length  زمانی که v نهست است، ?Int خواهد بود. https://gist.github.com/sobhanattar/166fddcdb06710af170bce4b1703043e برای رد کردن چک کردن هیچ‌مقدارپذیری می‌توانیم به جای  .? از  .!! استفاده کنیم. اگرچه این کار توصیه نمی‌شود زیرا منجر به بروز خطای NullPointerException خواهد شد. https://gist.github.com/sobhanattar/fa9dac34f28844824d77520ecdba218b اپراتور الویس: :?این اپراتور که هم‌نام اون خواننده مشهور هم هست :) برای مقداردهی یک متغیر که مقدار null دارد مورد استفاده قرار می‌‌گیرد. مثال زیر را خیلی خوب این مطلب را نشون میده: https://gist.github.com/sobhanattar/f934d8ebb90a45bd8e509e361a84dccd در این مثال کامپایلر وقتی با null در متغیر username مواجه می‌شود به دلیل وجود اپراتور الویس مقدار &quot;No Name&quot; (مقدار جایگزین) را داخل متغیر  name قرار می‌دهد. در صورتی که اگر مقدار username برابر با هیچ‌مقدار نبود، مقدار متغیر name با متغیر username یکسان می‌بود. https://gist.github.com/sobhanattar/b6b7a355ddc986944b61200ed8c5eacf این هم از بحث nullable و خطای NullPointerException که بسیار مسئله مهمی در برنامه نویسی هست. در قسمت بعدی میریم سراغ حلقه‌ها و کنترل گردش :)* اکیدا توصیه میکنم مطالعه این کتاب را برای درک صحیح مفاهیم پایگاه داده‌ای رابطه‌ای.** به پیشنهاد سجاد :) کدها را داخل gist بردم که استفاده کردن ازشون ساده تر باشه ولی خوب دق میده تا لود کنه!!</description>
                <category>سبحان عطار</category>
                <author>سبحان عطار</author>
                <pubDate>Mon, 11 Jun 2018 15:08:38 +0430</pubDate>
            </item>
                    <item>
                <title>چند نکته برای توسعه‌دهنده (جاوا) بهتری بودن!</title>
                <link>https://virgool.io/@sobhanattar/%DA%86%D9%86%D8%AF-%D9%86%DA%A9%D8%AA%D9%87-%D8%A8%D8%B1%D8%A7%DB%8C-%D8%AA%D9%88%D8%B3%D8%B9%D9%87%D8%AF%D9%87%D9%86%D8%AF%D9%87-%D8%AC%D8%A7%D9%88%D8%A7-%D8%A8%D9%87%D8%AA%D8%B1%DB%8C-%D8%A8%D9%88%D8%AF%D9%86-pkin7msfhzzo</link>
                <description>در حال دور دور در اینترنت بودم که این مطلب به چشمم خورد. چون حوزه تخصصی کارم نیست یکم اینور اونور کردم که بازش کنم ولی وقتی بازش کردم بسیار از خودم راضی شدم چون طرف خیلی واضح جاوا را برده بود توی پرانتز! در واقع یکسری نکته برای برنامه‌نویس‌های جاوا نوشته بود که برای توسعه‌دهنده خوبی شدن در هر زبان برنامه‌نویسی غیرقابل انکار هستند. لذا من برای اینکه حرمت کلام نویسنده هم حفظ بشه، تیتر اون را میارم و داخل پرانتز تیتر کلیش را میارم که در هر زبان برنامه‌نویسی صدق میکنه.جاوا ۸ یاد بگیریم(به آخرین نسخه‌های ارایه شده در زبانی تخصصیمون آگاه باشیم و یادشون بگیریم)ماجرا اینه که اگر میخوایم برنامه‌نویس و توسعه دهنده بهتری باشیم لازمه که با آخرین نسخه‌های زبان تخصصیمون کار کرده باشیم و بهشون تسلط داشته باشیم. یعنی اینجوری نشه که جاوا ۱۰ داره فیچر لیستش میاد، جاوا ۹ از زمان ارایه‌اش ۶ ماه گذشته و جاوا ۸ حدود ۴ ساله که هست بعد ما هنوز با جاوا ۶ یا ۷ کد میزنیم! حواس بدیم که فضای برنامه‌نویسی بسیار سیال هست و توی زبان‌هایی که جا افتادن در بازار، در اختیار داشتن توانمندی در نسخه‌های آخر اون زبان بسیار حائز اهیمته.فریمورک اسپرینگ را یاد بگیریم(بهترین فریم‌ورک‌ها را بشناسیم و یاد بگیریمشون)واقعیت در سطح بین‌المللی اینجوریه که خیلی کم پیش میاد کسی شروع کنه از اول یک فریمورک جدید توسعه بده مگر اینکه واقعا یک حرف جدیدی برای گفتن داشته باشه؛ و وقتی هم حرف جدیدی برای گفتن داره خیلی زود جزو فریمورک‌های محبوب میشه و کلی آدم در پروژه‌اش مشارکت میکنن و به بلوغ میرسوننش؛ چیزی شبیه لاراول یا phantom یا react  و Vuejs. و کمتر شرکتی هم میاد و دست به نوشتن یک فریمورک اختصاصی برای خودش بزنه چون در نهایت باید بره یک بخشهاییش را از کدهای فریم‌ورک‌ها بیاره (نمیگم نیست؛ منطقی نیست در حالت عمومی!)لذا در دنیای کسب و کار، شرکت‌های نرم‌افزاری و سایر شرکت‌ها، به آدم‌های آشنا به فریمورک‌های محبوب هر زبان نیاز دارند. پس فریم‌ورک‌های خوب هر زبان را بشناسیم و بریم یکیشون را به عمق چندمتر یاد بگیریم :)تست واحد(Unit Testing) یادبگیریم.واضحه دیگه. اگر یک مرز باشه که یک توسعه‌دهنده خوب را از توسعه‌دهنده معمولی جدا بکنه مهارت‌های مربوط به تست هست. یک توسعه دهنده خوب برای کدهاش تست مینویسه و یک توسعه‌دهنده حرفه‌ای تا تست را ننوشته کد نمینویسه!واسط‌های برنامه‌نویسی(API) و کار کردن با کتابخانه‌ها را یادبگیریم.اگر با برنامه‌نویس‌های حرفه‌ای کار کرده باشیم حتما تسلطشون به اکوسیستم زبان برنامه‌نویسی که باهاش کار می‌کنند و به خصوص واسط‌های برنامه‌نویسی اون را دیدیم. خیلی از زبان‌هایی که الان ما باهاشون کار میکنیم بالغ هستند و تقریبا هرکاری میشه باهاشون انجام داد. طبیعتاً از هیچ‌کس انتظار نمیره که همه‌ چیز را بلد باشه ولی لازمه که برخی از مهمترین واسط‌های برنامه‌نویسی را بلد باشیم؛ واسط‌های برنامه‌نویسی JSON یا XML و یا کتابخانه‌های تست. اگر هم نمیدونیم اشکال نداره میتونیم توی گوگل با عبارتlibraries every [...] developer should knowجستجو انجام بدیم و جای [...] را هم با زبان برنامه‌نویسی تخصصیمون پر کنیم.ساز و کار ماشین مجازی جاوا(JVM) را یاد بگیریم(بدانید زبان برنامه‌نویسی شما چجوری کار میکنه) این لازمه اوج گرفتن در هر زبان برنامه‌نویسی هست. اگر میخواید به قول خارجی‌ها ابرستاره یک زبان برنامه‌نویسی بشیم لازمه که «تٓه و تو  و منویات» اون زبان برنامه‌نویسی - در جاوا به طور خاص میشه JVM - را در بیاریم. برای مثال فرق ساختمان‌داده‌ها، سرعت پردازششون، پیدا کردن توابع و ساختمان‌داده‌هایی که مشکل کارایی ایجاد می‌کنند، نحوه کامپایل یا ترجمه شدن برنامه و ... .در هر زبان برنامه‌نویسی یکسری کتاب با این هدف نشر میشن که مثلا برای جاوا کتاب Definitive Guide to Java Performance هست. برای این موضوعات باید به دنبال performance [...] بگردیم. و بهتون قول میدم وقتی این موارد را بدونیم یک سر و گردن از برنامه‌نویس‌های دیگه توی کد زدن جلوتر خواهیم بود.الگوهای طراحی (Design Pattern) را یاد بگیریم.اگر الگوهای طراحی را یاد نگیریم یک معنی ساده داره: «هیچ وقت و هرگز از یک توسعه‌دهنده معمولی رو به متوسط بالاتر نخواهیم رفت». الگوهای طراحی وجود دارند که ما اشتباهات را تکرار نکنیم. لازمه که بخشی از عمرمون را به خوندن کتاب‌های عمومی و تخصصی زبان برنامه‌نویسی خودتون اختصاص بدیم. این مسئله اصلاً شوخی بردار نیست :) چون سطح کدنویسیمون را تغییر میده و در یک سطح جدیدی کد خواهیم زد.اگر هم به دنبال جایی برای یاد گرفتنشون هستیم عبارت design patterns [...] را جستجو میکنیم و آیتم مربوط به زبان خودمون را پیدا میکنیم.ابزارهای دوآپس (DevOps) را بشناسیمیک برنامه‌نویس مدرن باید به ابزارهای دوآپس آشنایی داشته باشه. و دست کم با مفاهیم «یکپارچه‌سازی پیوسته یا Continuous Integration» و «استقرار پیوسته یا Continuous Deployment» و یا در اصطلاح CI/CD و ابزارهایی که اجازه دستیابی به این روش‌ها را می‌دهد - مانند Jenkins در جاوا - آشنایی داشته باشه. همچنین توصیه می‌شود به شدت یادگرفتن ابزاری به نام Docker. خلاصه موضوع اینکه اگر علاقه داریم که یک برنامه‌نویس ارشد یا همون Senior Developer باشیم مسیر از اینوره :)کاتلین یاد بگیریم :)فهمیدین؟! اینهمه قصه گفتم به این برسم :) جدای از شوخی این زبان که توسط JetBrains توسعه داده شده توسط گوگل در سال ۲۰۱۷ به عنوان زبان رسمی برای توسعه اندرویید اعلام شد. یاد گرفتن این زبان برنامه‌نویسی نه‌تنها کارایی در برنامه‌نویسی را افزایش میده بلکه راهی برای ورود به دنیای برنامه‌نویسی اندرویید هست؛ که البته ما اینارو میدونیم :)میکروسرویس‌ها (Microservices) را فرا بگیریممعماری‌های کامپیوتری به‌طور مداوم در حال تغییر هستند و بسیاری از شرکت‌ها در حال حرکت از برنامه‌های کاربردی یک تکه - و یا به عبارت کاملتر برنامه‌های بزرگی که از درون به هم وابستگی دارند و تغییرشون بسیار دشوار هست- به سمت «میکروسرویس‌ها» در حال حرکت هستند. اینجا میتونیم راجع بهش بخونیم و در آینده در کاتلین هم بهش میرسیم و شاید یک مطالب جداگانه‌ای در موردش نوشتیم چون موضوع بسیار مهمیه و در حال حاضر رویکرد دنیا به این سو هست.برای خوندن در حوزه زبان تخصصی خودتون هم مثل قبل کافیه microservices [...] را جستجو کنید.محیط توسعه برنامه‌نویسی (IDE) را خوب فرابگیریمممکنه کم اهمیت به‌نظر بیاد ولی وقتی بیشتر بهش توجه کنیم متوجه میشیم که یک IDE خوب از نون شب برای یک برنامه‌نویس واجبتره! استفاده از قابلیت های یک محیط توسعه مثل IntellijIDEA و یا PhpStorm یا WebStorm در کنار گزینه‌هایی مثل Eclipse و NetBeans میتونه ما را در برنامه‌نویسی قدرتمند و سریع و روون بکنه.لیستی از کلیدهای میانبر، جستجوی مبتنی بر Regular Expressions، کدهای تکمیل شونده(Live Templates) و بسیاری از موارد دیگه اینقدر مهم هستند که حتی در جایی مثل Udemy براشون کلاس آموزشی برگزار میشه. پس معطل نکنید و برید سراغ IDE محبوبتون و بخوریدش :) و حتی اگر لازمه برای خریدش هزینه کنید!هر نکته باحال دیگه‌ای هست برای اینکه برنامه‌نویس بهتری باشیم را تو کامنت‌ها بگید!</description>
                <category>سبحان عطار</category>
                <author>سبحان عطار</author>
                <pubDate>Sat, 02 Jun 2018 19:08:30 +0430</pubDate>
            </item>
                    <item>
                <title>کاتلین یاد بگیریم! (قسمت ۳)</title>
                <link>https://virgool.io/@sobhanattar/%DA%A9%D8%A7%D8%AA%D9%84%DB%8C%D9%86-%DB%8C%D8%A7%D8%AF-%D8%A8%DA%AF%DB%8C%D8%B1%DB%8C%D9%85-%D9%82%D8%B3%D9%85%D8%AA-%DB%B3-fvb9j4xfobhz</link>
                <description>سلام مجدد و چطورین! اول یک عذرخواهی لازمه بکنم چون این دفعه فاصله بیشتری از قولی که داده بودم بین آموزش قسمت قبل و این قسمت افتاد. دارم یک کارهایی براش میکنم که دیگه اتفاق نیفته و قولش را اینجا به شما میدم. ممنون و ببخشید که توی فرایند یادگیریتون اختلال ایجاد شد.هفته پیش و در قسمت ۲ کاتلین راجع به «نوع‌های پایه» صحبت کردیمو لازمه که قبل از این بخش اون قسمت را بخونین که دونستنش شدیداً لازمه برای اینکه ادامه بدید این قسمت را.در ادامه مبحث «نوع‌های پایه» میریم سراغ سایر نوع‌ها از جمله انواع درست/غلط، رشته‌ها و آرایه‌ها. دزدی از یوتیوب!انواع درست/غلط(Boolean)انواع درست/غلط یا Boolean ها در زبان کاتلین بسیار مشابه زبان برنامه‌نویسی جاوا است. در این زبان نیز مقدار صحیح با true و مقدار غلط با false نمایش داده می‌شود.var myTrueBoolean: Boolean = true; //  تعریف یک متغیر از نوع «درست/غلط» با مقدار درست 
var myFalseBoolean = false; // متغیر از طریق مقدار متوجه میشود که نوع آن «درست/غلط» است.اپراتورهای «یا» (||)، «و»  (&amp;&amp;) و «نفی یا معکوس» (!) اپراتورهایی هستند که میتوان از آن‌ها برای کار روی انواع درست/غلط استفاده کرد.val x = 1;
val w = 4;
val z = 6;
val n = x &lt; z &amp;&amp; z &gt; w; //n is trueبعدا در مورد boolean ها بسیار صحبت خواهیم کرد. خصوصا وقتی برسیم به بخش «کنترل گردش» یا Flow Control که تمامی کنترل‌ها با استفاده از همین نوع صورت میگیره.رشته‌ها (Strings)رشته‌ها یک نوع پایه ای برای نمایش دنباله‌ای از کاراکترها است. در کاتلین رشته ها به دودسته تقسیم می شوند:رشته‌های با قابلیت دریافت اپراتور \ یا Escaped String که با «&quot;...&quot;» (double quotes) در کامپایلر مشخص می‌شوند.رشته‌های خام حاوی هر نوع رشته یا Raw strings که با «&quot;&quot;&quot;...&quot;&quot;&quot;» (double triple quotes) در کامپایلر مشخص می‌شوند.یک escaped string:val myString = &quot;This is a String&quot;علاوه بر این اگر بخواهید از کاراکترهای معنا دار مثل n\ برای Enter استفاده کنید هم میتونید از همین قاعده استفاده کنید:val escapeString = &quot;This is a string with new line \n&quot;خوب نکته بعد اینه که المان‌های داخل رشته‌ها «کاراکترها» هستند که با استفاده از اندیس‌ها قابل دسترسی هستند. مثلاً:val str = &quot;abcd&quot;;
println(str[1]); //را چاپ می‌کند b مقدار  همچنین عمل اتصال یا concatenation دو رشته به هم را میتونید با استفاده از علامت + انجام بدید. توجه داشته باشید مادامی که اولین گزاره در عبارت شما از نوع «رشته» باشد می توانید عملیات اتصال را روی بقیه انواع پایه‌ای نیز انجام بدهید. مثل مثال زیر:val s = &quot;abc&quot; + 1
println(s + &quot;def&quot;) // &quot;abc1def&quot; چاپ می شودنکته بسیار مهم در بحث رشته‌ها این هست که در کاتلین رشته‌ها غیرقابل تغییر یا immutable هستند. یعنی انتظار داریم این کد اجرا نشه:var str = &quot;Hello &quot;
str = str + &quot;World!&quot;
println(str) // prints &quot;Hello world&quot;!اما همونطور که میبینیم اجرا شد! خوب اگر رشته‌ها غیر قابل تغییر هستند چرا این کد اجرا میشه؟ خوب ماجرا از این قراره که در واقع نوع رشته غیرقابل تغییر هست و چیزی که داره تغییر میکنه در واقع اشاره متغیر به بخش‌های مختلف حافظه است. به عبارت دیگر وقتی در خط اول ما رشته &quot;Hello&quot; را به str نسبت میدیم کاری که واقعا داریم میکنیم اینه که مقدار &quot;Hello&quot; را در جایی از حافظه مینویسیم و آدرس اون مکان را داخل str میگذاریم. در نتیجه هربار str را بخونیم در واقع محتوای حافظه ای را میخونیم که str به اون اشاره میکنه. حالا وقتی ما عمل اتصال بین &quot;Hello&quot; و world را انجام میدیم و مجددا اون را داخل str میریزیم، کاری که کردیم اینه که در حافظه رشته &quot;Hello world&quot;  را ایجاد کردیم و حالا آدرس این مکان حافظه را داخل str قرار دادیم و این درحالیه که مکان حافظه‌ای که داخلش &quot;Hello&quot; وجود داشت بدون تغییر همچنان وجود داره و تنها از دسترس ما خارج شده.پس میتونیم با قطعیت بگیم که رشته‌ها قابل تغییر نیستند. و سوال بعدی که میتونه تمرین شما باشه اینه که چه به سر این همه رشته رها شده یا abandoned میاد؟ از منظر مصرف حافظه چه اتفاقی میفته؟تصویر زیر هم این مفهوم را نمایش میده که بسیار گویاست.عکس متعلق به اینجارشته‌های خامدر صورتی که بخواهید رشته خود را در چندین خط بنویسید اونوقت لازمه که از &quot;&quot;&quot;...&quot;&quot;&quot; استفاده کنید. به مثال زیر توجه کنید:val multipleStringLines = &quot;&quot;&quot;
        This is first line
        This is second line
        This is third line &quot;&quot;&quot;دقت داشته باشید که نمیتونید از &quot;&quot; برای تعریف چنین رشته‌ای استفاده کنید. امتحان کنید تا مطمئن بشید.و اما یک قابلیت بسیار جذاب قابلیت جاگذاری متغیر در شته یا در اصطلاح  string interpolation یا string templates هست. مثال زیر را ببینید:val accountBalance = 200
val bankMessage = &quot;Your account balance is $accountBalance&quot; 
// Your account balance is 200در مثال بالا یک متغیر به نام accountBalance با مقدار اولیه ۲۰۰ ساخته شد و سپس با استفاده از کاراکتر $ کامپایلر متوجه می‌شود که باید مقدار این متغیر را جایگرین کنه و در نتیجه خروجی همونطور که در بالا میبینیم Your account balance is 200 خواهد بود. طبیعتاً اگر متغیر استفاده شده تعریف نشده باشد و یا به درستی استفاده نشود کد کامپایل نخواهد شد.برای نمایش کاراکتر $ در رشته escaped می‌توانید از $\ استفاده کنید. یک قابلیت بسیار جذاب که کاتلین ازش بهره‌مند شده {}$ هست. با استفاده از این گزاره در رشته‌ها شما خیلی کارها میتونید بکنید از جمله استفاده از توابع در رشته‌ها و یا قراردادن کاراکترهای خاص در رشته. مثال زیر را با دقت ببینید:val name = &quot;Chike&quot;
val message = &quot;The first letter in my name is ${name.first()}&quot; 
println(message) // The first letter in my name is Cدر کد بالا {()name.first}$به کامپایلر اعلام می‌کند که حرف اول متغیر nameرا  چاپ کند که مقدار C خواهد بود. و به عنوان آخرین نکته جذاب در مورد رشته‌ها شما حتی می‌توانید در داخل رشته‌ها منطق برنامه را نیز وارد کنید. مثال زیر را ببینید:val age = 40
val anotherMessage = &quot;You are ${if (age &gt; 60) &quot;old&quot; else &quot;young&quot;}&quot; 
println(anotherMessage) // You are youngدر کد بالا بخش {&quot;if(age&gt;60) &quot;old&quot; else &quot;young}$ در واقع بر اساس مقدار age تصمیم میگیرد که چه متنی در ادامه You are چاپ شود. در اینجا نیز چون مقدار age از مقدار ۶۰ کوچکتر است رشته young در ادامه You are چاپ شده و خروجی You are young را می‌دهد.val price = &quot;${&#039;$&#039;}9.99&quot;
println(price) // prints $9.99و حتی استفاده در رشته‌های خامبرای نمایش کاراکترهای خاص که امکان استفاده از \ برای نمایش کاراکترهای اینچنینی وجود ندارد:val price = &quot;&quot;&quot;
${&#039;\n&#039;}9.99
&quot;&quot;&quot;آرایه‌ها (Arrays)قبل از اینکه بریم سراغ اینکه چجوری میشه در کاتلین آرایه تعریف کرد بنظرم بهتره یک تعریف کلاسیک از آرایه بگیم چون بعدا خواهید دید که این نوع داده‌ای یکی از پرمصرف‌ترین انواع داده در برنامه‌نویسی هست:درعلوم کامپیوتر «ساختمان داده آرایه» یا به عبارت ساده‌تر «آرایه» یک ساختمان داده متشکل از مجموعه‌ای از المان‌ها(مقدار یا متغیر) است که هر یک با استفاده از حداقل یک شاخص یا اندیس قابل شناسایی هستند. [...] ساده‌ترین نوع آرایه، آرایه خطی است که در اصطلاح به آن آرایه تک بعدی نیز گفته می‌شود. (Wikipedia)خوب با این توضیح هممون متوجه شدم که به زبان ساده آرایه یک لیست از اقلام اطلاعاتی هست که با استفاده از یک اندیس قابل بازیابی و استفاده هستند. برگردیم به کاتلین و ببینیم که آرایه در این زبان چجوری تعریف میشه:arrayOf()در کاتلین دو روش اصلی برای تعریف آرایه وجود داره. استفاده از تابع کمکی ()arrayOfو یا استفاده از سازنده* ()Array است. در ادامه با استفاده از مثال هر یک از این روش‌ها را توضیح میدیم:val myArray = arrayOf(4, 5, 7, 3)در کد بالا یک آرایه به استفاده از تابع کمکی ؟ شامل ۴ نوع صحیح ساختیم. اما بر اساس تعریف ما باید بتونیم با استفاده از یک اندیس به هر کدام از المان‌های آرایه دسترسی پیدا کنیم. برای این منظور میتونیم از کد زیر استفاده کنیم:myArray[2] // 7خوب چندتا نکته در مورد آرایه ها وجود داره:اول اینکه شمار ایندکس از ۰ شروع میشه. مثل اغلب زبان‌های برنامه نویسی. یعنی اندیس ۰ میشه اولین المان، اندیس ۱ دومین المان و به همین ترتیب تا انتها.تصویر از اینجا!نکته دوم اینکه شما میتونید آرایه‌ای از انواع گوناگون داشته باشید:val myArray = arrayOf(4, 5, 7, 3, &quot;Chike&quot;, false)همونطور که در این آرایه میبینید اعداد صحیح، رشته و بولین در کنار هم در یک لیست آمدند که قابلیت بسیار جذابیه و کاربردی. اما اگر بخواهید میتونید با استفاده از نوع خاصی از تعریف آرایه استفاده از یک نوع داده‌ای خاص را اجباری کنیم. برای مثال:val myArray3 = arrayOf&lt;Int&gt;(4, 5, 7, 3, &quot;Chike&quot;, false) // کامپایل نمی شود
val myArray4 = arrayOf&lt;Int&gt;(1, 2, 3, 4) // کامپایل می شود 

val myArray5 = intArrayOf(4, 5, 7, 3, &quot;Chike&quot;, false)  // کامپایل نمی شود
val myArray6 = intArrayOf(1, 2, 3, 4) // کامپایل می شود 

val myArray7: IntArray = intArrayOf(4, 5, 7, 3, &quot;Chike&quot;, false)  // کامپایل نمی شود
val myArray8: IntArray = intArrayOf(1, 2, 3, 4) // کامپایل می شود علاوه بر مواردی که گفته شد توابع دیگری نیز برای ساخت آرایه‌های با نوع خاص وجود دارند که در زیر نام آنها آماده است:charArrayOf()
booleanArrayOf()
longArrayOf()
doubleArrayOf()
shortArrayOf()
byteArrayOf()اما شاید براتون جالب باشه که بدونید پشت صحنه ساختن آرایه چجوریه. در واقع با صدا کردن هر کدام از این توابع ما یک آرایه از نوع‌های اولیه پایه آن‌ها یا Basic Primitive Type میسازیم. به عبارت دیگر تابع ()intArrayOf به داده پایه‌ای جاوا از نوع صحیح  []int  کامپایل می شود و در نتیجه تنها می‌توان در آن المان‌های از نوع صحیح ریخت. این موضوع برای بقیه این توابع کمکی هم صادق است. یعنی اگر بخواهیم با جاوا مقایسه کنیم میتونیم مثال زیر را در نظر بگیریم:double[] myList = {34.1, 10.2, 5.8}; // تعریف آرایه در زبان جاوا
val myList = doubleArrayOf(34.1, 10.2, 5.8) //تعریف آرایه از نوع دابل در کاتلین
// این دو تعریف معادل هم در زبان جاوا و کاتلین هستندآرایه‌ها در برنامه‌نویسی جزو ساختمان‌داده‌های بسیار عالی و کاربردی هستند. حتما خوب ازشون تمرین حل کنید و سعی کنید خودتون را باهاش به چالش بکشید.سازنده* ()Arrayبرخلاف تابع ()arrayOf برای ساخت آرایه که یک پرانتز میذاشتیم و مقادیر خودمون را داخلش میریختیم، استفاده از ()Array نیازمند یک «اندازه - Size» و یک «تابع بی‌نام - lambda function یا anonymous function » است. ما بعدا در مورد «توابع بی‌نام» صحبت خواهیم کرد ولی در حال حاضر بهش به چشم یک تابع یک خطی بی‌نام نگاه بکنید که میتونه هرجایی از برنامه ظاهر بشه. مثال زیر کم گویاتر میکنه:val numbersArray = Array(5, { i -&gt; i * 2 })  در کد بالا ما عدد ۵ را به عنوان اندازه آرایه در پارامتر اول قرار دادیم. به این معنا که اندازه آرایه ما ۵ المان خواهد بود. پارامتر دوم  ()Array  یک تابع بی‌نام است که اندیس آرایه را یکی یکی دریافت کرده و یک مقدار در آن اندیس بر اساس فرمول i * 2  قرار می دهد. بنابراین در مثال بالا ما آرایه‌ای ساختیم که حاوی اعداد ۰ و ۲ و ۴ و ۶ و ۸ است. یادآوری میکنم که اندیس از ۰ شروع میشه.بذارید یک مثال دیگه بزنیم یکم بیشتر جا بیفته:val asc = Array(5, { i -&gt; (i * i).toString() })در مثال بالا مجددا یک آرایه ساخته شده با اندازه ۵ که مقادیر آن با استفاده از فرمول بی‌نام i-&gt;i*i ایجاد شده. به عبارت دیگه هربار اندیس گرفته میشه در خودش ضرب میشه و مقدارش به عنوان المان آرایه داخل آرایه قرار داده میشه. پس خروجی ما خواهد شد یک آرایه متشکل از ۰ و ۱ و ۴ و ۹ و ۱۶. اما این تابع بی‌نام یک تابع دیگه را هم در خودش داره و اون تابع ()toString هست.اگر خاطرتون باشه در قسمت ۲ آموزش ما راجع به این توابع برای گسترده‌سازی نوع‌ها صحبت کردیم. مثلا گفتیم برای اینکه یک عدد صحیح را داخل یک متغیر از نوع Long قرار بدیم لازمه که از تابع  ()toLong استفاده کنیم. اینجا هم همین اتفاق میفته. به عبارت دیگه هر المانی که تولید میشه - یادمون هست که همه نوع‌های داده‌ای شی هستند - تابع  ()toString روش اجرا میشه و اون المان را تبدیل به رشته میکنه. در نتیجه خروجی ما برای آرایه asc مقادیر زیر خواهد بود:// Array &lt;String&gt; [&quot;0&quot;, &quot;1&quot;, &quot;4&quot;, &quot;9&quot;, &quot;16&quot;]خوب این هم از انواع داده‌ای پایه کاتلین. و اما چند تا نکته بسیار لازم و حیاتی:۱. وقتی میخواین کد بزنین - که البته احتمالا خودتون متوجه شدید - لازمه که کدتون را داخل تابع main بنویسید. اینجوری:fun main(args: Array&lt;String&gt;) {
    val i = 10
    println(&quot;i = $i&quot;) // prints &quot;i = 10&quot;
}من در قسمت قبل فراموش کردم این را بگم که کد را باید داخل این تابع اجرا کنید.۲. تمام حیات برنامه‌نویسی ما با همین نوع‌ها خواهد گذشت. یک عالمه چیز یاد میگیریم که وقتی ریز بشیم به هر گذاره اون میبینیم که داریم از یکی از این نوع‌ها و تبدیل‌ها و عملگرها استفاده میکنیم. پس بی اندازه حیاتیه که برای این دو قسمت وقت بگذارید. تا میتونین مثال حل کنید و منابع دیگه را مطالعه کنید. ما اینجا داریم آشنا میشیم با این زبان و نکات کلیدی که من به ذهنم میرسه را میگم ولی این اصلا معنیش این نیست که با خوندن این مطالب شما یک برنامه‌نویس حرفه‌ای میشید. تنها چیزی که شما را حرفه‌ای می‌کنه مطالعه، مطالعه، مطالعه، تمرین، تمرین، تمرین! همین و بس.۳. اگر سوالی براتون پیش میاد حتما اینجا بپرسین - من سعی میکنم در حد توان و دانشم پاسخگو باشم - و یا با دوستانتون راجع بهش صحبت کنید و حتی اگر لازمه بازهم مطالعه کنید و مسئله حل کنید.همین. میبینمتون :)* در مورد سازنده‌ها یا constructor ها وقتی وارد بحث شی‌گرایی بشیم صحبت میکنیم. برای درکش در این مقطع اینقدر کافیه بدونید که سازند‌ه‌ها کارشون مقداردهی اولیه یک شی از یک کلاس است.</description>
                <category>سبحان عطار</category>
                <author>سبحان عطار</author>
                <pubDate>Sun, 27 May 2018 13:39:33 +0430</pubDate>
            </item>
                    <item>
                <title>کاتلین یاد بگیریم! (قسمت ۲)</title>
                <link>https://virgool.io/@sobhanattar/%DA%A9%D8%A7%D8%AA%D9%84%DB%8C%D9%86-%DB%8C%D8%A7%D8%AF-%D8%A8%DA%AF%DB%8C%D8%B1%DB%8C%D9%85-%D9%82%D8%B3%D9%85%D8%AA-%DB%B2-jijhnxhkzrgn</link>
                <description>سلام و خوش و بش! خوب هفته پیش و در قسمت ۱ کاتلین راجع به یسری موضوعات صحبت کردیم. اگرچه به شدت ضروری نیست خوندنش؛ توصیه میکنم بخونید اون قسمت را چون کمی راجع به ویژگی‌های کاتلین سخن رانده شده :) که دونستنش برای اینکه بدونید با چی سر و کار دارید خوبه. اما یک ایده به ذهنم رسید که البته هنوز کامل بررسیش نکردم که بخوام قولش را بدم ولی به نظرم رسید توی فاصله‌ای که این درس‌ها را میذاریم بد نیست که یکسری مطالب کوتاه از حاشیه این زبان بگم. تلاشم را میکنم اما قول روتین بودنش را نمیدم :) ایندفعه هم داشتم دنبال تصویر زیر میگشتم در مورد «نوع‌های پایه» یا همون «Basic Types» که بحث این قسمت هست که یک مطلب خیلی مرتبط به صحبت‌های دو قسمت قبلمون دیدم در سایت slideshare.net. پیشنهاد میکنم ۸ تا اسلاید اولش را ببینین. و بعد اسلاید ۱۴ را. یک مقایسه خیلی جالبی داره با Java و Scala که بنظرم دیدنیه! اسلاید ۶۸ این نمایش خبر از قابلیت Functional Programming میده که خیلی این روزها مورد توجهه! و اما کاتلین!دزدی از یوتیوب!اولین و شیرین‌ترین نکته در مورد «نوع‌های پایه» کاتلین اینه که همه نوع‌ها، «شی» یا «Object» هستند و در نتیجه امکان فراخوانی یکسری ویژگی یا متد روی همه اون‌ها - به تناسب اینکه چه نوعی هستند - وجود داره.پاورقی: اگر نمیدونید «کلاس و شی» چی هستن - البته بعداً مفصل توضیح میدیم - فعلا اینجوری درکش کنید که «کلاس» یک نقشه کلی هست از هر چیزی؛ «ساختمان»، «انسان»، «اشکال هندسی»، «حیوان»، «ماشین»، «زبان برنامه‌نویسی» و غیره. که هر کدامشون یکسری ویژگی‌ها و مشخصات دارند. با این تعریف، یک «شی» میشه یک نمونه از «کلاس» که ویژگی‌ها و مشخصاتش، معلوم هستن. مثلا وقتی میگیم «گربه همسایه بالایی» در واقع ما یک «شی»، «Object» یا «نمونه» منحصر بفرد از کلاس حیوان  - و حتی کلاس گربه - را تعریف کردیم که اشاره به «یک گربه منحصر بفرد» داره که مال همسایه طبقه بالاییه و رنگ و اسم (ویژگی‌ها)و مدل راه رفتن و نحوه میو میو کردنش (توابع و رفتارها) برای ما معلومه. و مجموع ویژگی‌ها و رفتارهاش با هیچ گربه دیگری یکسان نیست.خوب از تعریف کلاس و شی که برگردیم میریم سراغ داده‌های پایه که شامل این‌ها میشن:Numbers (اعداد)Characters (کاراکترها)Boolean(true/false) (درست/غلط یا ۰/۱)Arrays (آرایه ها)Strings (رشته ها)ولی قبلش باید بگیم توی Kotlin چجوری میشه «متغیر» تعریف کرد. چون وقتی شما یک نوع داده‌ای تعریف میکنید اغلب نیاز دارید که اون را جایی در برنامه نگه دارید تا بعداً بهش مراجعه کنید. متغیر دقیقاً به همین معنیه. یک فضا در حافظه برنامه، که میشه داخلش یکسری مقادیر - بخوانید هرچیز قابل ذخیره‌سازی - گذاشت و هر وقت لازم بود مقدار ذخیره شده را با صدا کردن اسم اون بخش از حافظه - متغیر - دریافت کرد. دلیل دیگه‌ای که بهش میگیم متغیر اینه که مقدارش میتونه در طول برنامه با رعایت یکسری نکات تغییر کنه.پیش‌نیاز: از اینجا به بعد باید دست به کد بشیم و برای اینکه کد بزنیم چند تا راه هست. یکیش اینه که اگر Android Studio را گرفتید، پلاگین Kotlin را براش فعال کنید. توی اینترنت هست که چجوری اینکار را انجام بدیم مثلاً اینجا. اما به جز این روش میتونید از ویرایشگر آنلاین یا نسخه رایگان IntelliJ IDEA استفاده کنید. من شخصاً از کار کردن با همون سیستم آنلاین لذت میبرم و اونجا کد میزنم. به توصیه دوستم هم هیچ کدی را اینجا نمیذارم که توی اون سیستم کار نکنه :)متغیرها(Variables)در زبان کاتلین دو تا روش تعریف متغیر داریم. استفاده از «val» برای تعریف ثابت‌ها(constants) و استفاده از «var» برای تعریف متغیرها(variables). برای مشخص کردن نوع متغیر میتونیم نوع را - مثلا Int یا String - بعد از var یا val با استفاده از یک دو نقطه آورد. روش توضیح برنامه‌نویسیش این شکلی میشه:var &lt;variableName&gt;:&lt;Type&gt; = &lt;Value&gt;[ ; ]
val &lt;variableName&gt;:&lt;Type&gt; = &lt;Value&gt;[ ; ]و به عنوان مثال کد زیر را در نظر بگیرید:val constantFirstNumber: Int = 123     //تعریف یک ثابت از نوع صحیح و مقداردهی 123
var variableFirstNumber: Int = 123;     //تعریف یک متغیر  از نوع صحیح و مقداردهی 123به چند تا نکته در کد فوق دقت کنید:حرف اول «نوع» را با حرف بزرگ نوشتیم: Int یا String و ...مقداری که به «val» داده می‌شود در طول برنامه قابل تغییر نیست.قرار دادن « ; » semicolon در انتهای دستورات اختیاری هست.تفاوت بین val و var این هست که اولی «immutable» یا در اصطلاح «غیرقابل تغییر» و دومی var، «قابل تغییر» یا «mutable» است.val dateOfBirth = &quot;29th March, 1709&quot;
dateOfBirth = &quot;25th December, 1600&quot;     // کد کامپایل نمیشود. غیرقابل تغییر

var car = &quot;Toyota Matrix&quot;
car = &quot;Mercedes-Maybach&quot;                     // کد کامپایل میشود. تغییر پذیرنکته بسیار مهم اینه اگر نوع را هم حذف کنید کامپایلر کد شما را کامپایل میکنه. ولی به صورت غیرضمنی(Implicit) نوع را تشخیص میده. یعنی وقتی شما مینویسید var variableFirstNumber = 123کامپایلر خودش تشخیص میده این متغیر از نوع عددی هست و در نتیجه در هیچ جای  برنامه نمیتونید دستور زیر را بنویسید:var variableFirstNumber = &quot;Salam&quot;و اگر همچین نسبتی را در کد بیارید کامپایلر بهتون خطای زیر را میده:Type mismatch: inferred type is String but Int was expectedتوصیه میشه که در ابتدای کار متغیرهاتون را «غیرقابل تغییر» با «val» تعریف کنید. اینکار باعث میشه کدتون برای کار در فضای «چندبرنامگی» یا «Multi-threading» آماده باشه. دلیلش هم اینه که وقتی با val تعریف می‌کنید اطمینان دارید که پارامترهای تعریف شده، خارج از کنترل شما تغییر نمیکنن. نکته دیگه ای که باید بدونید اینه که میتونیم متغیرهای غیرقابل تغییر «val‌» را با نوعشان تعریف کنیم -مثال زیر - و بعداً در یک جایی از برنامه فقط یکبار بهش مقدار بدیم.val carName: String
// Your other code here...
carName = &quot;Toyota Matrix&quot;     //کامپایل می شودچند تا نکته را بدونید. اول اینکه اگر نوع را مشخص نکنید خطا بهتون میده. یعنی یا باید مقداردهی اولیه بکنید یا نوعش را مشخص کنید تا بتونید بعداً مقداردهی کنید. همچنین اینجا مثل یکسری دیگه زبان‌ها از جمله Java نیست که بتونیم با «کاما» چند متغیر را مقداردهی اولیه کنیم. یعنی امکانش نیست که مثل خط اول این کد، متغیر تعریف کنید و مقدار بدید و بعد کاما بگذارید و متغیر بعدی را تعریف کنید و مقدار بدید. طبیعتا استفاده از «سمیکالن» این امکان را بهتون میده.val carName = &quot;BMW&quot;, streetName = &quot;Oke street&quot;     // این کد کامپایل نمیشود 
//  کد زیر به خاطر استفاده از سمیکالن به جای کاما کامپایل میشود  
val carName = &quot;BMW&quot; ; val streetName = &quot;Oke street&quot;     
// کد زیر کامپایل میشود
val carName = &quot;BMW&quot;
val streetName = &quot;Oke street&quot;قواعد نامگذاری هم خیلی شبیه قواعد نامگذاری اکثر زبان‌های برنامه‌نویسی روتین هست. با عدد نمیتونیم نام متغیر شروع کنیم. ولی _ و حروف مجازه.خوب حالا که یاد گرفتیم چجوری متغیر تعریف کنیم میریم سراغ انواع پایه کاتلین :) اعداداعداد در کاتلین با زبان برنامه‌نویسی جاوا در برخی زمینه‌ها مشابهت و در بعضی موارد تفاوت‌هایی دارند. برای مثال هیچ تبدیل غیرصریحی یا ضمنی از اعداد کوچک به اعداد بزرگ وجود نداره و ادبیات کدی هم متفاوته در بعضی موارد. فقط اگر قبلا جاوا کار کردید و الان با ما همراهید توجه داشته باشید که کاراکترها در کاتلین جزو اعداد نیستند.Type     |   Bit Width  |    Sample
----------------------------------------------------
Double   |   64 bit      | val myDouble = 45.8
Float      |   32 bit      | val myFloat = 34.43F
Long      |   64 bit      | val myLong = 40L
Int          |   32 bit      | val myInt = 55
Short     |  16 bit       
Byte       |  8 bit       ثابت‌های صحیح یا واقعی(Literal Constants)خوب این ثابت ها که گفتیم منظور نوعی از نمایشه که شما به کامپایلر میفهمونید که دارید به یک نوع صحیح واقعی یا درست اشاره میکنید. برای مثال یک نوع Decimal به صورت 123 نشون داده میشه. ولی اگر بخواید نوع Long را نشون بدید یک L بزرگ آخر عددتون میذارید و میشه 123L. کلا خیلی از روش‌های نمایشی جاوا را در خودش داره.به همین شکل Hexadecimal ها با 0x یا 0Xشروع میشن مثل 0x0F. اعداد باینری با 0b یا 0B مثل 0b001101. توجه داشته باشید فعلا نوع Octal یا همون هشت هشتی پشتیبانی نمیشه.علاوه براین کاتلین از نمایش معمول اعداد اعشاری هم پشتیبانی میکنه.Doubles: 123.5, 123.5e10اعداد اعشاری هم با f کوچیک یا بزرگ مشخص میشن:123.5f
123.5Fاستفاده از underline یا _ هم از نسخه ۱.۱ به کاتلین اضافه شده. این برای خوانا کردن کد هست که خوب کار باحالیه که البته از Java نسخه ۷ به بعد هم بوده. کدهای زیر را ببینید:val oneMillion = 1_000_000 
val creditCardNumber = 1234_5678_9012_3456L 
val socialSecurityNumber = 999_99_9999L 
val hexBytes = 0xFF_EC_DE_5E 
val bytes = 0b11010010_01101001_10010100_10010010یک نکته ای بالاتر گفتیم که در Kotlin ما نمیتونیم همینطوری اعداد را به نوع‌های بزرگتر تبدیل کنیم. یعنی برای مثال کد زیر اجرا نمیشه:val myNumber = 400
val myNumberAgain: Long = myNumber // throws Error: Type mismatch برای این نوع تبدیل‌ها کاتلین تعدادی متد داره که برخی از اون‌ها به این شرح هستند:toByte()، toInt()، toLong()، toFloat()، toDouble()، toChar() و toShort()val myInt = 987
val myLong = myInt.toLong()در کد بالا ما یک عدد صحیح را به یک عدد از نوع Long تبدیل کردم. برعکس اینکار هم با استفاده از تابع toInt امکان پذیر هست. فقط باید حواستون به این مطلب باشه که وقتی شما یک عدد Long را به یک عدد Int تبدیل میکنید ۳۲ بیت از اطلاعات از بین خواهد رفت. و این موضوع در مورد تمام تبدیل‌های ازنوع بزرگ به کوچک صادق هست.همینطور میتونیم یک رشته را به عدد صحیح تبدیل کنیم. مثال زیر را ببینید:val stringNumber = &quot;101&quot;
val intValue = stringNumber.toInt()و حتی خیلی باحالتر از اون و برای اینکه مطمئن بشیم نوع‌ها «شی» هستند:val intValue = &quot;101&quot;.toInt()برنامه نویس خوب بشید*: الان برید  شروع کنید یک عالمه عدد را به هم تبدیل کنید. مثلا ببینید اگر روی رشته &quot;abc&quot; تابع تبدیل به عدد صحیح را بزنید چی میشه؟ یا اگر روی یک کاراکتر بزنید چی میشه؟ و برای چاپ دستوراتتون فعلا از دستور زیر استفاده کنید:print(&lt;your variable&gt;)خوب این برای این بخش. برنامه ریزیم اینه که بقیه انواع پایه را سریعتر از هفته ای بگم که خیلی سریعتر از این مبحث رد بشیم. کد بزنید. کدبزنید و کد بزنید :)*من هر از گاهی این را میذارم و یکسری نکاتی که بهم کمک کرده بفهمم یک زبان چیکارا میتونه بکنه و چیکارا نمیتونه بکنه را میگم. طبیعتا انجام اینکارا دلبخواهیه ولی چند بار که انجام بدید میبینید که عمق آگاهیتون به اون زبان افزایش داده میشه.</description>
                <category>سبحان عطار</category>
                <author>سبحان عطار</author>
                <pubDate>Tue, 15 May 2018 00:02:54 +0430</pubDate>
            </item>
                    <item>
                <title>کاتلین(Kotlin) یاد بگیریم! (قسمت ۱)</title>
                <link>https://virgool.io/@sobhanattar/%DB%8C%D8%A7%D8%AF%DA%AF%DB%8C%D8%B1%DB%8C-%DA%A9%D8%A7%D8%AA%D9%84%DB%8C%D9%86-ouggohsq83bo</link>
                <description>خوب هفته پیش و در قسمت ۰ کاتلین راجع به یسری موضوعات صحبت کردیم. اگرچه ضروری نیست و به همین دلیل اسم اون قسمت را ۰ گذاشتیم؛ توصیه میکنم بخونید اون قسمت را چون یک حرفهایی زدیم که نه به لحاظ فنی ولی از این نظر که بدونید داریم چیکار میکنیم و هدفمون چیه مهمه :) و اما دوباره کاتلینتوی قست قبل گفتیم که کاتلین را میشه در ۴ حوزه استفاده کرد و این خودش یک موضوع هیجان انگیز در مورد این زبانه و خیلی مختصر این چهار تا حوزه را گفتیم. اما حالا میخوایم یکم عمیقتر بدونیم توی هر کدام از این حوزه ها چه خبر هست:کاتلین و توسعه سمت سرور (Server-side Development)این زبان به دلیل تطابق کاملش با تکنولوژی‌های جاوا و منحنی نرم! یادگیریش آن را به یک زبان مناسب برای برنامه‌نویسی سمت سرور تبدیل می‌کنه. این زبان مشخصه‌های زیر را برای خودش اعلام میکنهگویایی: ویژگی‌های جدید به کار رفته در این زبان - مثل پشتیبانی اون از type-safe builders و delegated properties - این امکان را به این زبان میده که کلاس‌های abstract قدرتمند و با قابلیت استفاده ساده ایجاد بکنه.*مقیاس‌پذیری: پشتیبانی این زبان از coroutine ها* این اجازه را به ما میده که برنامه‌هایی بسازیم که قابلیت کار با تعداد بسیار بسیار بسیار! زیادی کاربر را داشته باشه بدون اینکه سخت‌افزار عجیب غریبی بخوایم براش ایجاد کنیم.تعامل‌پذیری: همخوانی این زبان با تمامی فریم‌ورک‌های جاوا(یی) این امکان را میده که در عین حال که توی همون فضایی که تا حالا کار کردید کار بکنید بتونید از مزایای یک زبان مدرن‌تر - منظورش کاتلین هست :) - استفاده کنید.مهاجرت‌پذیری: میتونیم کدهای جدیدمون را توی این زبان بنویسیم درحالی که کدهای قدیمی به زبان و در اکوسیستم جاوا هستن.ابزار: علاوه بر پشتیبانی خوب محیط برنامه‌نویسی (IDE) کاتلین این زبان در ابزارهایی مثل Intellij IDEA برای فریم‌ورک‌هایی مثل Spring پلاگین هم داره.منحنی آموزش: اینجا گفته که یادگرفتن کاتلین برای توسعه‌دهنده‌های جاوا خیلی آسونه و یک پلاگین تبدیل کد هم دارن و یکسری هم آموزش که سریع راهشون میندازه. اما اگر توسعه دهنده جاوا هم نیستین من بهتون قول میدم یاد میگیریم.**فریمورک‌های توسعه سمت سرور که با کاتلین کار میکنن هم Spring از نسخه ۵، Vert.x، Ktor، kotlinx.html و ابزارهای بسیار بیشتری برای اتصال به دیتابیس های رابطه‌ای(RDBMS) و NoSQL ها.ذکر این نکته لازمه که اگر برنامه‌ای با کاتلین برای وب و سمت سرور نوشتین بدونین که هر سروری که برنامه‌های تحت وب جاوایی را ساپورت میکنن تنها گزینه‌های قابل استفاده شما هستن. درحال حاضر Corda  و سیستم کاربری JetBrain سیستم‌هایی هستند که ۱۰۰ درصد با کاتلین پیاده‌سازی شدند.کاتلین و جاوا اسکریپتیک موضوع جالب در مورد کاتلین اینه که میشه کدش را به جاوااسکریپت «تبدیل» یا «transpile» یا «تبدیل کد به کد» یا «خواندن کد در یک زبان و تبدیل آن به همان کد در زبان دیگر»؛ کرد. در حال حاضر این کد به ECMAScript 5.1 - یک استاندارد برنامه‌نویسی در زبان جاوااسکریپت - تبدیل میشه ولی در برنامه تیم توسعه کاتلین هست که ECMAScript 2015 را هم پیاده‌سازی کنه.تنها نکته - یا شاید بشه گفت نقطه ضعف - در این تبدیل از کاتلین به جاوااسکریپت اینه که هیچ کد مربوط به JVM و JDK و یا هر کتابخانه یا فریم‌ورک جاوایی استفاده شده در کد تبدیل نخواهد شد. به عبارت دیگر هر کدی که کاتلین نباشه در این تبدیل جایی نخواهد داشت.اگرچه منطقیه تا حدی، ولی خوب چون یک بخشی از کار فریم‌ورک‌ها سهل کردن کارهای سخته، طبیعتا در این تبدیل یک بخش قابل توجهی از دشواری‌ها هستن که باید توی کد جاوا اسکریپت پیاده‌سازی بشن دوباره.هدف کامپایلر کاتلین در این تبدیل چهار تا موضوع هست: خروجی با سایز بهینهخروجی جاوااسکریپتی خوانا(Readable)تطابق با سیستم‌های ماژولار موجودکارایی یکسان با کد اصلی تا بالاترین حد ممکناما یک خبر خوب در مورد این داستان اینه که کاتلین میتونه با کتابخانه‌ها و فریم‌ورک‌های جاوااسکریپتی مثل React و jQuery همزیستی کنه! و همچنین کدهای نوشته شده در TypeScript هم قابل تبدیل به کدهای کاتلین با استفاده از ابزاری به نام ts2kt هست. و همچنین میتونید به این‌ها هم یک نگاهی بندازین: React bindings  و React Kotlin App و در نهایت اینجاکاتلین و Native Appsتکنولوژی Kotlin/Native یک تکنولوژی هست که این امکان را میده که برنامه‌های نوشته بشه که بدون نیاز به هر ماشین مجازی «VM» اجرا بشه. این تکنولوژی با این هدف طراحی شده که بشه برای ابزارهایی که استفاده از ماشین مجازی در اون‌ها جایی نداره - مثل ابزارهای iOS اپل یا سیستم‌های توکار(embeded) - استفاده کرد. یا مثلا زمانی که یک توسعه‌دهنده میخواد نرم‌افزاری بنویسه که بدون هیچ وابستگی در زمان اجرا استفاده بشه. برای این منظور این تکنولوژی از تمام قابلیت‌های C و در سیستم عامل مکینتاش و iOS از تمام قابلیت‌های Objective/C پشتیبانی میکنه.خبر بد اینه که این تکنولوژی همچنان در حال توسعه است ولی میتونید از نسخه‌های پیش نمایش اون برای تست و لذت بردن استفاده کنید. چون این پلتفورم‌ها را پشتیبانی میکنه:سیستم عامل ویندوز (x86_64 در حال حاضر)سیستم عامل لینوکس(x86_64, arm32, MIPS, MIPS little indian)سیستم عامل مکینتاش (x86_64)سیستم عامل iOS اپل (arm32 و arm64) - اپل را نمینوشتم به هم میریخت :)اندرویید (arm32 و arm64)وب‌اسمبلی (WebAssembly wasm32)کاتلین و توسعه اندرویید (Android Development)بالاخره رسیدیم جایی که اصلا براش اومدیم کاتلین یاد بگیریم :) البته این بخش، توی خود آموزش بخش دوم بود ولی من آوردمش اینجا که حسابی معطلش بمونیم :) خوب ماجرا اینه که این زبان برای توسعه برنامه‌های اندروییدی یک گزینه بسیار مناسبه که با خودش تمام ویژگی‌های و فواید یک زبان برنامه‌نویسی مدرن را همراه داره و اون‌هم بدون هیچ محدودیتی در توسعه اپ.تطابق‌پذیری: کاتلین با JDK 6 تطابق کامل داشته و در نتیجه برنامه‌های ساخته شده با این زبان روی دستگاه‌های اندروییدی قدیمی‌تر بدون هیچ مشکلی اجرا می‌شود. ابزارهای کاتلین روی اندرویید استادیو به‌طور کامل پشتیبانی می‌شود و با سیستم ساخت اندرویید تطابق دارد.کارایی: به لطف استفاده از ساختار بایت‌کد(byte code) مشابه با جاوا برنامه‌های نوشته شده با کاتلین با سرعت یکسان با برنامه‌های نوشته شده با جاوا اجرا می‌شوند. همچنین پشتیبانی کاتلین از توابع درونی(inline functions)، کدهایی که از lambdas استفاده میکنند سریع‌تر از کد مشابه در جاوا اجرا می‌شود.تعامل‌پذیری: همانطور که تا الان کامل روشن شده برامون کاتلین و جاوا در یک تعامل ۱۰۰ درصدی با هم قرار دارند و درنتیجه این امکان وجود داره که از تمام کتابخانه‌های اندروییدی در کاتلین استفاده کرد که این شامل پردازش انوتیشن‌ها - Annotation Processing - هم هست.ردپای کم: زبان کاتلین کتابخانه زمان اجرای بسیار جمع و جور و کوچکی داره که با استفاده از ProGurad‌ - یک بهینه ساز اپن سورس برای بایت کدهای جاوا - میشه کمترش هم کرد. در یک اپ واقعی زبان کاتلین فقط چند صد متد و کمتر از ۱۰۰ کیلوبایت به سایز کل برنامه اضافه میکنه.زمان کامپایل: با پشتیبانی از کامپایل افزایشی و علیرغم اینکه یک سربار زمانی برای تولید یک فایل تمیز داره ولی با این وجود کامپایل‌های افزایشی معمولا به سرعت یا سریعتر از کامپایل جاوا است.منحنی یادگیری: همون حرف‌هایی را زده که توی بخش توسعه سرور گفته بودن را دوباره گفتن. کپی پیست کردن :)اما برنامه‌های باحالی هم تا حالا با کاتلین توسعه داده شده که از میان آن‌ها میشه به Pinterest، ‌Basecamp و KeepSafe اشاره کرد. که دو تای آخری ۱۰۰ درصد با کد کاتلین پیاده‌سازی شدند.ابزارهای باحالی هم تولید کردن مثل Kotlin Android Extension - که اگر قبلا با اندرویید  کد زده باشید - از دست ()findViewById راحتتون میکنه. یک ابزار فوق‌العاده دیگه‌ای که با این زبان ارایه شده Anko هست که یسری پوشش(wrapper) کاربرپسند ارایه میکنه برای استفاده از APIهای اندرویید و همینطور DSL که اجازه میده قالب xml فایل‌ها با کد کاتلین پیاده‌سازی بشه.خوب حالا چیکار کنیم:اول از همه Android Studio 3 را از اینجا دانلود کنید. یک راهنمای نصب داره که لازمه بخونیدش و مرحله به مرحله پیش برید باهاش. من ترجیحم به اینه که هرچی را متوه نمیشین جستجو بکنین. این باعث میشه که اگر قبلا برنامه‌نویسی نکردید با کلی مفهوم جدید آشنا بشید. آماده بشید برای هفته آینده که کلی تصویر خواهیم داشت و کلی کد و میریم توی پایه کد نویسی و syntax و غیره. طبیعتا چون هدف من آموزشه تا اونجایی که به ذهنم برسه چیزی را بدیهی فرض نمیکنم و توضیح میدم ولی لازمه که شما هم حسابی بخونید لینک‌هایی که میدم.تا هفته بعد :)* اگر جاهایی که این علامت را دیدین متوجه نشدین اصلا نگران نشید. من معادل فارسی براشون توی ذهنم نبود و نمیخواستم اینجا بازشون کنم. به موقع وقتی به سرفصل هرکدوم برسیم با مثال و تمرین کاملا روشن میشه برامون چی هستن! اگرم فهمیدن که عالی :)** یک نکته‌ای را دوست دارم بگم، نه به این معنیه که درسته فقط به این معنی که نظر من اینه. اگر تا حالا برنامه‌نویسی نخوندین یا از رشته دیگه ای هستین که و دلتون خواسته برنامه نویس بشید اول بدونید که فوق العاده‌اید. و دوم اینکه لازمه یسری چیزها را یاد بگیرید. ساختار توابع بازگشتی، الگوریتم، انواع ساختمان داده‌ها، تحلیل و طراحی یک سیستم، الگوهای طراحی و .... منظورم این نیست که همه را یهو یادبگیرید. منظورم اینه که یادگرفتن این موارد به شدت روی حرفه‌ای شدنتون تاثیر میذاره.بروزرسانی ۱۷-۰۲-۹۷: یک ایده به ذهنم رسید که البته هنوز کامل بررسیش نکردم که بخوام قولش را بدم ولی به نظرم رسید توی فاصله‌ای که این درس‌ها را میذاریم بد نیست که یکسری مطالب کوتاه از حاشیه این زبان بگم. تلاشم را میکنم اما قول روتین بودنش را نمیدم :) ایندفعه هم داشتم دنبال یک تصویر برای  «نوع‌های پایه» یا همون «Basic Types» که بحث قسمت ۱ هست میگشتم که یک مطلب خیلی مرتبط به صحبت‌های قبلمون دیدم در سایت slideshare.net. پیشنهاد میکنم ۸ تا اسلاید اولش را ببینین. و بعد اسلاید ۱۴ را. یک مقایسه خیلی جالبی داره با Java و Scala که بنظرم خوندنیه! اسلاید ۶۸ این نمایش خبر از Functional Programming در کاتلین میده که البته این روش برنامه نویسی خیلی این روزها مورد توجهه!</description>
                <category>سبحان عطار</category>
                <author>سبحان عطار</author>
                <pubDate>Thu, 03 May 2018 01:21:18 +0430</pubDate>
            </item>
                    <item>
                <title>زمانی برای برنامه‌نویس بهتری بودن!</title>
                <link>https://virgool.io/Software/%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3-%D8%A8%D9%87%D8%AA%D8%B1%DB%8C-%D8%A8%D8%A7%D8%B4%DB%8C%D9%85-eyouudhwnjdp</link>
                <description>تصویر از اینجا چند روز پیش توی گروه صرفا جهت اطلاع برنامه نویسان در تلگرام که بچه های خوبی هستن - البته از روی کارشون و زحمتی که میکشن - این مطلب را دیدم:  Finding Time to Become a Better Developer.یکم ازش خوندم و دیدم چقدر توی سال‌هایی که برنامه نویسی کردم درگیر این موضوع بودم و واقعا بهم کمک کرد شرایط را بهتر درک کنم. مطلب را خودتون میتونید کاملش را بخونید توی لینک بالا اما فهوای کلامشرا میتونید اینجا بخونید: ۱. لازم نیست هرچیزی که هست را یاد بگیرید!شکی در این نیست که اگر میخواهید یک برنامه نویس خوب باشیم باید همواره در حال یاد گرفتن باشیم. اما اینکه کجا زمانمون را صرف میکنیم میتونه در نتیجه‌ای که میگیریم در حوزه کاریمون خیلی تفاوت داشته باشه. به عبارت دیگه اگر تخصصی پایتون میخونیم یا تمرکز کردیم روی PHP یا جاوا یا Node بعد میبینیم یک چیز خیلی هیجان انگیز توی مثلا زبان R اومده، بریم و زمانمون را صرف اون بکنیم خیلی فرق میکنه تا همون زمان را ببریم توی حوزه‌ای که توش تخصص داریم صرف کنیم و یک مفهوم جدید یا الگوی طراحی جدید توی اون بخش را - با توجه به دانش قبلیمون توی اون حوزه - یاد بگیریم.برای همین خیلی درگیر تیترهای خبری که روی وبلاگ‌ها هر ۳۷ ثانیه یک تکنولوژی جدید اعلام می‌کنند نشیم. خیلی از این تکنولوژی‌ها فریم‌ورک‌ها و ویژگی‌های هیچ‌وقت مورد توجه درست و حسابی قرار نمی‌گیرند و به عبارت دیگه اصلا لازم نیست اون‌ها را یاد بگیریم. برای اون‌ تکنولوژی‌هایی هم که در آینده بهشون توجه میشه زمان بسیار زیادی میبره تا بیان و جای یک ابزار یا تکنولوژی فعلی را بگیرن. بنابراین تمرکز یادگیریمون را بگذاریم روی این موارد:اصول بنیادی یا Fundamentals. یک قانون هست که میگه اگر پایه را بدونی همیشه در یادگیری چیزهای دیگه خیلی سریعتر عمل میکنی. یعنی مثلا اگر JS را عمیق درک کردیم، یادگیری یک فریم‌ورک در اون حوزه برامون خیلی سریعتر خواهد بود. یادگیری عمیق اصول سرعت ما را و کیفیت یادگیریمون را ۱۰ برابر افزایش میده.آخرین نسخه‌ها و و یژگی‌های مجموعه تکنولوژی‌هایی که در حال استفاده از اون هستیم. یک مجموعه از تکنولوژی‌ها هست که ما هر روز استفاده می‌کنیم و زندگیمون را تامین میکنه. وقتی نسخه جدید این ابزارها عرضه میشه مطمئن بشیم که یادشون گرفتیم.فناوری‌های مورد نیاز شرکت‌های بزرگ و تعیین کننده در بازار مثل گوگل، فیس‌بوک یا مایکروسافت. یعنی اگر شرکت‌هایی مثل اینها چیز جدیدی ارایه میکنه ارزش وقت گذاشتن داره. مثلا ۱۰۰ ها فریمورک جاوااسکریپت تو بازار بود بعد Angular و React اومدن و توجه خیلی بیشتری را به خودشون جلب کردن. این معنیش این نیست که یک شرکت کوچیک یک گوشه دنیا نمیتونه یک چیزی ارایه کنه که همه برن به سمتش خیلی عالی باشه ولی خوب راجع به اغلب موارد صحبت میکنیم.و نکته بسیار مهم اینکه یادگیری باید بخشی از برنامه کاریمون باشه. هر روز زمانی را برای یادگیری کنار بگذاریم. لازم هم نیست خیلی زمان زیادی باشه. ۲۵ تا ۳۰ دقیقه مطالعه و تجربه کردن در یک سال میشه حدود یک ماه مطالعه!۲. اینطوری به‌نظر نمیاد، ولی نوشتن کد خوب زمان کمتری از نوشتن کد بد میگیره!ما خیلی وقتا زمانی را که برای نوشتن یک قطعه کد یا یک ویژگی جدید میگذاریم را زمان نوشتن اون کد میدونیم. اما واقعیت اینه که این تازه اول کاره! زمانی که توسعه که قطعه کد جدید از ما میگیره، در واقع شامل زمان نوشتن، زمان تست و زمان رفع اشکال - دیباگینگ - و همینطور بازنویسی‌های - ریفکتور - متعدد برای خوروندن بقیه کدها به کدیه که با یک طراحی ضعیف نوشته شده. وقتی به زمان پیاده‌سازیمون اینطوری نگاه کنیم خیلی واضحه که وقتی زندگیمون برنامه‌نویسی هست بهتره که طراحی‌هایی انجام بدیم که خطای کمتری تولید کنه. دو روش برای کاهش خطا و طراحی بهتر میتونیم انجام بدیم:استفاده از توسعه مبتنی بر تست (test-driven development). اول تست را بنویسیم و بعد کدی را بنویسیم که با تست کار کنه. این روش نه تنها باعث تولید خطای کمتری میشه بلکه ما را به سمت طراحی های بهتر سوق می‌ده چون وقتی کدها را طوری مینویسیم که قابل تست باشند، طوری کد می‌زنیم که توابع کوچک‌تر و با وابستگی‌های کمتر توسعه داده بشه.توسعه مبتنی بر طراحی تعاملی (interactive design). قبل از اینکه کد کار بکنه سعی نکنید بهترین طراحی را انجام دهید. ما هرگز، هرگز نمیتونیم تمام مسئله را توی ذهنمون جا بدیم و ارزیابی کنیم. اول یک کدی بزنیم که کار کنه و بعد اون کد را ارتقا بدیم. به قول آقا کنت بک (Kent Beck):راهش بنداز، عالیش کن، سریعش کن. و با همین ترتیب. Make it work, Make it right, Make it fast۳. کارکردن بدون وقفه از شما قهرمان نمیسازه! مدیریت انتظارات اینکارو میکنه!این یکی کشنده است. ما خیلی وقت‌ها به هر انتظار احمقانه‌ای از کارفرما یا رییسمون پاسخ مثبت میدیم. چون میترسیم بگیم «نه». یا اینکه میترسیم ازمون ناراحت بشن. و بعد پدر خودمون را در میاریم که قولی را که دادیم را نگه داریم. بعد مجبوریم پشت میزمون غذا بخوریم و بخوابیم و توی ماراتون‌ هفته‌ای ۴۰ ساعت کد زدن باشیم.اولش هم خیلی مزه میده. مثل یک ستاره میدرخشیم. یک بار گنده‌ای روی دوشمونه و این بهمون احساس افتخار و غرور میده که چه خفنیم. اما واقعیت اینه که این حجم انتظار کنترل نشده، زندگیمون را از بین میبره. و خیلی سریع تبدیل میشیم به آدم‌هایی که قابل اتکا نیستند و نمیشه ازشون انتظار کار به موقع داشت. چیزی که باید بدونیم و یادش بگیریم اینه که قهرمان‌های واقعی کسانی هستند به‌ شکل توقف‌ناپذیری قابل اعتماد هستند و اونکاری را که میگن انجام میدن را انجام میدن. و تنها راهی که میشه همچین آدمی بود اینه که بتونیم انتظارات از خودمون را مدیریت کنیم.لازمه که کنترل برنامه زمانیمون دستمون باشه تا بتونیم همیشه و همیشه سر زمان کد با کیفیتی را به مشتریمون تحویل بدیم. اولش خیلی سخته چون مستلزم گفتن «نه»های زیاده. و طبیعتا از سمت مقابل هم فشار خیلی زیادی بهمون وارد میشه، ولی وقتی کار را به موقع و با کیفیت تحویل بدیم اوضاع تغییر میکنه. و میبینیم که در طول زمان جایگاهمون در تیم کاری به بالاترین سطح ممکن میرسه. چون قابل اعتمادیم :)۴. همه زمانی که روی «بهتر» کردن کد وقت میذارین برنمیگرده!وقت ما سرمایه‌مون هست. و وقتی صرف کاری می‌کنیمش داریم سرمایه‌گذاری می‌کنیم. و طبیعیه که وقتی شما سرمایه‌گذاری می‌کنید انتظار داری که این سرمایه‌گذاری برگرده. و خوب انتظار اینه که در بدترین حالت همونقدری که گذاشتیم برداشت کنیم.درواقع اگر بخوایم برگردیم به جمله «کنت بک» باید به یک موضوعی حواس بدیم که توی چاله‌اش نیفتیم: «عالی» کردن به معنای «بی‌نقص» کردن نیست و «سریع» کردن به معنی «سریعترین چیز ممکن» نیست.کد «عالی»، کدی هست که درست و مطمئن کار میکنه و ریفکتور کردنش راحته. و کد «سریع» کدیه که روی کلیت تجربه کاربری کاربر تاثیر منفی نذاره. به عبارت دیگه مهم اینه که سایتمون از نظر کاربر سریع باشه.بنابراین وقتمون را صرف کم کردن زمان تابعی که به ندرت استفاده میشه نکنیم. یا سعی نکنیم چند میلی‌ثانیه از زمان لود یک تابع کم کنیم. چون کاربر متوجهش نمیشه. و از همه مهم‌تر، کدی را که داره کار میکنه و خیلی هم خوب نوشته شده را صرف اینکه یک تکنولوژی جدید یاد گرفتیم ریفکتور نکنیم.چون زمانی به خودتون میاید که کل کاری را که کردیم را داریم ریفکتور میکنیم و برای اینکار به شما پولی نمیدن! دیدم که میگم :)۴. زمان برنامه‌ریزی شده، شما را کاراتر میکنه!باورش و قبول کردنش برامون سخته. چجوری میشه کاراتر بود وقتی تمام وقتت را صرف تولید چیزی نمیکنی؟ خوب حقیقت داره!طبق تحقیق صورت گرفته که با هدف مطالعه تقاضای کاری و محرک‌های کارجویان صورت گرفته مشخص شده که ما آدم‌ها میزان مشخص و محدودی از منابع را داریم و وقتی به‌طور مداوم این منابع را استفاده میکنیم به اندازه‌ای که میتونیم کارا نخواهیم بود. وقتی ما خسته می‌شیم، کاراییمون و توان حل مسئلمون کاهش پیدا میکنه.مغز ما نیاز داره که منابعش را برگردونه و خودش را سر و سامان بده. و اگر این نیازش برآورده نشه طبیعتا کاراییش در حل مسئله و در مجموع کارایی کلی ما پایین میاد. بدن و مغز ما نیاز به استراحت داره. و دوست داشته باشیم یا نه به‌دستش میارن. همون موقع‌هایی که حال هیچ کاری را نداریم یا مسئله ای که ۱۰ بار حلش کردیم را نمیدویم حتی از کجا کپی کنیم یا با همکارمون دعوامون میشه همون موقع‌ها اس :) پس زمانتون را برنامه‌ریزی کنید. واقعا قلم بردارید و روی تقویم، زندگیتون را برنامه‌ریزی کنید. این کار باعث میشه تا برای زمانمون برنامه داشته باشیم بدون اینکه در مورد کارهامون احساس گناه بکنیم:)همین :)پی‌نوشت ۱: میخواستم بگم یادم توی قسمت ۰ آموزش کاتلین یادم رفت بنویسم در بخش قبل که من به جز آموزش کاتلین موارد دیگه ای هم که ببینم و دوست داشته باشم به طور مرتب هر چند وقت یبار :) اینجا مینویسم! برام لذت بخشه و امیدوارم شما هم بخونید و لذت ببرید و نظراتتون را با من سهیم بشید :)پی‌نوشت ۲: اگر موضوعی براتون جذابه بهم بگید بهش نگاه میکنیم اگر میگنجید در زمان و سوادمون حتماً بهش می‌پردازیم :)</description>
                <category>سبحان عطار</category>
                <author>سبحان عطار</author>
                <pubDate>Fri, 27 Apr 2018 16:24:36 +0430</pubDate>
            </item>
                    <item>
                <title>کاتلین (Kotlin) یاد بگیریم! (قسمت ۰)</title>
                <link>https://virgool.io/@sobhanattar/%DB%8C%D8%A7%D8%AF%DA%AF%DB%8C%D8%B1%DB%8C-kotlin-oo6mz1yhhcmm</link>
                <description>خوب ماجرا از اینجا  شروع شد که امروز صبح پیرو علاقه ام در حوزه یادگیری زبان برنامه نویسی موبایل، تصمیم گرفتم زبان برنامه نویسی کاتلین را یاد بگیرم :) بعد چون در اغلب موارد در زندگیم یک کاری را قول میدم انجام بدم - در بیشتر مواقع به خودم - بعد میرم با برف سال بعد میام؛ تصمیم گرفتم ایندفعه کلامم را اینجا اعلام کنم که روش بایستم و انجامش بدم :) این عکس شامل قوانین کپی رایت است. (Kotlin)اما پیش از شروع یکسری نکات باید بگم؛ اول برای خودم که یادم نره در طول این آموزش و بعد برای کسانی که میخونن که با هم شفاف باشیم :)من این زبان را خیلی یکدفعه ای انتخاب کردم. دلیلم هم این بود که یکم syntax اش را خوندم و دیدم میتونم باهاش ارتباط برقرار کنم. پس خیلی بحث راجع به اینکه خوبه یا بده. چرا نمیری React یا Xamarin‌ یا Cordova یا ... یاد بگیری که برای اپل و ویندوز هم اپ بنویسی ندارم :)من تا حالا آموزش ندادم به صورت کتبی و وبلاگ و اینا هم نداشتم. لذا بر خودم میبخشم و شما هم بر من ببخشید اگر اونجوری که وبلاگ نویسای خوب مینویسن من اونجوری نمی نویسم.برنامه نویسی موبایل، وب، اینترنت اشیا و در نهایت دیتا ساینتیست شدن آرزومه و لذا توی زندگیم اینها را هم دنبال میکنم. پس اگر مطلب خوبی داشتین به اشتراک بگذارید که راجع بهش بنویسیم :)و اما کاتلیناز اونجایی که من خیلی انسان ویکیپدیایی و تاریخچه ای نیستم، اگر دوست دارین بدونین این زبان از کجا میاد و الان وضعیتش چجوریه میتونین اینجا و اینجا را بخونید و خودتون دست به گوگل بشید. اما زبان برنامه نویسی کاتلین در وب سایت این برنامه اینجوری تعریف شده:یک زبان برنامه‌نویسی کامپایلری برای برنامه‌های چندپلتفورمی مدرندر واقع به زبان خودمون، کاتلین یک زبان برنامه‌نویسی کامپایلری هست که در زمان کامپایل و نه در زمان اجرا یا «Run Time» نوع‌های مختلف را بررسی و به عبارتی استفاده از اون‌ها را اجبار میکنه. یعنی بر خلاف زبان های برنامه‌نویسی غیر حساس به «نوع‌ها یا Types» مثل جاوا اسکریپت و یا زبان‌هایی مثل PHP که «نوع» را در زمان اجرا چک میکنن و خطا میدن؛ این زبان همون موقع کامپایل میگه نمیشه یک متغیر از نوع «صحیح» را بفرستی به یک تابعی که ورودی آن از نوع «رشته» هست. البته اگر با زبان‌های برنامه نویسی مثل Java یا ++C یا #C و ... کار کرده باشید با این مفهوم کاملا آشنا هستید. اگرهم نه! اشکال نداره راجع بهش حرف میزنیم حسابی :)اما اون چیزی که این زبان برنامه‌نویسی را برای من - که دوست دارم فرصتی دست بده که یک برنامه موبایل بنویسم - جذاب میکنه اینه که این زبان: ۱۰۰ درصد با Java و Android سازگار هست.یعنی یجورایی یاد گرفتن این زبان پنجره ایه به همه کارهایی که میشه با Java انجام داد. و این خیلی فوق‌العادع است. کاتلین الان نسخه ۱/۲ هست و میشه باهاش اینکارارو کرد:ساختن برنامه برای اندرویید یا آندرویید - هر کدوم که صداش میکنید اوکیه :)ساختن برنامه جاوا اسکریپتیساختن برنامه های با قابلیت اجرا روی ماشین مجازی جاوا JVMو از همه جذاب‌تر نوشتن برنامه‌هایی که بدون نیاز به هیچ نوع ماشین مجازی «VM» اجرا میشن که در اصطلاح بهشون میگن برنامه‌های Nativeراجع به هرکدوم که خواستین بیشتر بخونین لینکش شما را به صفحه توضیحات اون بخش هدایت میکنه و صد البته من در مسیر یادگیری خودم، مروری روی هر کدام از این ها خواهم کرد و چه بسا براشون کد هم نوشتیم و توی گیت هاب هم گذاشتیم :)اما مهمترین نکته اینه که چجوری میخوایم این زبان را یاد بگیریم. هرکسی روش خودش را داره، ولی چیزی که همیشه به من کمک میکنه بهتر یاد بگیرم اینه که یک پروژه درست و حسابی برای خودم ایجاد کنم و در اون مسیر یاد بگیرم.طبیعتا شما میتونین فقط درس‌ها را بخونین و یا اگر دلتون خواست با من پروژه خودتون را بیارید جلو و حتی کدهای همدیگه را بهبود بدیم :) جلسه بعد پروژه خودم را معرفی میکنم و کار را روش شروع میکنم.آخرین نکته هم اینکه من سعی میکنم هر هفته یک بخشی از این زبان را آموزش بدم و هر کدوم پروژمون را انجام بدیم و اینجوری توی یک سال یک زبان برنامه نویسی یاد گرفتیم و یک پروژه قابل ارایه هم داریم :)مطالعه کنید راجع به کاتلین و تا دوشنبه بعد :)</description>
                <category>سبحان عطار</category>
                <author>سبحان عطار</author>
                <pubDate>Tue, 24 Apr 2018 20:54:48 +0430</pubDate>
            </item>
            </channel>
</rss>