CodeGym /หลักสูตรจาวา /คอลเลกชัน Java /แนวคิด: การปรับโครงสร้างใหม่

แนวคิด: การปรับโครงสร้างใหม่

คอลเลกชัน Java
ระดับ , บทเรียน
มีอยู่

"สวัสดีอีกครั้ง."

"สวัสดี!"

"วันนี้ฉันจะบอกคุณเกี่ยวกับการปรับโครงสร้างใหม่ การปรับโครงสร้างใหม่คือการเปลี่ยนแปลงรหัสในโครงการโดยไม่เปลี่ยนฟังก์ชันการทำงาน"

"แต่เป็นไปได้อย่างไร?"

"ในกรณีที่ง่ายที่สุด เราสามารถเปลี่ยนชื่อตัวแปรและ/หรือเมธอดได้ ท้ายที่สุด การเปลี่ยนชื่อตัวแปรจะไม่ทำให้โปรแกรมทำงานแตกต่างออกไปใช่หรือไม่"

"ไม่แน่นอน"

"คุณยังสามารถแบ่งเมธอดขนาดใหญ่ออกเป็นเมธอดย่อยหลายๆ วิธีได้อีกด้วย "

"คุณสามารถดึงส่วนย่อยของโค้ดที่ซ้ำกันเป็นเมธอดแยกต่างหาก "

"ฟังก์ชันบางอย่างสามารถประกาศแบบสแตติกแล้วย้ายไปยังคลาสยูทิลิตี้ได้"

"แต่นี่เป็นการตีความอย่างแคบของการปรับโครงสร้างใหม่"

"บางครั้งการ Refactoring หมายถึงการเขียนใหม่ (ปรับปรุง) สถาปัตยกรรมของโครงการโดยไม่ต้องเพิ่มฟังก์ชันการทำงานใหม่ นี่คือการปรับโครงสร้างใหม่ในความหมายกว้างๆ ของคำนี้"

"IntelliJ IDEA กลายเป็นสภาพแวดล้อมการพัฒนาแบบบูรณาการ (IDE) ที่ได้รับความนิยมมากที่สุด โดยเฉพาะอย่างยิ่งเนื่องจากเป็นรายแรกที่นำเสนอเครื่องมือการปรับโครงสร้างที่ทรงพลังมาก"

“เครื่องมือวิเศษเหล่านี้คืออะไร?”

เคล็ดลับ #1: เปลี่ยนชื่อวิธีการ

"ลองนึกภาพว่าโค้ดของคุณมีเมธอดที่ถูกเรียกใช้จากที่ต่างๆ 100-500 แห่ง คุณตัดสินใจเปลี่ยนชื่อเป็นชื่อที่เข้าใจได้มากขึ้น สมมติว่ารัน () และคุณต้องการให้รัน DownloadTaskAsync() ได้เร็วแค่ไหน คุณสามารถทำได้ไหม?"

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

“แล้วคุณจะพบสถานที่เหล่านั้นได้อย่างไร”

"ฉันแค่เรียกใช้โปรแกรมและ IntelliJ IDEA จะแสดงตำแหน่งทั้งหมดที่มีการเรียกใช้เมธอดที่ไม่มีอยู่จริง"

"โอเค แต่ตอนนี้ สมมติว่าทุกเมธอดมีคำอธิบายอธิบาย (JavaDoc) ที่อธิบายว่าเมธอดทำอะไร และชื่อเมธอดเก่าก็เขียนอยู่ที่นั่น"

"ฉันจะเปลี่ยนความคิดเห็นด้วย"

"แต่อาจมีตัวแปรที่มีชื่อเชื่อมโยงกับชื่อของเมธอดด้วย จะเป็นการดีหากเปลี่ยนตัวแปรเหล่านั้นด้วย:"

ก่อน หลังจาก
Task task = manager.run();
Task asyncTask = manager.runDownloadTaskAsync();

"ใช่ จะเป็นการดีที่จะเปลี่ยนชื่อของตัวแปรเหล่านั้นด้วย มันจะไม่เสียหาย"

"ทั้งหมดนี้สามารถทำได้ในเวลาเพียงไม่กี่วินาทีโดยใช้ IntelliJ IDEA!"

"คุณวางเคอร์เซอร์บนชื่อของวิธีการ (หรือคลิกด้วยเมาส์) จากนั้นกดShift+F6และเริ่มพิมพ์ชื่อวิธีการที่ต้องการ"

"นี่คือตัวอย่างการแก้ไขชื่อเมธอด"

"เริ่มแก้ไข:"

IDEA: การปรับโครงสร้างใหม่ - 1

"ระบุชื่อใหม่:"

IDEA: การปรับโครงสร้างใหม่ - 2

"เพียงป้อนชื่อใหม่ กด Enter เพียงเท่านี้ วิธีการนี้จะถูกเปลี่ยนชื่อทุกที่ที่เรียกใช้ในโครงการ"

"โดยปกติแล้ว IntelliJ IDEA จะถามว่าคุณต้องการเปลี่ยนชื่อตัวแปรและชื่อเมธอดในความคิดเห็นหรือไม่ เพียงคลิก 'ใช่' ก็จะเปลี่ยนทุกอย่าง"

"ยิ่งไปกว่านั้น หากโปรเจ็กต์คอมไพล์ก่อนการดำเนินการรีแฟคเตอร์นี้ รับประกันว่าจะคอมไพล์หลังจากรีแฟคเตอร์"

"ฟังดูมีความหวังมาก"

