CodeGym /وبلاگ جاوا /Random-FA /8 اشتباه رایج برنامه نویسان تازه کار
John Squirrels
مرحله
San Francisco

8 اشتباه رایج برنامه نویسان تازه کار

در گروه منتشر شد
سلام! امروز به 8 اشتباه بسیار رایج توسط توسعه دهندگان تازه کار (و دیگر) جاوا نگاه خواهیم کرد. شما تعداد زیادی از این لیست ها را در وب خواهید یافت: بسیاری از آنها شبیه به یکدیگر هستند. همانطور که لیست خود را جمع آوری می کردیم، با یک معیار هدایت می شدیم: اینکه آیا خودمان در طول تحصیل یا اشتغال اشتباهات را مرتکب شده ایم :) آنها بر اساس اهمیت طبقه بندی نمی شوند - آنها به همان اندازه برای شما مهم هستند که بفهمید و به خاطر بسپارید.
  1. مقایسه اشیاء با استفاده از == .

    عملگر == مراجع شی را مقایسه می کند.

    مراجع به آدرس هایی در حافظه اشاره می کنند. اگر آنها در آدرس های مختلف ذخیره شوند، مقایسه با استفاده از == false را برمی گرداند .

    public class Vehicle {
    
        String model;
        int maxSpeed;
        int yearOfManufacture;
    
        public Car(String model, int maxSpeed, int yearOfManufacture) {
            this.model = model;
            this.maxSpeed = maxSpeed;
            this.yearOfManufacture = yearOfManufacture;
        }
    
        public static void main(String[] args) {
            Car ferrari = new Car("Ferrari 360 Spider", 280, 1996);
            Car ferrariTwin = new Car("Ferrari 360 Spider", 280, 1996);
            System.out.println(ferrari == ferrariTwin);
        }
    }

    برای مقایسه اشیاء، کلاس Object یک متد خاص دارد: ()quals . صادقانه بگویم، اجرای پیش فرض آن بد نیست:

    public boolean equals(Object obj) {
        return (this == obj);
    }

    در خود کلاس Object ، متد () quals به عنوان مقایسه دو مرجع پیاده سازی می شود. به نوبه خود، برای مقایسه صحیح اشیاء، باید این روش را با توجه به معیارهایی که در برنامه خاص شما برای اشیاء خاص شما مرتبط است، دوباره تعریف کنید. معیارهای برابری به شما بستگی دارد.

    تنها چیزی که نباید فراموش کنید لیست الزامات برای نادیده گرفتن صحیح () برابر است . به راحتی می توانید آنها را در اینترنت پیدا کنید.

  2. استفاده از متغیرهای غیر ایستا در روش های ایستا (و بالعکس).

    اگر تا به حال پیام "متغیر غیر استاتیک x را نمی توان از یک زمینه ایستا ارجاع داد" را دیده اید، به باشگاه خوش آمدید :)

    متدهای استاتیک به متغیرهای غیر استاتیک (مثلا) دسترسی ندارند.

    این منطقی است: به هر حال، یک متد استاتیک را می توان بدون ایجاد یک شی از کلاس آن فراخوانی کرد و همه فیلدها متعلق به اشیاء خاصی هستند. و در اینجا تناقضی است که موجب خطا می شود.

    به هر حال، رفتن به سمت دیگر به خوبی کار می کند: می توانید از متغیرهای استاتیک در روش های غیر استاتیک استفاده کنید:

    public class Main {
    
        public int x = 10;
    
        public static int staticX = 100;
    
        public static void main(String[] args) {
    
            System.out.println(x); // Compilation error - you can't do this!
        }
    
        public void printX() {
    
            System.out.println(staticX); // But you can do this!
        }
    }

  3. درک نادرست نحوه ارسال آرگومان ها به روش ها: با مرجع یا ارزش.

    اشیاء و بدوی به دو روش مختلف به روش‌ها منتقل می‌شوند: اول، با مرجع. دوم، بر اساس ارزش.

    افراد مبتدی اغلب درک این مفهوم را دشوار می دانند. در نتیجه، کد آنها به طور غیرمنتظره ای رفتار می کند:

    public class Main {
    
        public static void main(String[] args) {
    
            int x = 7;
            incrementNumber(x);
            System.out.println(x);
    
            Cat cat = new Cat(7);
            catLevelUp(cat);
            System.out.println(cat.getAge());
    
        }
    
        public static void catLevelUp(Cat cat) {
    
            cat.setAge(cat.getAge()+1);
        }
    
        public static void incrementNumber(int x) {
            x++;
        }
    }

    اگر دقیقاً نمی دانید که کدام عدد افزایش می یابد و کدام افزایش نمی یابد (عدد قدیمی ساده یا سن گربه)، پس درس ما را در مورد موضوع دوباره بخوانید .

  4. نادیده گرفتن قوانین کدنویسی

    این نه تنها در مورد رعایت برخی اصول "فنی"، بلکه در مورد قراردادهای نامگذاری دنیوی نیز صدق می کند.

    همه این قوانین (نحوه نامگذاری متغیرها، نحوه نوشتن نام متدها) به دلیلی ابداع شده اند. آنها واقعاً بر خوانایی کد تأثیر می گذارند

    به هر حال، کد همیشه تنها مال شما نخواهد بود. ممکن است به پروژه دیگری در شرکت خود منتقل شوید. همکاران شما که کد شما را به ارث می برند، بدیهی است که وقتی چیزی شبیه به این را ببینند خوشحال نخواهند شد:

    public class Cat {
    
        private int S_O_M_E_T_H_I_N_G = 7;
        public String striiiiiiiiiiiiiing;
        protected double I_HAVE_NO_IDEA_WHAT_THIS_IS = 3.14;
        boolean random = Math.random() > 0.5;
    
    }

    کد شما ممکن است به طرز هوشمندانه ای کارایی بالایی داشته باشد، اما اگر خواندن و درک نحوه عملکرد آن غیرممکن باشد، افسوس که ارزش زیادی ندارد.

    اگر به استانداردهای کدنویسی پایبند باشید، حتی اگر کد شما از ایده آل فاصله زیادی دارد، حداقل همکاران با تجربه تر شما می توانند به شما بگویند که چگونه می توان آن را از نظر فنی بهبود بخشید :)

  5. سوء تفاهم کلاس String

    public class Main {
    
        public static void main(String[] args) {
    
            String s1 = "I'm learning Java";
            String s2 = new String("I'm learning Java");
    
            System.out.println(s1 == s2);
        }
    }

    اگر نمی دانید چرا این کد نادرست نمایش داده می شود ، بدیهی است که باید دانش خود را تقویت کنید :)

    مبتدیان اغلب از String Pool و نحوه عملکرد آن بی اطلاع هستند.

    در نتیجه، آنها به طور کامل نمی دانند که چگونه رشته ها را در کد خود به درستی مقایسه کنند. ما این موضوع را در یکی از درس های خود به طور مفصل بررسی کردیم .

  6. مدیریت نادرست استثناها

    مبتدی ها تنها کسانی نیستند که در این مورد دچار مشکل می شوند. توسعه دهندگان باتجربه نیز دچار مشکل می شوند. دلایل بسیار است.

    اول، هیچ دستور العمل جهانی وجود ندارد. برنامه ها انواع خطاهای مختلف و سناریوهای مختلف رسیدگی به خطا را دارند.

    دوم، همه نمی دانند که چگونه یک stack trace ساختار یافته است. خطاهای زیادی در رسیدگی به آنتی الگوها وجود دارد و هر یک از آنها در نوع خود "اشتباه" هستند. این بدان معناست که اشتباه در رسیدگی به خطا بسیار آسان تر از هر چیز دیگری است.

  7. درک کامل نحوه عملکرد عملگرها (حساب، منطقی و غیره).

    8 اشتباه رایج برنامه نویسان تازه کار - 2

    در اینجا یک مثال ساده است. آیا می توانید بلافاصله بگویید این کد چه چیزی را نشان می دهد؟

    public class Main {
    
        public static void main(String[] args) {
    
            int i = 6;
            System.out.println(7 == i++);
        }
    }

    اگر به اشتباه پاسخ دادید یا فقط حدس زدید، پس هنوز در این زمینه شکاف دانشی دارید :)

    کد نادرست نمایش داده می شود ، زیرا عملگر برابری ( == ) اولویت بالاتری نسبت به عملگر افزایشی پسوند ( ++ ) دارد. بنابراین ابتدا مقایسه 7 == i اجرا می شود و تنها پس از آن عملیات i++ انجام می شود.

    اتفاقا ما در این مورد هم درس مفصلی داشتیم. اگر آن را از دست دادید این لینک است.

  8. حذف کلمه break در دستور switch .

    بسیاری از افرادی که این مقاله را می خوانند مطمئناً مرتکب این اشتباه شده اند! :)

    public class Main {
    
        public static void main(String[] args) {
    
            int i = 1;
    
            switch (i) {
    
                case 1: {
                    System.out.println("The number is equal to 1");
                }
                case 2: {
                    System.out.println("The number is equal to 2");
                }
                case 3: {
                    System.out.println("The number is equal to 3");
                }
            }
        }
     }

    در نتیجه، اجرا از هر گزینه ممکن عبور می کند:

    خروجی:

    عدد برابر با 1 عدد برابر با 2 عدد برابر با 3 است

    دستور break اجرای دستور switch را زمانی که یکی از گزینه ها اجرا می شود قطع می کند. فراموش نکنید وگرنه ممکن است نتایج غیر منتظره ای دریافت کنید :)

نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION