JavaRush /Java блогы /Random-KK /Жаңадан бастаған бағдарламашылардың 8 жиі кездесетін қате...

Жаңадан бастаған бағдарламашылардың 8 жиі кездесетін қателігі

Топта жарияланған
Сәлеметсіз бе! Бүгін біз Java әзірлеушілерін бастаған (тек қана емес) жіберетін 8 жалпы қателердің тізімін қарастырамыз. Интернетте сіз көптеген осындай жинақтарды таба аласыз: олардың көпшілігі бір-біріне ұқсас. Бұл тізімді құрастырған кезде біз бір критерийді басшылыққа алдық: оқу және жұмыс кезінде өзіміз бұл қателіктер жібердік пе :) Оларға басымдық берілмейді және түсіну және есте сақтау үшін бірдей маңызды.
  1. көмегімен an objectілерді салыстыру ==.

    Оператор ==нысан сілтемелерін салыстырады.

    Сілтемелер жадтағы мекенжайларға нұсқайды және олар әртүрлі мекенжайларда болса, арқылы салыстыру ==қайтарылады 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);
       }
    }

    Класстағы an objectілерді салыстыру үшін Objectарнайы әдіс бар - equals(). Оның әдепкі іске асырылуы, шынын айтқанда, осылайша:

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

    Сыныптың өзінде Objectәдіс логикасы equals()екі сілтемені салыстыру ретінде жүзеге асырылады. Өз кезегінде, an objectілерді дұрыс салыстыру үшін бұл әдісті нақты an objectілер үшін нақты бағдарламада маңызды болып табылатын критерийлерге сәйкес қайта анықтау керек. Теңдік критерийлерін өзіңіз анықтайсыз.

    Ұмытпау керек жалғыз нәрсе - бұл дұрыс қайта анықтауға қойылатын талаптар equals(). Сіз оларды Интернетте оңай таба аласыз, бірақ біздің керемет студенттеріміз осы тақырып бойынша мақала жасады .

  2. Статикалық әдістерде статикалық емес айнымалыларды пайдалану (және керісінше).

    Егер сіз « Х статикалық емес айнымалыға статикалық контекстен сілтеме жасауға болмайды » деген жазуды көрген болсаңыз - клубқа қош келдіңіз :)

    Статикалық әдістер статикалық емес класс айнымалыларына қол жеткізе алмайды.

    Бұл қисынды: ақыр соңында, статикалық әдісті класс an objectісін жасамай-ақ шақыруға болады және барлық өріс айнымалылары нақты an objectілерге жатады. Бұл қателікке апаратын қайшылық.

    Керісінше, бұл мүмкін: статикалық емес әдістерде статикалық айнымалыларды қолдануға рұқсат етіледі:

    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. Параметрлердің әдістерге қалай берілетінін түсінбеу: сілтеме немесе мән бойынша.

    Объектілер мен примитивтер әдістерге параметрлер ретінде әртүрлі жолдармен беріледі: біріншісі сілтеме бойынша, екіншісі мән бойынша.

    Жаңадан бастаушылар бұл тұжырымдаманы түсіну қиынға соғады, нәтижесінде олардың codeы күтпеген жерден әрекет етеді:

    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тың оқылуына қатты әсер етеді.

    Ведь 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