JavaRush /وبلاگ جاوا /Random-FA /8 اشتباه رایج برنامه نویسان تازه کار

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

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

    اپراتور ==مراجع اشیاء را مقایسه می کند.

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

    public class Car {
    
       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روش خاصی وجود دارد - equals(). پیاده سازی پیش فرض آن، صادقانه بگویم، چنین است:

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

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

    تنها چیزی که نباید فراموش کنید، فهرست الزامات برای لغو مناسب است equals(). شما به راحتی می توانید آنها را در اینترنت پیدا کنید، اما دانش آموزان باحال ما قبلاً مقاله ای در مورد این موضوع تهیه کرده اند .

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

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

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

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

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

    public class Main {
    
       public int x = 10;
    
       public static int staticX = 100;
    
       public static void main(String[] args) {
    
           System.out.println(x);//ошибка компиляции, так нельзя!
       }
    
       public void printX() {
    
           System.out.println(staticX);//а так можно!
       }
    }
  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. نادیده گرفتن قوانین کدنویسی

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

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

    Ведь code не всегда будет только твоим. Ты можешь перевестись на другой проект в компании, и он перейдет по наследству к твоим коллегам, которые будут явно не в восторге, получив в работу что-то вроде этого:

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

    Твой code может быть гениальным с точки зрения производительности, но если его невозможно прочитать и понять How он, собственно, работает, цена его, увы, невелика.

    Придерживайся стандартов написания, и твой code, даже далекий от идеала, хотя бы прочтут более опытные товарищи и подскажут, что с технической точки зрения в нем можно улучшить :)

  5. Непонимание работы класса String

    public class Main {
    
       public static void main(String[] args) {
    
           String s1 = "Я изучаю Java";
           String s2 = new String("Я изучаю Java");
    
           System.out.println(s1 == s2);
       }
    }

    Если ты не знаешь, почему этот code выводит false, знания явно нужно подтянуть:)

    Новички часто не знают что такое String Pool и How он работает.

    Как следствие, не до конца ясно, How правильно сравнивать строки в своем codeе. В одной из наших лекций мы подробно рассматривали эту тему

  6. Неправильная работа с исключениями.

    Это свойственно не только новичкам, но и опытным разработчикам. Причин несколько.

    Во-первых, универсального рецепта не существует. Ошибки в программе бывают разные, сценарии их обработки, соответственно, тоже. Во-вторых, не все понимают структуру stackTrace, а антипаттернов обработки ошибок очень много, и каждый из них «неправилен» по-своему. Так что вариантов сделать неправильно здесь намного больше, чем где бы то ни было.

    Распространенные антипаттерны приведены здесь:

  7. Неполное понимание работы операторов (арифметических, логических и других).

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

    Простой пример. Сможешь сходу сказать, что выведет этот code?

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

    Если ты ответил неправильно or наугад, значит, в этой области пока есть пробелы:)

    Код выведет false, потому что приоритет у оператора сравнения == выше, чем у постфиксного инкремента ++. Поэтому сначала будет выполнено сравнение 7 == i, и только потом - операция i++.

    По этой теме, кстати, у нас тоже была подробная лекция. Вот link, если пропустил.

  8. Пропуск слова break в операторе switch.

    Эту ошибку, вероятно, допускали многие из читателей!)

    public class Main {
    
       public static void main(String[] args) {
    
           int i = 1;
    
           switch (i) {
    
               case 1: {
                   System.out.println("Число равно 1");
               }
               case 2: {
                   System.out.println("Число равно 2");
               }
               case 3: {
                   System.out.println("Число равно 3");
               }
           }
       }
    }

    В результате на них обрушивается водопад из всех возможных вариантов:

    Вывод:

    
    Число равно 1
    Число равно 2
    Число равно 3

    Оператор break прерывает работу оператора switch в момент, когда отработал один из вариантов. Не стоит о нем забывать, иначе результат может быть неожиданным :)

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