"ยังไงก็ตามคุณสามารถเปลี่ยนชื่อตัวแปรได้ด้วยวิธีเดียวกัน หลังจากคลิกที่ชื่อ เพียงกดShift+F6 — จากนั้นคุณสามารถป้อนชื่อใหม่ได้ และ IntelliJ จะเปลี่ยนชื่อตัวแปรทุกที่ที่ใช้ "

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

"ฉันลองใช้ตัวแปร ทุกอย่างทำงานได้เหมือนที่คุณพูด Ellie การ Refactoring นั้นยอดเยี่ยมมาก!"

"คุณคิดว่าการหักเหของแสงมีเพียงเท่านี้หรือ การหักเหของแสงเป็นหัวข้อที่กว้างมาก เราไม่ได้แม้แต่จะขีดข่วนพื้นผิว"

"ว้าว มีอะไรอีก"

มายากล #2: แยกตัวแปร

"บางครั้ง นิพจน์บางอย่างมักถูกทำซ้ำในโค้ดจนคุณอยากจะย้ายไปไว้ในตัวแปรแยกต่างหาก ตัวอย่างเช่น:"

รหัส
public void printInfo(User user)
{
 System.out.println(user.getProfile().getName());
 System.out.println(user.getProfile().getAddress().getState());
 System.out.println(user.getProfile().getAddress().getCity());
 System.out.println(user.getProfile().getAddress().getStreet());
 System.out.println(user.getProfile().getAddress().getHomeNumber());
}
คุณต้องการให้มีลักษณะอย่างไร:
public void printInfo(User user)
{
 Address address = user.getProfile().getAddress();

 System.out.println(user.getProfile().getName());
 System.out.println(address.getState());
 System.out.println(address.getCity());
 System.out.println(address.getStreet());
 System.out.println(address.getHomeNumber());
}

"อา."

"และโค้ดอาจซับซ้อนกว่านี้มาก โดยมีส่วนที่ซ้ำๆ กันมากมาย"

"โปรแกรมเมอร์ไม่ได้เขียนแบบนั้นโดยเจตนา แต่คุณมักจะต้องเพิ่มบางอย่างในเมธอด แล้วจึงอย่างอื่น - และเมื่อเวลาผ่านไป จำนวนการทำซ้ำจะทะลุเพดาน"

"ด้วยการสร้างตัวแปรแยกต่างหาก เราสามารถตั้งชื่อที่ถูกต้องและปรับปรุงการอ่านรหัสได้"

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

"ใช่ ฉันเห็นด้วย การเพิ่มตัวแปรดังกล่าวสมเหตุสมผล"

"แล้วทำยังไงล่ะ"

"การย้ายนิพจน์ไปยังตัวแปรแยกต่างหากนั้นง่ายมาก"

ขั้นตอนที่ 1: ใช้เมาส์เพื่อเลือกนิพจน์

IDEA: refactoring - 3

ขั้นตอนที่ 2: กด Ctrl+Alt+V

IDEA: refactoring - 4

"หน้าต่างเปิดขึ้นโดยที่ IntelliJ IDEA ถามเราว่าเราต้องการแทนที่เฉพาะนิพจน์ที่เลือกหรืออินสแตนซ์ทั้งหมดของนิพจน์ (4 ครั้ง)"

"เลือกตัวเลือกที่สองเพื่อแทนที่เหตุการณ์ทั้งหมด (แทนที่ทั้งหมด 4 เหตุการณ์)"

ขั้นตอนที่ 3: กด Enter

IDEA: refactoring - 5

"IntelliJ IDEA จะแจ้งให้คุณป้อนชื่อตัวแปร นอกจากนี้ยังจะแนะนำชื่อของตัวเองอีกด้วย ไม่เลวใช่ไหม"

"อืม ใช่แล้ว เราวางแผนที่จะตั้งชื่อตัวแปรว่า 'ที่อยู่' ด้วย มันรู้ได้อย่างไร"

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

"นั่นได้ผลดีจริงๆ เยี่ยมมาก Ellie"

มายากล #3: แตกรหัสเป็นวิธีการแยกต่างหาก

"แต่เราสามารถทำอย่างอื่นได้ เราอาจประกาศวิธีการใหม่ เช่นprintAddress () และย้ายโค้ดทั้งหมดนี้ไปไว้ในนั้น"

"มาลองทำกันเถอะ"

ขั้นตอนที่ 1: เลือกโค้ด 4 บรรทัดที่ใช้ตัวแปรที่อยู่:

IDEA: refactoring - 6

ขั้นตอนที่ 2: กด Ctrl+Alt+M

IDEA: refactoring - 7

"IntelliJ IDEA กำหนดตัวแปรที่เมธอดต้องการ และแนะนำว่าควรมีลักษณะอย่างไร "สิ่งเดียวที่เหลือคือการป้อนชื่อเมธอด"

ขั้นตอนที่ 3: ป้อน printAddress เป็นชื่อเมธอดแล้วกด Enter

IDEA: refactoring - 8

“ชอบขนาดนั้นเลยหรือไง”

"มันยอดเยี่ยมมาก IntelliJ IDEA ไม่เพียงแต่แยกโค้ดออกเป็นเมธอดแยกต่างหากเท่านั้น แต่ยังเพิ่มตัวแปรที่จำเป็นทั้งหมด ยิ่งไปกว่านั้น มันยังเดาชื่อทั้งหมดได้อย่างถูกต้องอีกด้วย"

ความคิดเห็น
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION