<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های اشکان خالقی</title>
        <link>https://virgool.io/feed/@khaleqiashkan</link>
        <description>توسعه دهنده فول استک و نویسنده فنی هستم. بیشتر درباره جاوا و توسعه وب می نویسم و خواهم نوشت.</description>
        <language>fa</language>
        <pubDate>2026-06-17 04:59:56</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/967820/avatar/5Pfxaq.jpg?height=120&amp;width=120</url>
            <title>اشکان خالقی</title>
            <link>https://virgool.io/@khaleqiashkan</link>
        </image>

                    <item>
                <title>اصول SOLID با نمونه های واقعی در جاوا</title>
                <link>https://virgool.io/@khaleqiashkan/%D8%A7%D8%B5%D9%88%D9%84-solid%D8%A8%D8%A7-%D9%86%D9%85%D9%88%D9%86%D9%87-%D9%87%D8%A7%DB%8C-%D9%88%D8%A7%D9%82%D8%B9%DB%8C-%D8%AF%D8%B1-%D8%AC%D8%A7%D9%88%D8%A7-n7uoqpn7f6za</link>
                <description>نگاهی متفاوت به 5 اصل SOLIDاصول SOLID برخی از قدیمی ترین قوانین در دنیای نرم افزار هستند. آنها ما را قادر می سازند تا کدهای قابل نگهداری، خوانا و قابل استفاده مجدد بنویسیم. در این متن سعی می کنم با رعایت اصول SOLID یک مثال تا حدودی واقعی را انجام دهم.اصل مسئولیت واحد (Single Responsibility)هر کلاس باید تنها یک هدف داشته باشد و با قابلیت های بیش از حد پر نشود. به مثال زیر توجه کنید:public class PasswordHasher
{
public String hashAndSavePassword(String password)
    {
        hashPassword();
        savePassword();
    }
    public void hashPassword()
    {
        //hashing implementation
    }
    public void savePassword()
    {
        //save to the db
    }
}این کلاس همانطور که از نامش پیداست برای هش کردن رمزهای عبور پیاده سازی شده است. این کلاس در ذخیره آنها در پایگاه داده نباید مسئولیتی داشته باشد. هر کلاس باید یک مسئولیت واحد را انجام دهد.نباید «کلاس‌های خدا» وجود داشته باشد که دارای عملکردهای متنوعی باشد که کارهای زیادی برای انجام دادن دارند. در عوض، ما باید کلاس هایمان را تا حد امکان مدولار بنویسیم. عملیات ذخیره سازی را در کلاس دیگری پیاده سازی کنید.اصل باز-بسته (Open-Closed Principle)کلاس ها باید برای گسترش باز و برای اصلاح بسته باشند.به عبارت دیگر، برای پیاده‌سازی ویژگی‌های جدید، نباید کلاس موجود را بازنویسی کنید.بیایید به مثال رمز عبور خود ادامه دهیم. فرض کنید می خواهیم کلاس ما بتواند با الگوریتم های مختلف هش کند.public String hashPassword(String password, HashingType hashingType)
{
if(HashingType.BASE64.equals(hashingType))
  {
   hashedPassword=&amp;quothashed with Base64&amp;quot
}
 else if(HashingType.MD5.equals(hashingType))
    {
        hashedPassword=&amp;quothashed with MD5&amp;quot
    }
    return hashedPassword;
}اگر این روش را اجرا کنیم، O را در SOLID خیلی بد می‌شکنیم. هر بار که یک الگوریتم جدید پیاده‌سازی می‌شود، باید کلاس موجود را اصلاح کنیم، و به نظر زشت است.به لطف OOP، ما انتزاع داریم. ما باید کلاس اولیه خود را یک کلاس واسط/انتزاعی (interface/abstract) کنیم و الگوریتم ها را در کلاس های مشخص پیاده سازی کنیم.public class Base64Hasher implements PasswordHasher
{
  @Override
public String hashPassword(String password)
{
 return &amp;quothashed with Base64&amp;quot
 }
}public interface PasswordHasher
{
String hashPassword(String password);
}public class MD5Hasher implements PasswordHasher
{
 @Override
public String hashPassword(String password)
{
  return &amp;quothashed with MD5&amp;quot
}
}به این ترتیب می توانیم الگوریتم های جدیدی را بدون دست زدن به کدهای موجود اضافه کنیم.اصل جایگزینی لیسکوف (Liskov-Substitution Principle)یک کلاس فرعی باید بتواند هر یک از ویژگی های کلاس والد خود را برآورده کند و می تواند به عنوان کلاس والد خود در نظر گرفته شود.برای نشان دادن مثال خود، بیایید کلاس های مدل (داده) را برای استفاده از الگوریتم های هش خود ایجاد کنیم.public abstract class Hashed
{
  PasswordHasher passwordHasher;
String hash;
 public void generateHash(String password)
   {
  hash = passwordHasher.hashPassword(password);
  }
}public class Base64 extends Hashed
{
 public Base64()
  {
  this.passwordHasher = new Base64Hasher();
  }
}و ما همین کار را برای کدگذاری های دیگر پیاده سازی کردیم…برای اجرای قانون Liskov، هر یک از برنامه‌های افزودنی Hashed باید از پیاده‌سازی معتبر تابع هش استفاده کرده و یک هش را برگردانند.به عنوان مثال، اگر کلاس Hashed را با کلاسی به نام NoHash گسترش دهیم که از پیاده‌سازی استفاده می‌کند که دقیقاً همان رمز عبور را بدون هیچ کدگذاری برمی‌گرداند، قانون را زیر پا می‌گذارد، زیرا انتظار می‌رود که یک زیر کلاس از Hashed مقدار هش رمز عبور را داشته باشد.اصل جداسازی رابط (Interface Segregation Principle)اینترفیس ها نباید کلاس ها را مجبور به اجرای کاری کنند که نمی توانند انجام دهند. رابط های بزرگ باید به رابط های کوچک تقسیم شوند.در نظر بگیرید که ما ویژگی رمزگشایی را به رابط اضافه می کنیم.public interface PasswordHasher
{
  String hashPassword(String password);
  String decodePasswordFromHash(String hash);
}این قانون را زیر پا می گذارد زیرا یکی از الگوریتم های ما، SHA256 عملاً قابل رمزگشایی نیست (این یک تابع یک طرفه است). در عوض، می‌توانیم رابط دیگری را به کلاس‌های کاربردی اضافه کنیم تا الگوریتم رمزگشایی آن‌ها را پیاده‌سازی کنیم.public interface Decryptable
{
    String decodePasswordFromHash(String hash);
}
public class Base64Hasher implements PasswordHasher, Decryptable
{
    @Override
    public String hashPassword(String password)
    {
        return &amp;quothashed with base64&amp;quot
    }
    @Override
    public String decodePasswordFromHash(String hash)
    {
        return &amp;quotdecoded from base64&amp;quot
    }
}اصل وارونگی وابستگی (Dependency Inversion Principle)کامپوننت ها باید به انتزاعات بستگی داشته باشند، نه به ادغام.ما یک سرویس رمز عبور مانند زیر داریم:public class PasswordService
{
   private Base64Hasher hasher = new Base64Hasher() {
    void hashPassword(String password)
    {
        hasher.hashPassword(password);
    }
}ما این اصل را نقض کردیم زیرا Base64Hasher و PasswordService را به شدت مرتبط کردیم.بیایید آنها را جدا کنیم و به مشتری اجازه دهیم سرویس هشر مورد نیاز را با سازنده تزریق کند.public class PasswordService
{
    private PasswordHasher passwordHasher;
    public PasswordService(PasswordHasher passwordHasher)
    {
        this.passwordHasher = passwordHasher;
    }
    void hashPassword(String password)
    {
        this.passwordHasher.hashPassword(password);
    }
}خیلی بهتر. ما به راحتی می توانیم الگوریتم هش را تغییر دهیم. سرویس ما به الگوریتم اهمیتی نمی دهد، این به مشتری بستگی دارد که آن را انتخاب کند. ما به اجرای عینی وابسته نیستیم، بلکه به انتزاع بستگی داریم.</description>
                <category>اشکان خالقی</category>
                <author>اشکان خالقی</author>
                <pubDate>Fri, 11 Feb 2022 19:38:23 +0330</pubDate>
            </item>
                    <item>
                <title>مهندس نرم افزار در برابر توسعه دهنده نرم افزار</title>
                <link>https://virgool.io/@khaleqiashkan/%D9%85%D9%87%D9%86%D8%AF%D8%B3-%D9%86%D8%B1%D9%85-%D8%A7%D9%81%D8%B2%D8%A7%D8%B1-%D8%AF%D8%B1-%D8%A8%D8%B1%D8%A7%D8%A8%D8%B1-%D8%AA%D9%88%D8%B3%D8%B9%D9%87-%D8%AF%D9%87%D9%86%D8%AF%D9%87-%D9%86%D8%B1%D9%85-%D8%A7%D9%81%D8%B2%D8%A7%D8%B1-jkj2bfcujty4</link>
                <description>مهندس نرم افزار در مقابل توسعه دهنده نرم افزارمهندس نرم افزار کیست؟مهندس نرم افزار فرد حرفه ای است که اصول مهندسی نرم افزار را برای طراحی، توسعه، نگهداری، تست و ارزیابی نرم افزارهای کامپیوتری به کار می گیرد.توسعه دهنده نرم افزار کیست؟توسعه دهندگان نرم افزار افراد حرفه ای هستند که نرم افزاری را می سازند که در انواع مختلف کامپیوتر اجرا می شود. آنها کد را از ابتدا می نویسند. این برنامه می تواند یک برنامه دسکتاپ مانند فتوشاپ، برنامه های تلفن همراه مانند اینستاگرام یا برنامه های وب مانند فیس بوک و توییتر باشد.تفاوت کلیدیمهندس نرم افزار فرد حرفه ای است که اصول مهندسی نرم افزار را برای طراحی، توسعه، نگهداری، آزمایش و ارزیابی نرم افزارهای کامپیوتری به کار می گیرد، در حالی که توسعه دهنده نرم افزار فرد حرفه ای است که نرم افزاری را می سازد که در انواع مختلف کامپیوتر اجرا می شود.مهندس نرم افزار یک فعالیت تیمی است در حالی که توسعه دهنده نرم افزار در درجه اول یک فعالیت انفرادی است.مهندس نرم افزار با سایر اجزای سیستم سخت افزاری کار می کند در حالی که توسعه دهندگان نرم افزار یک برنامه کامل می نویسند.مهندس نرم افزار ابزارهایی را برای توسعه نرم افزار ایجاد می کند در حالی که توسعه دهندگان نرم افزار از ابزارهای آماده برای ساخت برنامه ها استفاده می کنند.مهندس نرم افزار تمایل دارد مسائل را در مقیاس بسیار بزرگتر حل کند در حالی که توسعه دهندگان نرم افزار تمایل دارند هر کاری را که مهندسان انجام می دهند انجام دهند اما در مقیاس محدود.جستجوی گوگل مهندس نرم افزار در برابر توسعه دهنده نرم افزارمهندس نرم افزار در برابر توسعه دهندهدر اینجا چند تفاوت مهم بین مهندس نرم افزار و توسعه دهنده نرم افزار وجود دارد:مهندس نرم افزار :مدارک لیسانس در مهندسی نرم افزار مزایای بیشتری نسبت به توسعه نرم افزار دارند.مهندسی نرم افزار یک فعالیت گروهی است.یک مهندس نرم افزار در فرآیند کامل شرکت دارد.یک مهندس نرم افزار برای ساختن یک سیستم با سایر مهندسان روی کامپوننت ها کار می کند.مسیر کاری مهندس نرم افزار به صورت - مهندس ارشد توسعه نرم افزار -&gt; مهندس اصلی نرم افزار -&gt; مهندس نرم افزار می باشد.مهندسان تمایل دارند مسائل را در مقیاس بسیار بزرگتر حل کنند. بنابراین، جای زیادی برای راه‌حل‌های خلاقانه باقی نمی‌ماند، و در عوض، آنها باید سیستماتیک‌تر باشند و در حال فکر کردن هستند.مهندس نرم افزار کسی است که ابزارهایی را برای توسعه نرم افزار ایجاد می کند، به عنوان مثال، ویژوال استودیو و اکلیپس.متوسط حقوق یک مهندس نرم افزار 105861 دلار در سال در ایالات متحده است.توسعه دهنده نرم افزار :مدارک توسعه نرم افزار به عنوان تخصص برای فناوری اطلاعات یا برنامه نویسی کامپیوتر تلقی می شود.توسعه در درجه اول یک فعالیت انفرادی است.توسعه یکی از جنبه های فرآیند ساخت پروژه نرم افزاری است.یک توسعه دهنده یک برنامه کامل می نویسد.مسیر کاری توسعه دهنده نرم افزار به صورت - توسعه دهنده -&gt; معمار نرم افزار می باشد.توسعه دهندگان تمایل دارند هر کاری را که مهندسان انجام می دهند انجام دهند اما در مقیاس محدود. این به آنها اجازه می دهد تا خلاق تر از یک مهندس باشند و راه حل هایی ارائه دهند.آنها از ابزارهای نرم افزاری برای توسعه برنامه های وب، موبایل و دسکتاپ استفاده می کنند.متوسط حقوق یک توسعه دهنده نرم افزار 92380 دلار در سال در ایالات متحده است.بهترین روش ها برای مهندسان نرم افزار :در اینجا برخی از بهترین شیوه ها برای مهندسان نرم افزار آورده شده است:مهندسان نرم افزار باید به گونه ای عمل کنند که برای مشتری و همچنین کارفرما مفید باشد.از محصولات نرم افزاری و اصلاحات مربوطه اطمینان حاصل کنید که باید بالاترین استانداردهای حرفه ای را داشته باشند.مهندسان نرم افزار باید بتوانند یکپارچگی و استقلال را در رویکرد حرفه ای خود حفظ کنند.قادر به ترویج و رویکرد اخلاقی برای توسعه و نگهداری نرم افزار باشد.مهندسان نرم افزار باید از همکاران خود حمایت کنند.بهترین روش ها برای توسعه دهندگان نرم افزار :در اینجا چند روش مهم برای توسعه دهندگان نرم افزار آورده شده است:بدانید که چگونه کد شما به پیشبرد بیزینس کلی کمک می کند.از کد به طور موثر در پروژه استفاده کنید.اهداف کدنویسی روزانه خود را بنویسید.برنامه ریزی کنید چگونه وظایف برنامه نویسی خود را فوری انجام دهید.پروژه را با سخت ترین قسمت پروژه خود شروع کنید.چالش های مهندسان نرم افزاردر اینجا برخی از چالش های مهمی که مهندسان نرم افزار با آن مواجه هستند آورده شده است: در مناطق بحرانی ایمنی مانند فضا، نیروگاه های هسته ای و غیره هزینه خرابی نرم افزار می تواند هنگفت باشد زیرا جان انسان ها در خطر است.افزایش تقاضای بازار برای مهندسان نرم افزار کاملا یک چالش است.مواجهه با افزایش پیچیدگی نرم افزار همیشه نیاز به برنامه های کاربردی جدید دارد.تنوع سیستم های نرم افزاری که باید با یکدیگر در ارتباط باشند.چالش های توسعه دهنده نرم افزاربرخی از چالش‌های رایجی که توسعه‌دهنده نرم‌افزار با آن‌ها مواجه است، در زیر آمده است:الزامات کاربر نهایی به اشتباه تفسیر شده است.قادر به مقابله با نیازهای در حال تغییر نیست.کار کردن روی مدل هایی که با هم هماهنگ نیستند.نرم افزاری که نگهداری یا گسترش آن دشوار است.کشف دیرهنگام برخی از ایرادات مهم پروژه.کیفیت پایین نرم افزار یکی دیگر از چالش های رایجی است که اغلب یک نرم افزار به خصوص در پروژه های کم هزینه با آن مواجه است.نقش و مسئولیت مهندسان و توسعه دهندگان نرم افزارمهارت های مهندس نرم افزار و توسعه دهندهباید مهارت های تحلیلی عالی داشته باشد.فرد باید تجربه ایجاد و نگهداری معماری های فناوری اطلاعات و پایگاه داده ها را داشته باشد.طراحی الگو و تجربه با زیرساخت مبتنی بر ابر.تجربه عملی در CPU چند هسته ای.فرد حرفه ای باید بتواند از متدولوژی های مختلف توسعه نرم افزار مانند Agile، Scrum، Kanban استفاده کند.نقش ها و مسئولیت هابرای ارائه راهنمایی های فنی و پشتیبانی از کل فرآیند توسعه محصول، تیمی کار کنید.یک برنامه خوب فکر شده ایجاد کنید که به مشتریان کمک می کند تا برنامه ای تولید کنند که نیازهای مشتری را برآورده کند.یک راهنمای آموزشی آماده کنید که برای کاربران اپلیکیشن قابل استفاده باشد.در جلسات با مشتریان، برنامه نویسان کامپیوتر و سایر کارکنان شرکت کنید.با تکمیل کار تجزیه و تحلیل سیستم ها، عملیات را بهبود می بخشد.دریافت و صدور مجوز نرم افزار پس از به دست آوردن اطلاعات مربوطه از فروشندگان.ارائه داده های مربوطه از طریق جمع آوری، تجزیه و تحلیل و خلاصه کردن مسائل مربوط به خدمات و توسعه.ابزارهایی برای بهبود بهره وری داخلی بسازید.</description>
                <category>اشکان خالقی</category>
                <author>اشکان خالقی</author>
                <pubDate>Wed, 26 Jan 2022 14:11:59 +0330</pubDate>
            </item>
                    <item>
                <title>نحوه تبدیل رشته به عدد صحیح در جاوا</title>
                <link>https://virgool.io/@khaleqiashkan/%D9%86%D8%AD%D9%88%D9%87-%D8%AA%D8%A8%D8%AF%DB%8C%D9%84-%D8%B1%D8%B4%D8%AA%D9%87-%D8%A8%D9%87-%D8%B9%D8%AF%D8%AF-%D8%B5%D8%AD%DB%8C%D8%AD-%D8%AF%D8%B1-%D8%AC%D8%A7%D9%88%D8%A7-mndha70zy73h</link>
                <description>نحوه تبدیل رشته به عدد صحیح در جاوااشیاء رشته ای به صورت رشته ای از کاراکترها نمایش داده می شوند.اگر در Java Swing کار کرده اید، دارای اجزایی مانند JTextField و JTextArea است که ما از آنها برای دریافت ورودی خود از رابط کاربری گرافیکی استفاده می کنیم که ورودی ما را به عنوان یک رشته می گیرد.اگر بخواهیم با استفاده از Swing یک ماشین حساب ساده بسازیم، باید بفهمیم که چگونه یک رشته را به عدد صحیح تبدیل کنیم. این ما را به این سؤال هدایت می کند - چگونه می توانیم یک رشته را به یک عدد صحیح تبدیل کنیم؟در جاوا می توانیم از ()Integer.valueOf و ()Integer.parseInt برای تبدیل رشته به عدد صحیح استفاده کنیم.از ()Integer.parseInt برای تبدیل رشته به عدد صحیح استفاده کنیداین متد رشته را به صورت یک نوع اولیه int برمی گرداند. اگر رشته حاوی یک عدد صحیح معتبر نباشد، یک NumberFormatException پرتاب می کند. بنابراین، هر بار که یک رشته را به int تبدیل می کنیم، باید با قرار دادن کد در داخل بلوک try-catch، از این استثنا مراقبت کنیم.بیایید مثالی از تبدیل رشته به int با استفاده از ()Integer.parseInt ببینیم :String str = &amp;quot25&quot;
        try{
            int number = Integer.parseInt(str);
            System.out.println(number); // output = 25
        }
        catch (NumberFormatException ex){
            ex.printStackTrace();
        }حالا سعی می کنیم این کد را با وارد کردن یک عدد صحیح نامعتبر بشکنیم:String str = &amp;quot25T&quot;
        try{
            int number = Integer.parseInt(str);
            System.out.println(number);
        }
        catch (NumberFormatException ex){
            ex.printStackTrace();
        }همانطور که در کد بالا مشاهده می کنید، ما سعی کرده ایم 25T را به عدد صحیح تبدیل کنیم. این یک ورودی معتبر نیست. بنابراین، باید یک NumberFormatException پرتاب کند.این هم خروجی کد بالا:java.lang.NumberFormatException: For input string: &quot;25T&quot;	at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)	at java.lang.Integer.parseInt(Integer.java:580)	at java.lang.Integer.parseInt(Integer.java:615)	at OOP.StringTest.main(StringTest.java:51)در مرحله بعد، نحوه تبدیل رشته به عدد صحیح را با استفاده از متد ()Integer.valueOf در نظر خواهیم گرفت.از ()Integer.valueOf برای تبدیل رشته به عدد صحیح استفاده کنیداین متد رشته را به عنوان یک شی Integer برمی گرداند. اگر به مستندات جاوا نگاه کنید، ()Integer.valueOf یک شی Integer را برمی گرداند که معادل new Integer(Integer.parseInt(s)) است.هنگام استفاده از این روش، کد خود را در داخل بلوک try-catch قرار می دهیم.اجازه دهید مثالی را با استفاده از متد Integer.valueOf در نظر بگیریم:String str = &amp;quot25&quot;
        try{
            Integer number = Integer.valueOf(str);
            System.out.println(number); // output = 25
        }
        catch (NumberFormatException ex){
            ex.printStackTrace();
        }حالا بیایید سعی کنیم کد بالا را با وارد کردن یک عدد صحیح نامعتبر بشکنیم:String str = &amp;quot25TA&quot;
        try{
            Integer number = Integer.valueOf(str);
            System.out.println(number); 
        }
        catch (NumberFormatException ex){
            ex.printStackTrace();
        }مشابه مثال قبلی، کد بالا یک استثنا ایجاد می کند.این هم خروجی کد بالا:java.lang.NumberFormatException: For input string: &quot;25TA&quot;	at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)	at java.lang.Integer.parseInt(Integer.java:580)	at java.lang.Integer.valueOf(Integer.java:766)	at OOP.StringTest.main(StringTest.java:42)همچنین می‌توانیم قبل از استفاده از روش‌های ذکر شده، متدی ایجاد کنیم تا بررسی کنیم که آیا رشته ارسال شده عددی است یا خیر.من یک روش ساده برای بررسی اینکه آیا رشته ارسال شده عددی است یا خیر ایجاد کرده ام.public class StringTest {
    public static void main(String[] args) {
        String str = &amp;quot25&quot;
        String str1 = &amp;quot25.06&quot;
        System.out.println(isNumeric(str));
        System.out.println(isNumeric(str1));
    }

    private static boolean isNumeric(String str){
        return str != null &amp;&amp; str.matches(&amp;quot[0-9.]+&amp;quot);
    }
}خروجی این است:truetrueمتد ()isNumeric یک رشته را به عنوان آرگومان می گیرد. ابتدا بررسی می کند که آیا null است یا خیر. پس از آن، از متد ()matches استفاده می کنیم تا بررسی کنیم که آیا دارای ارقام 0 تا 9 و یک کاراکتر نقطه است یا خیر.این یک راه ساده برای بررسی مقادیر عددی است. می‌توانید در Google برای regular expression پیشرفته‌تر بنویسید یا جستجو کنید تا بسته به مورد استفاده خود، اعداد را ثبت کنید.این بهترین روش است که قبل از تبدیل آن به عدد صحیح، بررسی کنید که آیا رشته ارسال شده عددی است یا خیر.از خواندن شما سپاسگذارم.کدنویسی مبارک !</description>
                <category>اشکان خالقی</category>
                <author>اشکان خالقی</author>
                <pubDate>Thu, 20 Jan 2022 14:09:11 +0330</pubDate>
            </item>
                    <item>
                <title>تولید اعداد تصادفی در جاوا</title>
                <link>https://virgool.io/@khaleqiashkan/%D8%AA%D9%88%D9%84%DB%8C%D8%AF-%D8%A7%D8%B9%D8%AF%D8%A7%D8%AF-%D8%AA%D8%B5%D8%A7%D8%AF%D9%81%DB%8C-%D8%AF%D8%B1-%D8%AC%D8%A7%D9%88%D8%A7-xjgn5youhbto</link>
                <description>تولید اعداد تصادفی در جاوااعداد تصادفی تولید شده توسط کامپیوتر به دو دسته تقسیم می شوند: اعداد تصادفی واقعی و اعداد شبه تصادفی.اعداد تصادفی واقعی بر اساس عوامل خارجی تولید می شوند. به عنوان مثال، ایجاد تصادفی با استفاده از نویزهای اطراف.اما تولید چنین اعداد تصادفی واقعی یک کار زمان بر است. بنابراین، می‌توانیم از اعداد شبه تصادفی که با استفاده از یک الگوریتم و یک مقدار دانه تولید می‌شوند، استفاده کنیم.این اعداد شبه تصادفی برای اکثر اهداف کافی هستند. به عنوان مثال، می توانید از آنها در رمزنگاری، در ساخت بازی هایی مانند تاس یا کارت ها و در تولید اعداد OTP (گذرواژه یکبار مصرف) استفاده کنید.در این مقاله نحوه تولید اعداد شبه تصادفی با استفاده از ()Math.random در جاوا را یاد خواهیم گرفت.از ()Math.random برای تولید اعداد صحیح استفاده کنید.استفاده از ()Math.random یک عدد شبه تصادفی از نوع double، بزرگتر یا مساوی صفر و کوچکتر از یک را برمی گرداند.در زیر مثال استفاده از آن را می بینید :public static void main(String[] args) {
        double randomNumber = Math.random();
        System.out.println(randomNumber);
    }
    // output #1 = 0.5600740702032417
    // output #2 = 0.04906751303932033متغیر randomNumber برای هر اجرا یک عدد تصادفی متفاوت به ما می دهد.فرض کنید می خواهیم اعداد تصادفی را در یک محدوده مشخص تولید کنیم، مثلاً صفر تا چهار.// generate random numbers between 0 to 4
    public static void main(String[] args) {
        // Math.random() generates random number from 0.0 to 0.999
        // Hence, Math.random()*5 will be from 0.0 to 4.999
        double doubleRandomNumber = Math.random() * 5;
        System.out.println(&amp;quotdoubleRandomNumber = &amp;quot + doubleRandomNumber);
        // cast the double to whole number
        int randomNumber = (int)doubleRandomNumber;
        System.out.println(&amp;quotrandomNumber = &amp;quot + randomNumber);
    }
    /* Output #1
    doubleRandomNumber = 2.431392914284627
    randomNumber = 2
    */وقتی یک double را به int تبدیل می کنیم، مقدار int فقط قسمت عدد کامل را نگه می دارد.به عنوان مثال، در کد بالا، متغیر doubleRandomNumber برابر است با 2.431392914284627. عدد کامل doubleRandomNumber برابر با 2 است و قسمت کسری آن 431392914284627 می باشد. بنابراین randomNumber تنها عدد کامل 2 را نگه می دارد.می توانید اطلاعات بیشتری در مورد متد ()Math.random در مستندات جاوا بخوانید.استفاده از ()Math.random تنها راه برای تولید اعداد تصادفی در جاوا نیست. در مرحله بعد، نحوه تولید اعداد تصادفی را با استفاده از کلاس Random در نظر خواهیم گرفت.از کلاس Random برای تولید اعداد صحیح استفاده کنید.در کلاس Random، ما متدهای نمونه زیادی داریم که اعداد تصادفی را ارائه می کنند. در این بخش، دو روش نمونه را در نظر خواهیم گرفت، nextInt(int bound) و ()nextDouble. نحوه استفاده از متد nextInt(int bound)متد nextInt(int bound) یک عدد شبه تصادفی از نوع int، بزرگتر یا مساوی صفر و کمتر از مقدار کران را برمی گرداند. پارامتر Bound کران را مشخص می کند. برای مثال، اگر کران را 4 مشخص کنیم، nextInt(4) مقدار نوع int را برمی گرداند، بزرگتر یا مساوی صفر و کوچکتر از چهار. 0،1،2،3 نتایج احتمالی nextInt(4) هستند.از آنجایی که این یک متد است، باید یک شی تصادفی برای دسترسی به این متد ایجاد کنیم. بیایید آن را انجام دهیم.public static void main(String[] args) {
        // create Random object
        Random random = new Random();
        // generate random number from 0 to 3
        int number = random.nextInt(4);
        System.out.println(number);
    }نحوه استفاده از متد ()nextDoubleمشابه ()Math.random ، متد ()nextDouble یک عدد شبه تصادفی double، بزرگتر یا مساوی صفر و کوچکتر از یک را برمی گرداند.public static void main(String[] args) {
        // create Random object
        Random random = new Random();
        // generates random number from 0.0 and less than 1.0
        double number = random.nextDouble();
        System.out.println(number);
    }برای اطلاعات بیشتر، می توانید مستندات جاوا درباره کلاس Random را مطالعه کنید.بنابراین از کدام روش اعداد تصادفی باید استفاده کنید؟باید بدانیم که ()Math.random از کلاس Random استفاده می کند. اگر فقط اعداد شبه تصادفی از نوع double را در برنامه خود می خواهیم، می توانیم از ()Math.random استفاده کنیم.در غیر اینصورت می توانیم از کلاس Random به صورتی استفاده کنیم که برای ما استفاده از انواع داده مختلف مانند ()nextInt و ()nextLong و ()nextFloat و ()nextDouble  فراهم می کند.از خواندن شما سپاسگذارم.کدنویسی مبارک !</description>
                <category>اشکان خالقی</category>
                <author>اشکان خالقی</author>
                <pubDate>Tue, 18 Jan 2022 23:34:55 +0330</pubDate>
            </item>
                    <item>
                <title>تبدیل رشته به آرایه ای از کاراکترها در جاوا</title>
                <link>https://virgool.io/@khaleqiashkan/%D8%AA%D8%A8%D8%AF%DB%8C%D9%84-%D8%B1%D8%B4%D8%AA%D9%87-%D8%A8%D9%87-%D8%A2%D8%B1%D8%A7%DB%8C%D9%87-%D8%A7%DB%8C-%D8%A7%D8%B2-%DA%A9%D8%A7%D8%B1%D8%A7%DA%A9%D8%AA%D8%B1%D9%87%D8%A7-%D8%AF%D8%B1-%D8%AC%D8%A7%D9%88%D8%A7-cptgaqrdyfqy</link>
                <description>تبدیل رشته به آرایه ای از کاراکترها در جاوادر این مقاله، نحوه تبدیل یک رشته به آرایه ای از کاراکترها در جاوا را بررسی خواهیم کرد. همچنین به طور خلاصه به شما توضیح خواهم داد که رشته ها، کاراکترها و آرایه ها چی هستند.کاراکتر در جاوا چیست؟کاراکترها انواع داده های اولیه هستند. یک کاراکتر یک کاراکتر واحد است که در داخل علامت تک کوتیشن  &#x27;  قرار می گیرد. یک کاراکتر می تواند یک حرف، یک رقم، یک علامت نقطه گذاری، یک فاصله یا چیزی مشابه باشد. مثلا:char firstVowel = &#039;a&#039;;رشته در جاوا چیست؟رشته ها اشیا هستند (نوع مرجع). یک رشته از یک رشته کاراکتر تشکیل شده است. هر چیزی داخل دبل کوتیشن  &quot;  یک رشته است. مثلا:String vowels = &amp;quotaeiou&amp;quotآرایه در جاوا چیست؟آرایه ها ساختارهای داده بنیادی هستند که می توانند تعداد ثابتی از عناصر از یک نوع داده را در جاوا ذخیره کنند. به عنوان مثال، بیایید یک آرایه از کاراکترها را ایجاد کنیم:char[] vowelArray = {&#039;a&#039;, &#039;e&#039;, &#039;i&#039;, &#039;o&#039;, &#039;u&#039;};اکنون، ما یک درک اساسی در مورد رشته ها، کاراکترها و آرایه ها داریم.بیایید یک رشته را به یک آرایه کاراکتری تبدیل کنیماز متد ()toCharArray استفاده کنید. متد ()toCharArray یکی از متدهای کلاس String است که یک آرایه کاراکتری جدید بر اساس آبجکت رشته حاضر برمی گرداند.بیایید یک مثال را بررسی کنیم:// define a string
