JavaRush /Блоги Java /Random-TG /8 хатогиҳои маъмули барномасозони навкор

8 хатогиҳои маъмули барномасозони навкор

Дар гурӯҳ нашр шудааст
Салом! Имрӯз мо рӯйхати 8 хатогиҳои маъмулеро, ки аз ҷониби таҳиягарони ибтидоӣ (ва на танҳо) Java содир карда шудаанд, дида мебароем. Шумо дар Интернет бисёр чунин коллексияҳоро хоҳед ёфт: бисёре аз онҳо ба ҳамдигар монанданд. Вақте ки мо ин рӯйхатро тартиб додем, мо як меъёрро роҳбарӣ мекардем: оё мо худамон дар вақти таҳсил ва кор ба ин хатогиҳо роҳ додаем :) Онҳо афзалият надоранд ва барои фаҳмидан ва дар хотир нигоҳ доштани онҳо якхела муҳиманд.
  1. Муқоисаи an objectҳо бо истифода аз ==.

    Оператор ==истинодҳои 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. Истифодаи тағирёбандаҳои ғайристатикӣ дар усулҳои статикӣ (ва баръакс).

    Агар шумо ягон бор навиштаҷоти " Тағйирёбандаи ғайристатикии x-ро аз контексти статикӣ истинод кардан мумкин нест " -ро дида бошед - ба клуб хуш омадед :)

    Усулҳои статикӣ ба тағирёбандаҳои синфи ғайристатикӣ дастрасӣ надоранд.

    Ин мантиқист: дар ниҳоят, усули статикиро бидуни эҷоди 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а.

    И это касается не только соблюдения тех or иных «технических» принципов, но и банальных соглашений об именовании.

    Все эти правила «How надо называть переменные», «How надо писать названия методов» были придуманы не просто так. Это и правда сильно влияет на читаемость 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