Эти не элегантные фрагменты кода Java (1)

Java

Я думаю, что строгость важна для каждого программиста, а написание элегантного и эффективного кода — наша цель на всю жизнь.

предисловие

Это может быть причина для Богородицы, у меня есть высокое требование кода, я буду переживать раньше, я буду возродиться, прежде чем я отправил код. В прошлом я прошел много неудовлетворенного кода-фрагмента, и у меня есть стажер , и много лет, написанные коллегами, которые разработали опыт. Сегодня вдруг сердце и поделитесь некоторыми фрагментами кода, надеюсь принести вдохновение и вдохновение каждому.

тема

Из-за влияния нашего стереотипного мышления код, который мы пишем, во многих случаях не напоминает другим, и нам трудно найти какие-то неподходящие места.

Плохое понимание карты

Student student=new Student("邵磊");
Map<String, Object> map3 = new HashMap<String, Object>();
map3.put("k", "学院");
map3.put("v", student.getCollogeName());
resultlist.add( map3);

Map<String, Object> map4 = new HashMap<String, Object>();
map4.put("k", "专业");
map4.put("v", student.getMajorName());
resultlist.add( map4);

Map<String, Object> map5 = new HashMap<String, Object>();
map5.put("k", "班级");
map5.put("v", student.getBjmc());
resultlist.add(map5);

Из приведенного выше кода вы можете сразу увидеть, что этот разработчик, вероятно, просто использовал карту в начале и обнаружил, что все карты после list.add являются последними. Исходный код выглядит следующим образом

Student student=new Student("邵磊");
Map<String, Object> map = new HashMap<String, Object>();
map.put("k", "学院");
map.put("v", student.getCollogeName());
resultlist.add( map3);

map.put("k", "专业");
map.put("v", student.getMajorName());
resultlist.add( map);

Такой код приведет к перезаписи карты, потому что ключ тот же.
Так что плохого в том, чтобы изменить его код?
Основная проблема это имя переменной.Например,по этой логике в следующий раз вам понадобятся map6,map7 и map8.После того как эта переменная будет поддерживаться несколько раз,удалять или добавлять ее не элегантно.Вы могли бы ну поменяй на:

Student student=new Student("邵磊");
Map<String, Object> map = new HashMap<String, Object>();
map.put("k", "学院");
map.put("v", student.getCollogeName());
resultlist.add( map3);

map = new HashMap<String, Object>();
map.put("k", "专业");
map.put("v", student.getMajorName());
resultlist.add( map);

Таким образом, каждый раз, когда создается новая хэш-карта, проблема неэлегантного именования может быть устранена. Подумав об этом еще раз, я чувствую, что добавление k и v на карту немного неэлегантно, поэтому я просто изменил его на класс сущности.

Student student=new Student("邵磊");
resultlist.add( new MapKV("学院",student.getCollogeName()) );
resultlist.add( new MapKV("专业",student.getMajorName()) );

И этот MapKV вводить не надо, там всего 2 String k v.

Я не очень хорошо разбираюсь в mybatis

public interface QuestionDao {
    List<Question> getQuestionList();
}

Соответствующий файл карты QuestionMapper.xml

List<Question> questionList = QuestionDao.findBy(params);
if (mexamQuestionList == null) {
    //抛异常
}

Список, возвращаемый слоем dao mybatis, не может быть нулевым, даже если size()=0 вернет только новый список, поэтому нет необходимости оценивать список как нулевой

незнакомый с равными

  if (user.get("sl").equals("邵磊")) {
    //一大堆代码  
  }

Многие люди говорят, как эта ошибка может существовать? Если фронт равен нулю, будет сообщено об ошибке. Однако я искал предыдущие проекты по всему миру, и я неизбежно могу найти один или два. В конце концов, есть исторические проблемы, стажер проблемы и тд. Поскольку мы знаем, что null не может быть .equals, измените его на:

  if ("邵磊".equals(user.get("sl"))) {
    //一大堆代码  
  }

злоупотребление toString

user.get("sl").toString();

И как только фронт станет нулевым, будет сообщено об ошибке, а нуль не может иметь никакого метода.

не знаком с возвратом

    public String getResult() {
        if ("条件") {
            //一大堆代码
            return "结果";
        }else {
            //一大堆代码
            return "结果";
        }
    }

Теперь, когда есть возврат, вы можете подтвердить, что следующий код не пойдет, вы можете с уверенностью его выпустить.

public String getResult() {
        if ("条件") {
            //一大堆代码
            return "结果";
        }
        //一大堆代码
        return "结果";
    }

Не буду использовать продолжение, прерывание, если оно слишком длинное

Например, при поиске имени в списке, когда оно будет найдено, необходимо сделать перерыв во времени, чтобы сэкономить ЦП.

        for (int i = list.size() - 1; i >= 0; i--) {
            if ("邵磊".equals(list.get(i).getName())) {
                user=list.get(i);
            }
        }

изменить на

        for (int i = list.size() - 1; i >= 0; i--) {
            if ("邵磊".equals(list.get(i).getName())) {
                user=list.get(i);
                break;
            }
        }

Предполагая, что некоторые операции не выполняются, кроме как для человека с определенным именем, код выглядит следующим образом:

        for (int i = list.size() - 1; i >= 0; i--) {
            if ("邵磊".equals(list.get(i).getName())) {
                //这里只有2件事。
                user=list.get(i);
            }else{
                //这里做很多事情
            }
        }

На этом этапе мы можем удалить if и использовать continue

        for (int i = list.size() - 1; i >= 0; i--) {
            if ("邵磊".equals(list.get(i).getName())) {
                //这里只有2件事。
                user=list.get(i);
                continue;
            }
            //这里做很多事情
        }

продолжить: выйти из этого цикла и перейти к следующему циклу
break: выйти из тела цикла и продолжить выполнение тела функции вне цикла
return: выйти из всего тела функции, часть после тела функции больше не выполняется

Незнакомый для цикла

        if (list.size()==0) {
            for (int i = list.size() - 1; i >= 0; i--) {
                //做事情
            }
        }

И мы знаем, что даже list.size()==0 не повлияет на код, лучше напрямую

        for (int i = list.size() - 1; i >= 0; i--) {
            //做事情
        }

Неправильное использование try catch

попробуйте поймать обертку куска

        try {
            //这段代码可能异常
            //下面代码不会异常
            //此处代码不会异常
            //此处代码不会异常
        } catch (Exception e) {
            //报错
        }

вместо

        try {
            //这段代码可能异常
        } catch (Exception e) {
            //报错
        }
        //下面代码不会异常
        //此处代码不会异常
        //此处代码不会异常

Это более читабельно, более элегантно, и, конечно же, броски также можно использовать для перехвата исключений. try catch записывается в цикле for

    for (int i = list.size() - 1; i >= 0; i--) {
        try {
            //这段代码可能异常
        } catch (Exception e) {
            //报错
        }
        //下面代码不会异常
    }

Мы знаем, что try catch упакует весь код, который требует ресурса, часто TRYCATCH, в дополнение к особым обстоятельствам, иначе метод может быть извлечен, а метод может быть завернут.

Повтор фрагмента

Например, если метод вызывается несколько раз в определенном классе, но различаются только некоторые переменные, методы и переменные можно извлечь, чтобы сделать код кратким.

не используйте регистр

        if(type==1){

        }else if(type==2){

        }else if(type==3){

        }else if(type==4){

        }
        …………

При таком написании будет написано длинное if, и мы знаем, что использование регистра также может решить проблему сопоставления строк.В Java 7 и выше поддерживаются регистровые строки.

switch(参数) {  
    case 常量表达式1: break;  
    case 常量表达式2: break;  
    ...  
    default: break;  
}  

Ленивая загрузка не используется

как

String str = "邵磊";
if (i == 1){
    list.add(str);
}

можно изменить на

if (i == 1){
    String str = "邵磊";
    list.add(str);
}

Постоянно создавать ссылку на объект

for (int i = 1; i <= 100; i++)
{
    Object obj = new Object();
    //其他代码
}

Это только откроет много ссылок на объекты Object в памяти, которые можно изменить на

Object obj;
for (int i = 1; i <= 100; i++)
{
    obj = new Object();
    //其他代码
}

Суммировать

У нас может быть много идей и мы можем написать много видов кода для решения проблемы, но написание кода элегантно - это техническая задача. Конечно, на этот раз я сначала представлю часть. Если внимание будет высоким, я продолжу обновлять его. . Напоследок хочу добавить, что я не Дева, просто люди так обо мне говорят, так что я это признаю.

Если вы чувствуете себя хорошо, не забудьте следовать за мной!
Самородки:
Наггетс. Талант / пользователь / 272334 ...