โค้ดยิม/จาวาบล็อก/สุ่ม/การปรับโครงสร้างใหม่ทำงานอย่างไรใน Java
John Squirrels
ระดับ
San Francisco

การปรับโครงสร้างใหม่ทำงานอย่างไรใน Java

เผยแพร่ในกลุ่ม
เมื่อคุณเรียนรู้วิธีการเขียนโปรแกรม คุณใช้เวลามากมายในการเขียนโค้ด นักพัฒนามือใหม่ส่วนใหญ่เชื่อว่านี่คือสิ่งที่พวกเขาจะทำในอนาคต นี่เป็นความจริงบางส่วน แต่งานของโปรแกรมเมอร์ยังรวมถึงการบำรุงรักษาและการปรับโครงสร้างโค้ดด้วย วันนี้เราจะมาพูดถึงการปรับโครงสร้างใหม่ การปรับโครงสร้างใหม่ทำงานอย่างไรใน Java - 1

การปรับโครงสร้างใหม่บน CodeGym

การปรับโครงสร้างใหม่ครอบคลุมสองครั้งในหลักสูตร CodeGym: งานใหญ่เปิดโอกาสให้คุณทำความคุ้นเคยกับการปรับโครงสร้างจริงผ่านการฝึกฝน และบทเรียนเกี่ยวกับการปรับโครงสร้างใหม่ใน IDEA ช่วยให้คุณดำดิ่งสู่เครื่องมืออัตโนมัติที่จะทำให้ชีวิตของคุณง่ายขึ้นอย่างไม่น่าเชื่อ

การปรับโครงสร้างใหม่คืออะไร?

เป็นการเปลี่ยนแปลงโครงสร้างของโค้ดโดยไม่เปลี่ยนฟังก์ชันการทำงาน ตัวอย่างเช่น สมมติว่าเรามีเมธอดที่เปรียบเทียบตัวเลข 2 ตัวและส่งคืนค่าจริงหากค่าแรกมากกว่าและเป็นเท็จ มิฉะนั้น:
public boolean max(int a, int b) {
    if(a > b) {
        return true;
    } else if (a == b) {
        return false;
    } else {
        return false;
    }
}
นี่เป็นรหัสที่ค่อนข้างเทอะทะ แม้แต่ผู้เริ่มต้นก็ไม่ค่อยจะเขียนอะไรแบบนี้ แต่ก็มีโอกาส ทำไมต้องใช้if-elseบล็อกถ้าคุณเขียนเมธอด 6 บรรทัดได้กระชับกว่านี้
public boolean max(int a, int b) {
     return a > b;
}
ตอนนี้เรามีวิธีการที่ง่ายและสวยงามที่ดำเนินการเช่นเดียวกับตัวอย่างด้านบน นี่คือวิธีการทำงานของการรีแฟคเตอร์: คุณเปลี่ยนโครงสร้างของโค้ดโดยไม่กระทบสาระสำคัญของมัน มีวิธีและเทคนิคการปรับโครงสร้างใหม่มากมายที่เราจะพิจารณาอย่างละเอียดยิ่งขึ้น

ทำไมคุณต้องปรับโครงสร้างใหม่?

มีสาเหตุหลายประการ ตัวอย่างเช่น เพื่อให้เกิดความเรียบง่ายและความกะทัดรัดในโค้ด ผู้เสนอทฤษฎีนี้เชื่อว่าโค้ดควรกระชับที่สุดเท่าที่จะเป็นไปได้ แม้ว่าจะต้องมีความคิดเห็นหลายสิบบรรทัดเพื่อทำความเข้าใจก็ตาม นักพัฒนารายอื่นเชื่อว่าโค้ดควรได้รับการปรับโครงสร้างใหม่เพื่อให้เข้าใจได้โดยมีจำนวนความคิดเห็นน้อยที่สุด แต่ละทีมใช้ตำแหน่งของตัวเอง แต่จำไว้ว่า การปรับ โครงสร้าง ใหม่ไม่ได้หมายถึงการลด จุดประสงค์หลักคือการปรับปรุงโครงสร้างของโค้ด สามารถรวมงานหลายอย่างไว้ในวัตถุประสงค์โดยรวมนี้:
  1. การปรับโครงสร้างใหม่ช่วยเพิ่มความเข้าใจในโค้ดที่เขียนโดยนักพัฒนารายอื่น
  2. ช่วยค้นหาและแก้ไขข้อบกพร่อง
  3. สามารถเร่งความเร็วของการพัฒนาซอฟต์แวร์
  4. โดยรวมแล้วช่วยปรับปรุงการออกแบบซอฟต์แวร์
หากไม่ได้ดำเนินการปรับโครงสร้างใหม่เป็นเวลานาน การพัฒนาอาจประสบปัญหา รวมถึงการหยุดทำงานโดยสิ้นเชิง

"กลิ่นรหัส"

เมื่อโค้ดต้องมีการเปลี่ยนโครงสร้างใหม่ จะกล่าวได้ว่ามี "กลิ่น" แน่นอนว่าไม่ใช่ตัวอักษร แต่รหัสดังกล่าวดูไม่น่าดึงดูดนัก ด้านล่างนี้ เราจะสำรวจเทคนิคการเปลี่ยนองค์ประกอบพื้นฐานสำหรับระยะเริ่มต้น

คลาสและวิธีการขนาดใหญ่เกินสมควร

คลาสและเมธอดอาจยุ่งยาก ไม่สามารถทำงานได้อย่างมีประสิทธิภาพเนื่องจากขนาดที่ใหญ่

ชั้นเรียนขนาดใหญ่

คลาสดังกล่าวมีโค้ดจำนวนมากและวิธีการต่างๆ มากมาย โดยปกติแล้ว นักพัฒนาจะเพิ่มฟีเจอร์ให้กับคลาสที่มีอยู่แล้วได้ง่ายกว่าการสร้างคลาสใหม่ ซึ่งเป็นสาเหตุที่คลาสเติบโตขึ้น ตามกฎแล้ว ฟังก์ชันการทำงานมากเกินไปถูกยัดเข้าไปในคลาสดังกล่าว ในกรณีนี้ การย้ายส่วนหนึ่งของฟังก์ชันไปยังคลาสที่แยกจากกันจะช่วยได้ เราจะพูดถึงเรื่องนี้ในรายละเอียดเพิ่มเติมในหัวข้อเทคนิคการปรับโครงสร้างใหม่

วิธียาว

"กลิ่น" นี้เกิดขึ้นเมื่อนักพัฒนาเพิ่มฟังก์ชันการทำงานใหม่ให้กับเมธอด: "ทำไมฉันจึงควรใส่การตรวจสอบพารามิเตอร์ลงในเมธอดแยกต่างหาก ถ้าฉันสามารถเขียนโค้ดที่นี่ได้", "ทำไมฉันจึงต้องใช้วิธีค้นหาแยกต่างหากเพื่อค้นหาค่าสูงสุด องค์ประกอบในอาร์เรย์ เก็บไว้ที่นี่ โค้ดจะชัดเจนขึ้นด้วยวิธีนี้" และความเข้าใจผิดอื่นๆ

มีกฎสองข้อสำหรับการปรับโครงสร้างเมธอดแบบยาว:

  1. หากคุณรู้สึกอยากแสดงความคิดเห็นเมื่อเขียนเมธอด คุณควรใส่ฟังก์ชันการทำงานในเมธอดแยกต่างหาก
  2. หากเมธอดใช้โค้ดมากกว่า 10-15 บรรทัด คุณควรระบุงานและงานย่อยที่เมธอดดำเนินการ และพยายามใส่งานย่อยลงในเมธอดแยกต่างหาก

มีสองสามวิธีในการกำจัดวิธีการแบบยาว:

  • ย้ายส่วนหนึ่งของฟังก์ชันการทำงานของเมธอดไปยังเมธอดอื่น
  • หากตัวแปรในเครื่องป้องกันไม่ให้คุณย้ายบางส่วนของฟังก์ชัน คุณสามารถย้ายออบเจ็กต์ทั้งหมดไปยังวิธีอื่นได้

ใช้ประเภทข้อมูลดั้งเดิมจำนวนมาก

ปัญหานี้มักเกิดขึ้นเมื่อจำนวนเขตข้อมูลในชั้นเรียนเพิ่มขึ้นเมื่อเวลาผ่านไป ตัวอย่างเช่น หากคุณจัดเก็บทุกอย่าง (สกุลเงิน วันที่ หมายเลขโทรศัพท์ ฯลฯ) ในรูปแบบดั้งเดิมหรือค่าคงที่ แทนที่จะเป็นวัตถุขนาดเล็ก ในกรณีนี้ แนวทางปฏิบัติที่ดีคือการย้ายการจัดกลุ่มแบบลอจิคัลของฟิลด์ไปยังคลาสที่แยกจากกัน (แยกคลาส) คุณยังสามารถเพิ่มวิธีการในชั้นเรียนเพื่อประมวลผลข้อมูล

พารามิเตอร์มากเกินไป

นี่เป็นข้อผิดพลาดทั่วไปโดยเฉพาะอย่างยิ่งเมื่อใช้ร่วมกับวิธีการที่ยาว โดยปกติแล้ว จะเกิดขึ้นหากเมธอดมีฟังก์ชันมากเกินไป หรือเมธอดใช้อัลกอริทึมหลายตัว รายการพารามิเตอร์ยาว ๆ ยากที่จะเข้าใจ และการใช้วิธีการที่มีรายการดังกล่าวไม่สะดวก เป็นผลให้ดีกว่าที่จะส่งวัตถุทั้งหมด ถ้าออบเจกต์มีข้อมูลไม่เพียงพอ คุณควรใช้ออบเจกต์ทั่วไปหรือแบ่งการทำงานของเมธอดเพื่อให้แต่ละเมธอดประมวลผลข้อมูลที่เกี่ยวข้องกัน

กลุ่มข้อมูล

กลุ่มของข้อมูลที่เกี่ยวข้องกันทางตรรกะมักจะปรากฏในรหัส ตัวอย่างเช่น พารามิเตอร์การเชื่อมต่อฐานข้อมูล (URL, ชื่อผู้ใช้, รหัสผ่าน, ชื่อสคีมา ฯลฯ) หากไม่สามารถลบฟิลด์ใดฟิลด์หนึ่งออกจากรายการฟิลด์ได้ ฟิลด์เหล่านี้ควรย้ายไปอยู่ในคลาสที่แยกจากกัน (แยกคลาส)

โซลูชันที่ละเมิดหลักการ OOP

"กลิ่น" เหล่านี้เกิดขึ้นเมื่อนักพัฒนาละเมิดการออกแบบ OOP ที่เหมาะสม สิ่งนี้เกิดขึ้นเมื่อเขาหรือเธอไม่เข้าใจความสามารถของ OOP อย่างถ่องแท้ และล้มเหลวในการใช้อย่างเต็มที่หรืออย่างเหมาะสม

ไม่สามารถใช้การสืบทอด

หากคลาสย่อยใช้เพียงชุดย่อยเล็กๆ ของฟังก์ชันของคลาสพาเรนต์ ก็จะมีกลิ่นของลำดับชั้นที่ไม่ถูกต้อง เมื่อสิ่งนี้เกิดขึ้น โดยปกติแล้ววิธีการที่ฟุ่มเฟือยจะไม่ถูกแทนที่หรือโยนข้อยกเว้นออกไป คลาสหนึ่งสืบทอดอีกคลาสหนึ่งแสดงว่าคลาสลูกใช้ฟังก์ชันเกือบทั้งหมดของคลาสพาเรนต์ ตัวอย่างลำดับชั้นที่ถูกต้อง การปรับโครงสร้างใหม่ทำงานอย่างไรใน Java - 2ตัวอย่างลำดับชั้นที่ไม่ถูกต้อง การปรับโครงสร้างใหม่ทำงานอย่างไรใน Java - 3

เปลี่ยนคำสั่ง

มีอะไรผิดปกติกับswitchคำสั่ง? มันไม่ดีเมื่อมันซับซ้อนมาก ifปัญหาที่เกี่ยวข้องคือ คำสั่ง ที่ซ้อนกันจำนวนมาก

คลาสทางเลือกที่มีอินเตอร์เฟสต่างกัน

หลายคลาสทำสิ่งเดียวกัน แต่เมธอดมีชื่อต่างกัน

สนามชั่วคราว

หากคลาสมีฟิลด์ชั่วคราวที่ออบเจกต์ต้องการเพียงบางครั้งเมื่อค่าของมันถูกตั้งค่า และฟิลด์นั้นว่างเปล่าหรือnullเวลาที่เหลือ โค้ดนั้นมีกลิ่น นี่เป็นการตัดสินใจในการออกแบบที่น่าสงสัย

กลิ่นที่ทำให้การดัดแปลงทำได้ยาก

กลิ่นเหล่านี้รุนแรงมากขึ้น กลิ่นอื่น ๆ ส่วนใหญ่ทำให้เข้าใจรหัสได้ยากขึ้น แต่สิ่งเหล่านี้ทำให้คุณไม่สามารถแก้ไขได้ เมื่อคุณพยายามแนะนำคุณลักษณะใหม่ๆ นักพัฒนาครึ่งหนึ่งเลิกใช้ และอีกครึ่งหนึ่งก็บ้าไปแล้ว

ลำดับชั้นการสืบทอดแบบคู่ขนาน

ปัญหานี้เกิดขึ้นเมื่อการจัดคลาสย่อยทำให้คุณต้องสร้างคลาสย่อยอื่นสำหรับคลาสอื่น

การพึ่งพาอาศัยกันแบบกระจาย

การแก้ไขใด ๆ คุณจะต้องค้นหาการใช้งานของคลาสทั้งหมด (การพึ่งพา) และทำการเปลี่ยนแปลงเล็กน้อยจำนวนมาก การเปลี่ยนแปลงเพียงครั้งเดียว — แก้ไขได้หลายชั้นเรียน

ต้นไม้ที่ซับซ้อนของการดัดแปลง

กลิ่นนี้ตรงกันข้ามกับกลิ่นก่อนหน้า: การเปลี่ยนแปลงส่งผลต่อเมธอดจำนวนมากในคลาสเดียว ตามกฎแล้วโค้ดดังกล่าวมีการพึ่งพาอาศัยกัน: การเปลี่ยนวิธีหนึ่งคุณต้องแก้ไขบางอย่างในอีกวิธีหนึ่ง จากนั้นในวิธีที่สามเป็นต้น คลาสเดียว - การเปลี่ยนแปลงมากมาย

"กลิ่นขยะ"

กลิ่นไม่พึงประสงค์ประเภทหนึ่งที่ทำให้ปวดหัว รหัสเก่าไร้ประโยชน์ ไม่จำเป็น โชคดีที่ IDEs และ linters สมัยใหม่ได้เรียนรู้ที่จะเตือนถึงกลิ่นดังกล่าว

ความคิดเห็นจำนวนมากในวิธีการ

วิธีการมีความคิดเห็นอธิบายจำนวนมากในเกือบทุกบรรทัด ซึ่งมักเกิดจากอัลกอริทึมที่ซับซ้อน ดังนั้นจึงเป็นการดีกว่าที่จะแบ่งโค้ดออกเป็นเมธอดเล็กๆ หลายๆ เมธอดและตั้งชื่อที่อธิบายได้

รหัสซ้ำ

คลาสหรือเมธอดที่แตกต่างกันใช้บล็อกรหัสเดียวกัน

ชั้นขี้เกียจ

ชั้นเรียนใช้ฟังก์ชันน้อยมาก แม้ว่าจะมีการวางแผนให้มีขนาดใหญ่

รหัสที่ไม่ได้ใช้

ไม่มีการใช้คลาส เมธอด หรือตัวแปรในโค้ด และเป็นค่าน้ำหนักตายตัว

การเชื่อมต่อที่มากเกินไป

กลิ่นประเภทนี้มีลักษณะเฉพาะจากความสัมพันธ์ที่ไม่ยุติธรรมจำนวนมากในรหัส

วิธีการภายนอก

วิธีการใช้ข้อมูลจากวัตถุอื่นบ่อยกว่าข้อมูลของตัวเอง

ความใกล้ชิดที่ไม่เหมาะสม

คลาสขึ้นอยู่กับรายละเอียดการใช้งานของคลาสอื่น

โทรเรียนนาน

คลาสหนึ่งเรียกอีกคลาสหนึ่ง ซึ่งขอข้อมูลจากคลาสที่สาม ซึ่งรับข้อมูลจากคลาสสี่ เป็นต้น สายที่ยาวเช่นนี้หมายถึงการพึ่งพาสูงในโครงสร้างคลาสปัจจุบัน

คลาสตัวแทนจำหน่ายงาน

คลาสจำเป็นสำหรับการส่งงานไปยังคลาสอื่นเท่านั้น บางทีมันควรจะถูกลบออก?

เทคนิคการรีแฟคเตอร์

ด้านล่างเราจะพูดถึงเทคนิคการเปลี่ยนโครงสร้างขั้นพื้นฐานที่สามารถช่วยกำจัดกลิ่นโค้ดที่อธิบายไว้ได้

แยกคลาส

คลาสทำหน้าที่มากเกินไป บางคนต้องย้ายไปเรียนที่อื่น ตัวอย่างเช่น สมมติว่าเรามีHumanคลาสที่เก็บที่อยู่ที่บ้านด้วย และมีเมธอดที่ส่งคืนที่อยู่แบบเต็ม:
class Human {
    private String name;
    private String age;
    private String country;
    private String city;
    private String street;
    private String house;
    private String quarter;

    public String getFullAddress() {
        StringBuilder result = new StringBuilder();
        return result
                        .append(country)
                        .append(", ")
                        .append(city)
                        .append(", ")
                        .append(street)
                        .append(", ")
                        .append(house)
                        .append(" ")
                        .append(quarter).toString();
    }
 }
เป็นแนวปฏิบัติที่ดีที่จะใส่ข้อมูลที่อยู่และวิธีการที่เกี่ยวข้อง (พฤติกรรมการประมวลผลข้อมูล) ลงในคลาสที่แยกจากกัน:
class Human {
   private String name;
   private String age;
   private Address address;

   private String getFullAddress() {
       return address.getFullAddress();
   }
}
class Address {
   private String country;
   private String city;
   private String street;
   private String house;
   private String quarter;

   public String getFullAddress() {
       StringBuilder result = new StringBuilder();
       return result
                       .append(country)
                       .append(", ")
                       .append(city)
                       .append(", ")
                       .append(street)
                       .append(", ")
                       .append(house)
                       .append(" ")
                       .append(quarter).toString();
   }
}

แยกวิธีการ

หากเมธอดมีฟังก์ชันบางอย่างที่สามารถแยกได้ คุณควรแยกเมธอดนั้นไว้ในเมธอดอื่น ตัวอย่างเช่น วิธีการคำนวณรากของสมการกำลังสอง:
public void calcQuadraticEq(double a, double b, double c) {
    double D = b * b - 4 * a * c;
    if (D > 0) {
        double x1, x2;
        x1 = (-b - Math.sqrt(D)) / (2 * a);
        x2 = (-b + Math.sqrt(D)) / (2 * a);
        System.out.println("x1 = " + x1 + ", x2 = " + x2);
    }
    else if (D == 0) {
        double x;
        x = -b / (2 * a);
        System.out.println("x = " + x);
    }
    else {
        System.out.println("Equation has no roots");
    }
}
เราคำนวณแต่ละตัวเลือกที่เป็นไปได้สามตัวเลือกด้วยวิธีการแยกกัน:
public void calcQuadraticEq(double a, double b, double c) {
    double D = b * b - 4 * a * c;
    if (D > 0) {
        dGreaterThanZero(a, b, D);
    }
    else if (D == 0) {
        dEqualsZero(a, b);
    }
    else {
        dLessThanZero();
    }
}

public void dGreaterThanZero(double a, double b, double D) {
    double x1, x2;
    x1 = (-b - Math.sqrt(D)) / (2 * a);
    x2 = (-b + Math.sqrt(D)) / (2 * a);
    System.out.println("x1 = " + x1 + ", x2 = " + x2);
}

public void dEqualsZero(double a, double b) {
    double x;
    x = -b / (2 * a);
    System.out.println("x = " + x);
}

public void dLessThanZero() {
    System.out.println("Equation has no roots");
}
รหัสของแต่ละวิธีสั้นลงและเข้าใจง่ายขึ้นมาก

ผ่านวัตถุทั้งหมด

เมื่อมีการเรียกใช้เมธอดพร้อมพารามิเตอร์ บางครั้งคุณอาจเห็นโค้ดดังนี้:
public void employeeMethod(Employee employee) {
    // Some actions
    double yearlySalary = employee.getYearlySalary();
    double awards = employee.getAwards();
    double monthlySalary = getMonthlySalary(yearlySalary, awards);
    // Continue processing
}

public double getMonthlySalary(double yearlySalary, double awards) {
     return (yearlySalary + awards)/12;
}
มีemployeeMethod2 ​​บรรทัดทั้งหมดสำหรับรับค่าและเก็บไว้ในตัวแปรดั้งเดิม บางครั้งโครงสร้างดังกล่าวอาจใช้เวลาถึง 10 บรรทัด มันง่ายกว่ามากที่จะส่งผ่านวัตถุและใช้เพื่อดึงข้อมูลที่จำเป็น:
public void employeeMethod(Employee employee) {
    // Some actions
    double monthlySalary = getMonthlySalary(employee);
    // Continue processing
}

public double getMonthlySalary(Employee employee) {
    return (employee.getYearlySalary() + employee.getAwards())/12;
}

ง่าย สั้น และกระชับ

