Несколько советов по оптимизации кода

Java

предисловие

Недавно я прочитал книгу «Рефакторинг-улучшение дизайна существующего кода», обобщил несколько советов по оптимизации кода и поделился ею с вами.

Функция уточнения (соответствующее извлечение небольших функций)

определение

Функция уточненияЭто значит поместить кусок кода в отдельную функцию и позволить имени функции объяснить, для чего она предназначена.

Слишком многословная функция или фрагмент кода, который необходимо прокомментировать, чтобы сделать его понятным, рассмотрите возможность разделения его нафункциональная единицаи определитьЧеткие и короткие имена функций, что делает код более элегантным.

Пример оптимизации

Перед уточнением функции:

    private String name;
    private Vector<Order> orders = new Vector<Order>();

    public void printOwing() {
        //print banner
        System.out.println("****************");
        System.out.println("*****customer Owes *****");
        System.out.println("****************");

        //calculate totalAmount
        Enumeration env = orders.elements();
        double totalAmount = 0.0;
        while (env.hasMoreElements()) {
            Order order = (Order) env.nextElement();
            totalAmount += order.getAmout();
        }

        //print details
        System.out.println("name:" + name);
        System.out.println("amount:" + totalAmount);
    }

После уточнения функции:

Приведенный выше код можно извлечь вРаспечатать баннер, рассчитать totalAmount, распечатать детали три функцииОдна функция, как показано ниже:

    private String name;
    private Vector<Order> orders = new Vector<Order>();

    public void printOwing() {
        
        //print banner
        printBanner();
        //calculate totalAmount
        double totalAmount = getTotalAmount();
        //print details
        printDetail(totalAmount);
    }

    void printBanner(){
        System.out.println("****************");
        System.out.println("*****customer Owes *****");
        System.out.println("****************");
    }

    double getTotalAmount(){
        Enumeration env = orders.elements();
        double totalAmount = 0.0;
        while (env.hasMoreElements()) {
            Order order = (Order) env.nextElement();
            totalAmount += order.getAmout();
        }
        return totalAmount;
    }

    void printDetail(double totalAmount){
        System.out.println("name:" + name);
        System.out.println("amount:" + totalAmount);
    }

Встроенные функции (при необходимости удалите лишние функции)

определение

встроенная функцияЭто вставка тела функции в точку вызова функции, а затем удаление функции.

Предыдущий раздел представилФункция уточненияоптимизация кода доКороткие и понятные небольшие функцииГордый. Но разве чем больше мелких функций не лучше? Конечно, нет. Иногда вы столкнетесь с некоторыми функциями, внутренний код и имена которых одинаково понятны. В это время вы можете рассмотретьвстроенная функцияОптимизируйте это.

Пример оптимизации

перед встроенной функцией

    int getRating(){
        return moreThanFiveDeliveries() ? 2 : 1;
    }
    boolean moreThanFiveDeliveries(){
        return numberOfLateDeliveries >5;
    }

после встроенной функции

  int getRating(){
        return numberOfLateDeliveries >5 ? 2 : 1;
 }

Встроенные временные переменные (удалить лишние временные переменные)

определение

Встроенные временные переменныеЗамените все ссылки на переменную самим выражением, которое присваивает ей значение.

Пример оптимизации

перед встраиванием временных переменных

double basePice = anOrder.basePrice();
return basePice >888;

После встраивания временных переменных

 return anOrder.basePrice() >888;

Ввести объясняющие переменные

определение

Ввести объясняющие переменныеЭто поместить результат сложного выражения (или его часть) во временную переменную и использовать это имя переменной для объяснения цели выражения.

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

В более сложной условной логике вы можете использоватьВвести объясняющие переменныеОтфильтруйте каждое условное предложение и используйте хорошо названную временную переменную, чтобы объяснить значение соответствующего условного предложения.

Пример оптимизации

Прежде чем вводить объясняющие переменные

if ((platform.toUpperCase().indexOf("mac") > -1) &&
    (brower.toUpperCase().indexOf("ie") > -1) &&
    wasInitializes() && resize > 0) {
        ......
    }

После введения объясняющих переменных

final boolean isMacOS = platform.toUpperCase().indexOf("mac") > -1;
final boolean isIEBrowser = brower.toUpperCase().indexOf("ie") > -1;
final boolean wasResized = resize > 0;

if (isMacOS && isIEBrowser && wasInitializes() && wasResized) {
    ......
}

Замените магические числа буквальными константами

определение

Создайте константу, назовите ее в соответствии с ее значением и замените приведенное выше буквальное значение константой.

Так называемое магическое число относится к числу, которое имеет особое значение, но не может ясно выразить это значение. Если вам нужноРазные места относятся к одному и тому же логическому числу, всякий раз, когда число нужно будет пересмотреть, это будет особая головная боль, потому что велика вероятность, что его упустят. иБуквенные константы вместо магических чиселЭту головную боль можно решить.

Пример оптимизации

перед заменой магических чисел литеральными константами

double getDiscountPrice(double price){
       return price * 0.88;
 }

После замены магических чисел буквальными константами

 static final double DISCOUNT_CONSTANT=0.88;
 
 double getDiscountPrice(double price){
     return price * DISCOUNT_CONSTANT;
 }

Замена операторов switch полиморфизмом

определение

Заменить оператор switch на полиморфизмЭто позволяет воспользоваться преимуществами объектно-ориентированного полиморфизма Java и использовать режим состояния вместо оператора switch.

Пример оптимизации

Перед заменой оператора switch на полиморфизм

 int getArea() {
        switch (shape){
        case SHAPE.CIRCLE:
        return 3.14 * _r * _r; break;
        case SHAPE.RECTANGEL;
        return width *,heigth;
        }
    }

После замены оператора switch на полиморфизм

 class Shape {
        int getArea(){};
    }

    class Circle extends Shape {
        int getArea() {
            return 3.14 * r * r; 
        }
    }

    class Rectangel extends Shape {
        int getArea() {
            return width * heigth;
        }
    }

Объективируйте слишком много параметров

определение

Объективируйте слишком много параметровЭто инкапсуляция слишком большого количества параметров в объект для передачи параметров.

Метод со слишком большим количеством параметров может быть трудным для чтения и поддержки. Специально для dubbo, чтобы вызывать эти методы удаленно, если слишком много параметров, добавить или вычесть параметр, приходится модифицировать интерфейс, а это действительно яма. Если эти параметры инкапсулированы в объект, их легко поддерживать без изменения интерфейса.

Пример оптимизации

Прежде чем объективировать слишком много параметров:

public int register(String username,String password,Integer age,String phone);

После объективации слишком многих параметров:

 public int register(RegisterForm from );
 
 class RegisterForm{
     private String username;
     private String password;
     private Integer age;
     private String phone;
 }

Ссылка и спасибо

  • «Рефакторинг — улучшение дизайна существующего кода»

Личный публичный аккаунт

  • Если вы хороший ребенок, который любит учиться, вы можете подписаться на мой официальный аккаунт, чтобы вместе учиться и обсуждать.
  • Если вы считаете, что в этой статье есть какие-либо неточности, вы можете прокомментировать или подписаться на мой официальный аккаунт, пообщаться со мной в частном порядке, и все смогут учиться и прогрессировать вместе.