String vowels = &amp;quotaeiou&amp;quot

// create an array of characters 
char[] vowelArray = vowels.toCharArray();

// print vowelArray
System.out.println(Arrays.toString(vowelArray));خروجی : [a, e, i, o, u]وقتی یک رشته را به آرایه ای از کاراکترها تبدیل می کنیم، طول ثابت می ماند. بیایید طول vowels و vowelArray را بررسی کنیم :System.out.println(&amp;quotLength of \&#039;vowels\&#039; is &amp;quot + vowels.length());
System.out.println(&amp;quotLength of \&#039;vowelArray\&#039; is &amp;quot + vowelArray.length);خروجی : Length of &#x27;vowels&#x27; is 5Length of &#x27;vowelArray&#x27; is 5برای چاپ آرایه می توانیم از روش های مختلفی استفاده کنیم. من از متد استاتیک ()toString کلاس کاربردی Arrays استفاده کردم.می توانید اطلاعات بیشتری در مورد روش نمونه ()toCharArray در مستندات جاوا بخوانید.از متد ()charAt استفاده کنید.متد ()charAt یکی از متدهای کلاس String است که یک کاراکتر در اندیس مشخص شده رشته فعلی را برمی گرداند.نکته : یک رشته مبتنی بر اندیس صفر است، شبیه به یک آرایه.بیایید ببینیم چگونه می توانیم یک رشته را با استفاده از ()charAt به آرایه ای از کاراکترها تبدیل کنیم:// define a string
String vowels = &amp;quotaeiou&amp;quot

// create an array of characters. Length is vowels&#039; length
char[] vowelArray = new char[vowels.length()];

// loop to iterate each characters in the &#039;vowels&#039; string
for (int i = 0; i &lt; vowels.length(); i++) {
    // add each character to the character array
    vowelArray[i] = vowels.charAt(i);
}

// print the array
System.out.println(Arrays.toString(vowelArray));خروجی : [a, e, i, o, u]می توانید اطلاعات بیشتری در مورد روش نمونه ()charAt در مستندات جاوا بخوانید.من فقط راه دیگری برای تبدیل رشته به آرایه ای از کاراکترها به شما نشان دادم، اما می‌توانیم به جای ایجاد حلقه‌ها و تکرار آن‌ها، از متد ()toCharArray برای تبدیل آسان استفاده کنیم.لطفا در صورت داشتن هر گونه پیشنهاد یا سوال نظرات خود را با من در میان بگذارید.کدنویسی مبارک !</description>
                <category>اشکان خالقی</category>
                <author>اشکان خالقی</author>
                <pubDate>Tue, 18 Jan 2022 18:21:20 +0330</pubDate>
            </item>
                    <item>
                <title>Default Constructor در جاوا</title>
                <link>https://virgool.io/@khaleqiashkan/default-constructor-%D8%AF%D8%B1-%D8%AC%D8%A7%D9%88%D8%A7-frnwuo55s1ay</link>
                <description>Default Constructor در جاواسازنده (constructor) چیست ؟به عنوان یک اصطلاح برنامه نویسی شی گرا مبتنی بر کلاس، یک سازنده متدی منحصر به فرد است که برای مقداردهی اولیه یک شی (class) که جدید ایجاد می شود، استفاده می شود. نام سازنده باید با نام کلاس یکی باشد.سازنده نباید نوع بازگشتی داشته باشد.قبل از اینکه ادامه دهیم، بیایید ببینیم یک کلاس در جاوا چگونه است:public class Student { 
  String firstName;
  String lastName;  
  int age;
 }کد بالا کلاسی به نام Student را با سه ویژگی lastName ،firstName و age نشان می دهد. فرض می کنیم کلاس قرار است مدلی برای ثبت نام دانش آموزان باشد. به یاد داشته باشید که این سه ویژگی هیچ مقداری ندارند بنابراین هیچ یک از اطلاعات هاردکد (hard code) نشده اند.اکنون از سازنده ها برای ایجاد یک نمونه جدید از شی Student خود استفاده می کنیم. به این صورت :public class Student {
  String firstName;
  String lastName;
  int age;

  //Student constructor
  public Student(){
      firstName = &amp;quotَAshkan&amp;quot
      lastName = &amp;quotKhaleghi&amp;quot
      age = 40;
  }

  public static void main(String args[]) {
      Student myStudent = new Student();
      System.out.println(myStudent.age); // 40
  }
}ما یک سازنده ایجاد کردیم که از آن برای مقداردهی اولیه ویژگی های تعریف شده در شی Student استفاده می کنیم. کد بالا نمونه ای از سازنده بدون آرگومان (no-argument) است. اکنون بیایید مثال متفاوتی ببینیم :public class Student {
  String firstName;
  String lastName;
  int age;

  //constructor
  public Student(String firstName, String lastName, int age){
      this.firstName = firstName;
      this.lastName = lastName;
      this.age = age;
  } 

  public static void main(String args[]) {
    Student myStudent = new Student(&amp;quotAshkan&amp;quot, &amp;quotKhaleghi&amp;quot, 40);
    System.out.println(myStudent.age);
  }
}اکنون یک سازنده پارامتری (parameterized constructor) ایجاد کرده ایم. سازنده پارامتری، سازنده ای است که با آرگومان ها/پارامترها ایجاد می شود.بیایید آن را تجزیه کنیم.public Student(String firstName, String lastName, int age){
      
  }ما یک سازنده جدید ایجاد کردیم که سه آرگومان - دو رشته و یک عدد صحیح را می گیرد.this.firstName = firstName;
this.lastName = lastName;
this.age = age;سپس این آرگومان ها را به ویژگی هایی که در زمان ایجاد کلاس خود تعریف کرده بودیم پیوند دادیم. اکنون شی Student را با استفاده از سازنده مقداردهی اولیه کرده ایم.public static void main(String args[]) {
    Student myStudent = new Student(&amp;quotAshkan&amp;quot, &amp;quotKhaleghi&amp;quot, 40);
    System.out.println(myStudent.age);
  }در نهایت، ما یک نمونه جدید از شی Student ایجاد کردیم و به آن آرگومان های خود را پاس دادیم. ما توانستیم این آرگومان ها را پاس کنیم بخاطر اینکه قبلاً آنها را در سازنده تعریف کرده بودیم.من یک سازنده با سه آرگومان ایجاد کردم، اما شما می توانید سازنده های جداگانه برای مقداردهی اولیه هر ویژگی ایجاد کنید.اکنون که می دانید سازنده در جاوا چیست و چگونه از آن استفاده کنید، بیایید اکنون سازنده های پیش فرض (default constructor) را بررسی کنیم.سازنده پیش فرض (default constructor) چیست ؟سازنده پیش‌فرض سازنده‌ای است که توسط کامپایلر ایجاد می‌شود، اگر هیچ سازنده(هایی) برای یک کلاس تعریف نکنیم.public class Student {
  String firstName;
  String lastName;
  int age;
  
  public static void main(String args[]) {
      Student myStudent = new Student();
      
      myStudent.firstName = &amp;quotAshkan&amp;quot
      myStudent.lastName = &amp;quotKhaleghi&amp;quot
      myStudent.age = 40;
      
      System.out.println(myStudent.age);//40
      
      System.out.println(myStudent.firstName);//Ashkan
  }
}آیا می توانید تفاوت بین این و دو مثال قبلی را تشخیص دهید؟توجه داشته باشید که قبل از ایجاد myStudent هیچ سازنده ای برای مقداردهی اولیه ویژگی های ایجاد شده در کلاس تعریف نکردیم.این خطایی را برای ما ایجاد نمی کند. در عوض، کامپایلر یک سازنده خالی ایجاد می کند، اما شما این سازنده را در هیچ کجای کد نمی بینید. زمانی که کامپایلر کار خود را شروع می کند، کد بالا به این صورت خواهد بود:public class Student {
  String firstName;
  String lastName;
  int age;

  /* empty constructor created by compiler. This constructor will not be seen in your code */
  Student() {
  
  }
  
  public static void main(String args[]) {
      Student myStudent = new Student();
      
      myStudent.firstName = &amp;quotAshkan&amp;quot
      myStudent.lastName = &amp;quotKhaleghi&amp;quot
      myStudent.age = 40;
      
      System.out.println(myStudent.age);
      //100
      
      System.out.println(myStudent.firstName);
      //Ihechikara
  }
}بسیاری از افراد سازنده پیش فرض را با سازنده بدون آرگومان اشتباه می گیرند، اما در جاوا یکسان نیستند. هر سازنده ای که توسط برنامه نویس ایجاد شود به عنوان سازنده پیش فرض در جاوا در نظر گرفته نمی شود. نتیجهدر این مقاله، ما یاد گرفتیم که سازنده چیست و چگونه می توانیم آنها را برای مقداردهی اولیه اشیاء خود ایجاد و استفاده کنیم. همچنین در مورد سازنده های پیش فرض و تفاوت آنها با سازنده های بدون آرگومان صحبت کردیم.کدنویسی مبارک !</description>
                <category>اشکان خالقی</category>
                <author>اشکان خالقی</author>
                <pubDate>Sat, 15 Jan 2022 16:35:19 +0330</pubDate>
            </item>
            </channel>
</rss>