การจัดกลุ่มฟิลด์อย่างมีเหตุผลและย้ายฟิลด์เหล่านั้นไปแยกจากกันclassDespiteข้อเท็จจริงที่ว่าตัวอย่างข้างต้นนั้นง่ายมาก และเมื่อคุณดูที่ฟิลด์เหล่านี้ พวกคุณหลายคนอาจถามว่า "ใครเป็นคนทำสิ่งนี้" นักพัฒนาหลายคนทำข้อผิดพลาดเกี่ยวกับโครงสร้างเช่นนี้เพราะความประมาทเลินเล่อ ไม่เต็มใจที่จะปรับโครงสร้างรหัสใหม่หรือเพียงแค่ทัศนคติว่า "ดีพอ"

เหตุใดการปรับโครงสร้างใหม่จึงมีประสิทธิภาพ

ผลจากการปรับโครงสร้างที่ดี ทำให้โปรแกรมมีโค้ดที่อ่านง่าย โอกาสที่จะเปลี่ยนตรรกะนั้นไม่ใช่เรื่องน่ากลัว และการแนะนำคุณสมบัติใหม่ไม่ได้กลายเป็นนรกของการวิเคราะห์โค้ด แต่เป็นประสบการณ์ที่น่าพึงพอใจแทนสำหรับสองสามวัน . คุณไม่ควรรีแฟคเตอร์หากการเขียนโปรแกรมตั้งแต่เริ่มต้นจะง่ายกว่า ตัวอย่างเช่น สมมติว่าทีมของคุณประเมินว่าแรงงานที่ต้องใช้ในการทำความเข้าใจ วิเคราะห์ และรีแฟคเตอร์โค้ดจะมากกว่าการใช้ฟังก์ชันเดียวกันตั้งแต่เริ่มต้น หรือหากโค้ดที่จะรีแฟคเตอร์มีปัญหามากมายที่แก้ไขจุดบกพร่องได้ยาก การรู้วิธีปรับปรุงโครงสร้างของรหัสเป็นสิ่งสำคัญในการทำงานของโปรแกรมเมอร์ และการเรียนรู้การเขียนโปรแกรมใน Java ทำได้ดีที่สุดใน CodeGym ซึ่งเป็นหลักสูตรออนไลน์ที่เน้นการฝึกฝน งานมากกว่า 1,200 รายการพร้อมการยืนยันทันที ประมาณ 20 มินิโปรเจกต์ งานเกม — ทั้งหมดนี้จะช่วยให้คุณมั่นใจในการเขียนโค้ด เวลาที่ดีที่สุดในการเริ่มต้นคือตอนนี้ :)

แหล่งข้อมูลเพื่อดื่มด่ำกับการปรับโครงสร้างใหม่

หนังสือที่มีชื่อเสียงที่สุดเกี่ยวกับการปรับโครงสร้างใหม่คือ "การปรับโครงสร้างใหม่ การปรับปรุงการออกแบบรหัสที่มีอยู่" โดย Martin Fowler นอกจากนี้ยังมีสิ่งพิมพ์ที่น่าสนใจเกี่ยวกับการปรับโครงสร้างใหม่ โดยอิงจากหนังสือก่อนหน้านี้: "การปรับโครงสร้างใหม่โดยใช้รูปแบบ" โดย Joshua Kerievsky การพูดของรูปแบบ... เมื่อทำการปรับโครงสร้างใหม่ การรู้รูปแบบการออกแบบขั้นพื้นฐานจะมีประโยชน์มากเสมอ หนังสือที่ยอดเยี่ยมเหล่านี้จะช่วยในเรื่องนี้: การพูดของรูปแบบ... เมื่อทำการปรับโครงสร้างใหม่ การรู้รูปแบบการออกแบบขั้นพื้นฐานจะมีประโยชน์มากเสมอ หนังสือที่ยอดเยี่ยมเหล่านี้จะช่วยในเรื่องนี้:
  1. "รูปแบบการออกแบบ" โดย Eric Freeman, Elizabeth Robson, Kathy Sierra และ Bert Bates จากซีรี่ส์ Head First
  2. "ศิลปะแห่งรหัสที่อ่านได้" โดย Dustin Boswell และ Trevor Foucher
  3. "รหัสสมบูรณ์" โดย Steve McConnell ซึ่งกำหนดหลักการสำหรับรหัสที่สวยงามและสง่างาม
ความคิดเห็น
  • เป็นที่นิยม
  • ใหม่
  • เก่า
คุณต้องลงชื่อเข้าใช้เพื่อแสดงความคิดเห็น
หน้านี้ยังไม่มีความคิดเห็นใด ๆ