コードを最適化するためにいくつかのヒント

序文

この本は、最適化されたコードあなたと共有するいくつかのヒントをまとめた - 最近、「既存のコードのデザインを改善するための復興」をお読みください。

レンダリング機能(関数適切小抽出物)

定義

精錬機能は、別の関数へのコードの一部であり、関数名は、関数の目的を説明してみましょう。

機能や人々がコードを使用する必要性を理解させるために、コメントの期間が長すぎると、あなたはそれがにカットすることを検討できる機能ユニット明確な機能、および定義し、明確で簡潔な関数名を、これは、コードをよりエレガントになります。

最適化の例

関数の前の精緻化:

    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を計算し、印刷は、次の3つの機能の詳細、次のように、単一機能のを:

    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;
        }
    }
复制代码

パラメータオブジェクトの過剰

定義

パラメータオブジェクトの過剰過剰パラメータにある参照することによって、オブジェクトにパッケージに関する。

あまりにも多くの質量の参加がある方法は、それが読みにくいし、維持することは困難です。特に、ダボあまりにも多くのパラメータがある場合は、リモートパラメータを増減、これらのメソッドを呼び出すために、あなたはインターフェース、実際にピットを変更する必要があります。これらのパラメータは、オブジェクトにパッケージ化されている場合は、それがよく維持され、インターフェイスを変更しないでください。

最適化の例

あまりの前に、パラメータオブジェクト:

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;
 }
复制代码

リファレンスと感謝

  • 「復興 - 既存のコードのデザインを改善するために。」

個人公開番号

  • あなたが少年を学ぶの愛であれば、私は議論を一緒に学び、公共の数に焦点を当てることができます。
  • あなたは、この記事では、適切な場所ではないことを感じるコメントすることができた場合、私はまた私をチャットプライベート、パブリックの数、懸念、我々はカザフスタンを進める一緒に検討することができます。

おすすめ

転載: juejin.im/post/5d36dc86518825680e457575