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

                    <item>
                <title>7 کد طنز آمیز گوگل برای برنامه نویس ها!</title>
                <link>https://virgool.io/@ArminYazdian/7-%DA%A9%D8%AF-%D8%B7%D9%86%D8%B2-%D8%A2%D9%85%DB%8C%D8%B2-%DA%AF%D9%88%DA%AF%D9%84-%D8%A8%D8%B1%D8%A7%DB%8C-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3-%D9%87%D8%A7-q5zfbltvquu6</link>
                <description>اخیرا به متد عجیبی به اسم Log.wtf در جاوا رسیدم و این منو کنجکاو کرد که بقیه ی کامند های برنامه نویسی بامزه رو هم پیدا کنم. بعد از مقداری جستجو متوجه شدم که گوگل شوخ طبعی و ایزتر اگ های خودش رو فقط در About Phone &gt; Android Version نمیگذاره، بلکه از اون ها در پایگاه کد هم استفاده می کنه!1- Log.wtf()در ابتدا این رو بگم که این کلمه مخفف What A Terrible Failure به معنی عجب خراب کاری ای هست. طبق گفته های گوگل، این متد فقط باید زمانی که انتظار چیزی رو ندارید صدا زده بشه. برنامه نویس ها گزارش داده اند که Log.wtf بعضی اوقات باعث توقف و بسته شدن برنامه میشه و بعضی اوقات هم فقط به عنوان Exception در نظر گرفته میشه.وب سایت دولوپر اندروید اینطوری راجع بهش توضیح میده:What a Terrible Failure: Report a condition that should never happen. The error will always be logged at level ASSERT with the call stack. Depending on system configuration, a report may be added to the DropBoxManager and/or the process may be terminated immediately with an error dialog.2- isUserAGoatاونطور که برنامه نویس ها میگن، این بولین که در UserManager قرار داره، وضعیت نصب بودن بازی Goat Simulator رو بررسی میکنه. ولی چیزی که گوگل راجع بهش میگه یکم عجیبه: Used to determine whether the user making this call is subject to teleportations.3- DISALLOW_FUNبه خودتون نگیرید، ولی وقتی این مقدار برابر با true هست، کاربر دیگه نمی تونه شاد باشه! این شرط در یک چشم بهم زدن خنده رو از لب همه میگیره.برای دونستن دلیل وجود این جوک، با جستجو در codebase به این می رسید که اگر true باشه، کاربر نمیتونه با چند بار لمس کردن روی Android Version هیچ ایزتر اگی رو ببینه.Specifies if the user is not allowed to have fun. In some cases, the device owner may wish to prevent the user from experiencing amusement or joy while using the device. The default value is false.4- isTheFinalCountDownاحتمالا نگفته باید بدونید عملکرد این چیه! کلاس کرنومتر (Chronometer) یک متد پابلیکی به اسم isTheFinalCountDown داره که با صدا زدنش، آهنگ Europe — The Final Countdown در یوتیوب باز میشه!whether this is the final countdown5- FEATURE_TOUCHSCREEN_MULTITOUCH_JAZZHANDهمه ی موبایل ها مولتی تاچ رو ساپورت می کنن ولی تعداد تاچ های همزمان در بعضی موبایل ها کمتر و در بعضی بیشتره. با صدا زدن hasSystemFeature() و پاس دادن استرینگ نامبرده به داخل پرانتز آن، می تونید چک کنید که آیا موبایل از تاچ همزمان 5 انگشت پشتیبانی میکنه یا خیر.Feature for getSystemAvailableFeatures() and hasSystemFeature(String): The device&#x27;s touch screen is capable of tracking a full hand of fingers fully independently -- that is, 5 or more simultaneous independent pointers.در واقع Jazzhand یک اصلاحه که به تصویر زیر نسبت داده میشه:Jazzhand6- isUserAMonkeyگوگل دیگه داره خیلی پارو فراتر میذاره! 😠شوخی کردم! این میمون (Monkey) با چیزی که توی ذهن همه‌ست فرق میکنه!مانکی یک برنامه‌ست که در Emulator اجرا میشه. عملکردش هم مربوط به تست کردن UI برنامه‌ست. میمون واقعی به بپر بپر توی جنگل شناخته میشه و این برنامه هم تقریبا همین کار رو در موبایل انجام میده! مانکی تعداد زیادی دستور touch در کل صفحه میفرسته تا کاربر متوجه بشه که در مواقع خاص به چه شکلی برنامه crash میکنه.الان معلوم شد که isUserAMonkey چک میکنه که آیا مانکی روی emulator فعال هست یا نه!Returns “true” if the user interface is currently being messed with by a monkey.7- Meow!بیش از 360 تا میو توی سورس اندروید وجود داره! به نظر میرسه که برنامه نویس های گوگل به شدت تحت تاثیر گربه ها هستن.لینکی که میو هارو نشون میده، برای کسایی که مثل من کنکجاون در پایین مقاله وجود داره.جایزه!در مرورگرتون log.wtf رو بنویسید و ببینید شما رو به کجا میبره!به نظر من، تمام این 7 کد بامزه نشون میده که خنده و شادی هیچوقت نمی تونه از برنامه نویس ها جدا بشه و یکی از اهداف توسعه دهنده ها در کنار هدف اصلیشون، تقسیم خوشحالی بین مردم هست! برای اثبات حرفم، می تونید مقدار return شده ی پیشفرض DISALLOW_FUN رو ببینید.منابع:https://developer.android.com/reference/android/util/Log.html#wtf(java.lang.String,%20java.lang.String)https://developer.android.com/reference/android/os/UserManager.html#isUserAGoat()https://developer.android.com/reference/android/os/UserManager#DISALLOW_FUNhttps://developer.android.com/reference/android/widget/Chronometer#isTheFinalCountDown()https://developer.android.com/reference/android/content/pm/PackageManager#FEATURE_TOUCHSCREEN_MULTITOUCH_JAZZHANDhttps://developer.android.com/reference/android/app/ActivityManager#isUserAMonkey()https://cs.android.com/search?q=Meow 🐈نسخه ی انگلیسی مقاله رو می تونید از طریق این لینک بخونید.</description>
                <category>آرمین یزدیان</category>
                <author>آرمین یزدیان</author>
                <pubDate>Sun, 24 Nov 2024 09:58:02 +0330</pubDate>
            </item>
                    <item>
                <title>13 قانون نام گذاری در Clean Code</title>
                <link>https://virgool.io/@ArminYazdian/13-%D9%82%D8%A7%D9%86%D9%88%D9%86-%D9%86%D8%A7%D9%85-%DA%AF%D8%B0%D8%A7%D8%B1%DB%8C-%D8%AF%D8%B1-clean-code-a4ejv3s6ub6l</link>
                <description>کتاب Clean Code نوشته ی Robert C. Martinاین مقاله خلاصه ای از کتاب Clean Code است که به طور اختصاصی بر فصل دوم با عنوان Meaningful Names (نام های بامعنی) تمرکز دارد.اسم ها در تمام کد شما وجود دارند: متغیر ها، کلاس ها، متد ها و... از آنجایی که این مقاله یک خلاصه است و از دید شخصی من باید مستقیم و بی پرده باشد، از هر گونه اطلاعات اضافی عبور کرده و مستقیما به سمت محتوا می رویم...1- انتخاب نام با اهداف مشخص:نام باید نقش خود را فریاد بزند. وقتی که نام ها به طور معنی دار تعریف می شوند، دیگر نیازی به نوشتن کامنت در بالای آن یا توضیح مستقیم به یک همکار نیست. به جای تعریف نام های بی معنی مانند int myNumber، String s یا هر نام دیگری که معنی مشخصی ندارد، می توان آن ها را با نام هایی که نقششان را فریاد می زنند جایگزین کرد.به این کد دقت کنید://This returns car full name of Company + Model
//For example: Nissan + GTR
String car(String a, String b) {
    return &amp;quot$a $b&quot;
}با کد زیر مقایسه کنید:String carName(String company, String model) {
     return &amp;quot$company $model&quot;
}کد دوم به راحتی و بدون هیچ تعریف اضافه یا کامنت به خواننده می گوید که دقیقا چه اهدافی دارد.2- از پخش اطلاعات غلط خودداری کنید:خواننده باید همیشه به وضوح متوجه شود که در ذهن توسعه دهنده چه اتفاقی در حال رخ دادن است. نام‌گذاری یک متغیر به عنوان String shoppingList فقط به این علت که شامل &quot;فلفل، گوجه‌فرنگی، پاستا&quot; می شود، صحیح نیست؛ این نام به راحتی می تواند خوانندگان را گمراه کند چرا که آن ها فکر کنند این یک List&lt;String&gt; shoppingList است. در واقع، مشکل اصلی زمانی ایجاد می شود که یک همکار بخواهد از shoppingList در جای دیگر استفاده کند و بر اساس نام آن فرض کند که این یک List است.مثال دیگر، int isFull است که می تواند به دلیل استفاده از is، یک bool تشخیص داده شود.3- تفاوت‌های معنادار:دو قانون ساده:1- از اضافه کردن Type به نام ها خودداری کنید: از String name به جای String nameString یا از var user به جای var userVariable استفاده نمایید! 2- از متفاوت سازی متغیر ها با کلمات عمومی مانند a, an, another, the و... کنید. به جای rowText و anotherRowText، به سادگی از rowTitle و rowSubtitle استفاده نمایید.4- نام‌های قابل تلفظ:موقع نام گذاری یک متغیر، تصور کنید که دارید آن را بلند بلند به همکار خود می گویید. آیا آن ها بلافاصله متوجه منظور شما می شوند؟ ممکن است فقط شما بدانید که Desc مخفف &quot;Description&quot; در متغیر studyDesc است. آیا آن ها فکر نمی کنند که منظور شما &quot;Study Desk&quot; (میز مطالعه) باشد؟ بهتر است آن را studyDescription نام گذاری کنید تا همه آن را تشخیص دهند.5- نام‌های قابل جستجو:نام هایی را انتخاب کنید که جستجوی آن ها راحت باشد. فرض کنید به یک متغیر بولین نیاز دارید که بررسی کند یک مقدار درست است یا نه؛ احتمالاً اولین نامی که به ذهنتان می‌رسد isCorrect خواهد بود. در حالی که نام‌هایی مانند isRighteous از نظر فنی ممکن است کار کند، اما برای همه قابل درک و واضح نیست، به ویژه برای توسعه دهندگانی که در سطوح زبانی مختلف قرار دارند.6- از ایجاد نقشه ذهنی پرهیز کنید:در استفاده از اصطلاحاتی که باید توسط همکاران و خوانندگان حفظ شوند خودداری کنید. به عنوان مثال، بهتر است که از حروف سنتی مانند i، j و k در حلقه‌های for استفاده نمایید و آن‌ها را با حروفی مانند a، b و c جایگزین نکنید.7- نام گذاری کلاس ها:برای نام گذاری کلاس ها از اسم (دستور زبان) استفاده کنید. به عنوان مثال، نام‌هایی مثل Currenct، Tool و Shape برای کلاس ها مناسب هستند، در حالی که نام هایی مانند GetCurrency، CalculateShape و ChooseTool به دلیل فعل بودن مناسب نیستند.8- نام گذاری متد ها:برای نام گذاری متد ها از فعل استفاده کنید. به عنوان مثال، نام هایی مانند getCurrency، calculateShape و chooseTool برای متد ها مناسب هستند، در حالی که نام هایی مانند currency، shape و tool به دلیل اسمی بودن مناسب نیستند.9- شوخی نکنید:استفاده از نام های بامزه مثل hastaLaVista() به جای exit() ممکن است از نظر نویسنده کد بامزه باشد، اما از دید همکاران چندش به نظر می رسد.10- یک کلمه واحد برای هر مفهوم:به سادگی یک کلید واژه را انتخاب کرده و در تمام جاهایی که آن مفهوم به کار رفته استفاده کنید. مثلا استفاده از fetch هم در متد های DataSource و هم Repository معقولانه است. اما اگر در DataSource از fetch و در Repository از get استفاده کنید، باعث سردرگمی و سوء‌تفاهم می شود.11- با کلمات بازی نکنید:هر هدف باید نام خاص و متمایز خود را داشته باشد. برای مثال، نباید از نام user هم برای اشاره به فردی که از برنامه استفاده می‌کند و هم برای رکورد کاربر در پایگاه داده استفاده کنید. به جای آن، از نام‌های توصیفی تر مانند appUser و userRecord استفاده کنید تا مشخص باشد که به چه چیزی اشاره دارید.12- کلمات معنی دار اضافه کنید:اضافه کردن پیشوند ها یا پسوند های مناسب می تواند هدف متغیر را روشن تر کند. برای مثال، به جای استفاده از balance به تنهایی، از accountBalance استفاده کنید تا مشخص باشد که این موجودی مربوط به حساب است. البته توجه داشته باشید که این روش برای متغیر های درون کلاس (مثل نمونه ی زیر) صدق نمی کند:class Account{
     int id;
     String name;
     int balance;
     const Account({required this.id, required this.name, required this.balance});
}ولی خارج از کلاس Account این مورد کار می کند:void Main(){
     int accountBalance = Account().balance;
}13- کلمات غیر ضروری اضافه نکنید:با این وجود که لازم است کلمات معنی دار اضافه کنید، باید از افزودن پیشوند ها و پسوند های بی فایده به نام ها خودداری کنید. به عنوان مثال، به جای استفاده از userAccountBalanceInTheBank از userBalance استفاده کنید یا به جای carMakeInEnglish از carMake بهره بگیرید تا نام ها کوتاه و خوانا باشند.این کار باعث می شود کد شما شفاف تر و آسان تر و قابل فهم تر باشد.جایزه!بر اساس تجربه ی شخصی، نام گذاری متغیر های بولی همیشه باید با کلید واژه های is یا has شروع شود. این قانون، هم &quot;بولین بودن&quot; را به وضوح مشخص می کند و هم خوانایی کد را به خصوص در مواردی مثل if می دهد.یک مثال خوب:bool isUserRegistered;
bool hasError;
if (isUserRegistered) {
     if (hasError) {
     }
}یک مثال بد:bool register;
bool error;
if (register) {
     if (error) {
     }
}مثال دوم، بیشتر از bool بودن، شبیه به یک method جلوه می کند.با رعایت تمام این اصول، نه تنها کد شما قابل فهم تر خواهد بود، بلکه توسعه ی آن در آینده نیز آسان تر می شود! یک متغیر، متد یا کلاس با نام گذاری مناسب می تواند ساعت ها زمان را در دیباگ و ریفکتور کد ذخیره کند. نام های تمیز و معنا دار نشانه ای از کد حرفه ای و با کیفیت هستند.نسخه ی انگلیسی مقاله را می توانید از طریق این لینک بخوانید.</description>
                <category>آرمین یزدیان</category>
                <author>آرمین یزدیان</author>
                <pubDate>Sun, 10 Nov 2024 14:21:08 +0330</pubDate>
            </item>
            </channel>
</rss>