ฉันสามารถผลักดันการเปลี่ยนโครงสร้างใหม่ได้นานเท่าใดโดยไม่เปลี่ยนพฤติกรรมภายนอก


27

อ้างอิงจากสมาร์ตินฟาวเลอร์การสร้างรหัสคือ

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

"พฤติกรรมภายนอก" ในบริบทนี้คืออะไร ตัวอย่างเช่นถ้าฉันใช้การย้ายการเปลี่ยนโครงสร้างวิธีการใหม่และย้ายบางวิธีไปยังคลาสอื่นดูเหมือนว่าฉันจะเปลี่ยนพฤติกรรมภายนอกใช่มั้ย

ดังนั้นฉันจึงสนใจที่จะหาจุดที่การเปลี่ยนแปลงหยุดเป็นผู้ปรับโครงสร้างและกลายเป็นอะไรที่มากกว่า คำว่า "การเปลี่ยนโครงสร้าง" อาจนำไปใช้ในทางที่ผิดสำหรับการเปลี่ยนแปลงที่ใหญ่กว่า: มีคำอื่นหรือไม่?

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


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

2
หัวหน้างานของคุณอาจสนใจว่าคุณได้รับอนุญาตให้ refactor และคุณเขียนใหม่
JeffO

2
ขอบเขตของการเปลี่ยนโครงสร้างคือการทดสอบหน่วย หากคุณมีสเปคที่วาดโดยพวกเขาสิ่งที่คุณเปลี่ยนแปลงที่ไม่ทำลายการทดสอบคือการปรับโครงสร้างใหม่?
George Silva

1
คำถามที่คล้ายกันเกี่ยวกับ SO stackoverflow.com/questions/1025844/…
sylvanaar

หากคุณต้องการเรียนรู้เพิ่มเติมหัวข้อนี้เป็นฟิลด์การวิจัยที่ใช้งานอยู่ มีสิ่งพิมพ์ทางวิทยาศาสตร์มากมายในหัวข้อนี้เช่นinformatik.uni-trier.de/~ley/db/indices/a-tree/s/…
Skarab

คำตอบ:


25

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

ดังนั้นหากคุณย้ายเมธอด M จากคลาส A ไปยังคลาส B และคลาสทั้งสองอยู่ลึกเข้าไปในแอปพลิเคชันและไม่มีผู้ใช้ใดสามารถสังเกตเห็นการเปลี่ยนแปลงพฤติกรรมของแอปเนื่องจากการเปลี่ยนแปลงคุณสามารถเรียกมันว่า

หาก OTOH ระบบย่อย / ส่วนประกอบระดับสูงอื่น ๆ บางส่วนเปลี่ยนพฤติกรรมหรือการแบ่งเนื่องจากการเปลี่ยนแปลงซึ่งแน่นอน (ปกติ) สังเกตได้กับผู้ใช้ (หรืออย่างน้อยก็เพื่อตรวจสอบบันทึกระบบ) หรือถ้าคลาสของคุณเป็นส่วนหนึ่งของ API สาธารณะอาจมีรหัสของบุคคลที่สามออกมาซึ่งขึ้นอยู่กับ M ที่เป็นส่วนหนึ่งของคลาส A ไม่ใช่ B ดังนั้นกรณีเหล่านี้จึงไม่ได้รับการแก้ไขในความหมายที่เข้มงวด

มีแนวโน้มที่จะเรียกใช้การทำงานซ้ำของรหัสใด ๆ เป็นการ refactoring ซึ่งฉันเดาไม่ถูกต้อง

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

ดังนั้นคำที่ถูกต้องสำหรับการทำงานซ้ำที่เปลี่ยนพฤติกรรมภายนอกคืออะไร

ฉันจะเรียกมันว่าการออกแบบ

ปรับปรุง

คำตอบที่น่าสนใจมากมายเกี่ยวกับอินเตอร์เฟส แต่จะไม่ย้ายการปรับโครงสร้างวิธีใหม่ให้เปลี่ยนอินเตอร์เฟสหรือไม่

ของอะไร? คลาสที่เฉพาะเจาะจงใช่ แต่ชั้นเรียนเหล่านี้สามารถมองเห็นโดยตรงกับโลกภายนอกในทางใดทางหนึ่ง ถ้าไม่ใช่ - เพราะสิ่งเหล่านี้อยู่ในโปรแกรมของคุณและไม่ใช่ส่วนหนึ่งของอินเทอร์เฟซภายนอก (API / GUI) ของโปรแกรม - ไม่มีการเปลี่ยนแปลงใด ๆ ที่ทำให้บุคคลภายนอกสามารถสังเกตได้ (ยกเว้นกรณีที่มีการเปลี่ยนแปลงเกิดขึ้น)

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

เช่นในโครงการของเราที่เกี่ยวกับการเช่ารถ Chargeชั้น ชั้นนี้ไม่มีประโยชน์ต่อผู้ใช้ระบบด้วยตัวเองเพราะตัวแทนสถานีเช่าและลูกค้าไม่สามารถทำอะไรได้มากนักกับค่าใช้จ่ายส่วนตัว: พวกเขาจัดการสัญญาสัญญาการเช่าโดยรวม (ซึ่งรวมถึงค่าใช้จ่ายประเภทต่าง ๆ ) . ผู้ใช้ส่วนใหญ่มีความสนใจในยอดรวมของค่าใช้จ่ายเหล่านี้ที่พวกเขาจะต้องจ่ายในที่สุด; ตัวแทนมีความสนใจในตัวเลือกสัญญาที่แตกต่างกันความยาวของการเช่ากลุ่มยานพาหนะแพคเกจประกันภัยรายการพิเศษ ฯลฯ เลือกซึ่ง (ผ่านกฎเกณฑ์ทางธุรกิจที่ซับซ้อน) ควบคุมค่าใช้จ่ายที่มีอยู่และวิธีการชำระเงินงวดสุดท้าย จากสิ่งเหล่านี้ และตัวแทนประเทศ / นักวิเคราะห์ธุรกิจต่างก็ใส่ใจในกฎเกณฑ์ทางธุรกิจเฉพาะเรื่องการรวมพลังและผลกระทบของพวกเขา (ต่อรายได้ของ บริษัท ฯลฯ )

เมื่อเร็ว ๆ นี้ฉันกลับมาใช้คลาสนี้อีกครั้งโดยเปลี่ยนชื่อฟิลด์และวิธีการส่วนใหญ่ (เพื่อให้เป็นไปตามระเบียบการตั้งชื่อมาตรฐานของจาวา ฉันยังวางแผนการปรับโครงสร้างเพิ่มเติมเพื่อแทนที่Stringและcharฟิลด์ด้วยความเหมาะสมenumและbooleanประเภท ทั้งหมดนี้จะเปลี่ยนอินเทอร์เฟซของคลาสอย่างแน่นอน แต่ (ถ้าฉันทำหน้าที่ของฉันอย่างถูกต้อง) ผู้ใช้แอปของเราจะไม่เห็นสิ่งใดเลย ไม่มีใครสนใจว่าจะมีการคิดค่าใช้จ่ายเป็นรายบุคคลอย่างไรแม้ว่าพวกเขาจะรู้ถึงแนวคิดเรื่องค่าใช้จ่าย. ฉันสามารถเลือกเป็นตัวอย่างหนึ่งร้อยคลาสอื่น ๆ ที่ไม่ได้แสดงถึงแนวคิดโดเมนใด ๆ ดังนั้นแม้กระทั่งแนวคิดที่มองไม่เห็นกับผู้ใช้ปลายทาง แต่ฉันคิดว่ามันน่าสนใจกว่าที่จะเลือกตัวอย่างที่มีการมองเห็นอย่างน้อยในระดับแนวคิด สิ่งนี้แสดงให้เห็นว่าอินเทอร์เฟซคลาสเป็นเพียงการแสดงแนวคิดเกี่ยวกับโดเมน (อย่างดีที่สุด) ไม่ใช่ของจริง * การเป็นตัวแทนสามารถเปลี่ยนแปลงได้โดยไม่กระทบต่อแนวคิด และผู้ใช้มีและเข้าใจแนวคิดเท่านั้น มันเป็นหน้าที่ของเราในการทำแผนที่ระหว่างแนวคิดและการเป็นตัวแทน

* และหนึ่งสามารถเพิ่มได้อย่างง่ายดายว่ารูปแบบโดเมนซึ่งชั้นของเราเป็นตัวแทนเป็นเพียงตัวแทนโดยประมาณของ "ของจริงบางอย่าง" ...


3
nitpicking ฉันจะบอกว่า 'การเปลี่ยนแปลงการออกแบบ' ไม่ใช่การออกแบบใหม่ การออกแบบใหม่มีความสำคัญมากเกินไป
user606723

4
ที่น่าสนใจ - ในตัวอย่างคลาส A ของคุณคือ 'ร่างกายที่มีอยู่ของรหัส" และหากวิธี M เป็นสาธารณะแล้วพฤติกรรมของภายนอกจะถูกเปลี่ยนไปดังนั้นคุณอาจจะบอกว่าชั้นจะออกแบบใหม่ในขณะที่ระบบโดยรวมจะถูก refactored..
saus

ฉันชอบผู้ใช้ที่สังเกตได้ นั่นเป็นเหตุผลที่ฉันจะไม่พูดว่าการทดสอบหน่วยทำลายเป็นสัญญาณ แต่การตรวจสอบตั้งแต่ต้นจนจบหรือการทดสอบการรวมเข้าด้วยกันจะเป็นสัญญาณ
Andy Wiesendanger

8

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


1
ฉันไม่คิดว่ามันเป็นคำตอบที่ดี การสร้างใหม่สามารถบ่งบอกถึงการเปลี่ยนแปลง API แต่ไม่ควรส่งผลกระทบต่อผู้ใช้หรือวิธีการอ่าน / สร้างข้อมูล
rds

3

สำหรับฉันการปรับโครงสร้างได้รับผลดีที่สุด / สะดวกสบายที่สุดเมื่อขอบเขตถูกกำหนดโดยการทดสอบและ / หรือตามข้อกำหนดที่เป็นทางการ

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

  • สิ่งที่ฉันชอบเป็นพิเศษคือขอบเขตของสิ่งเหล่านี้สามารถปรับตัวได้เพื่อที่จะพูด ฉันหมายถึง 1) ฉันทำการเปลี่ยนแปลงและตรวจสอบว่ามันสอดคล้องกับข้อมูลจำเพาะ / การทดสอบ จากนั้น 2) มันถูกส่งผ่านไปยัง QA หรือการทดสอบผู้ใช้ - โปรดทราบที่นี่มันอาจยังล้มเหลวเพราะมีบางสิ่งที่ขาดหายไปในข้อมูลจำเพาะ / การทดสอบ ตกลงถ้าการทดสอบ 3a) ผ่านไปฉันก็เรียบร้อยแล้ว มิฉะนั้นหากการทดสอบ 3b) ล้มเหลวฉันจะ 4) ย้อนกลับการเปลี่ยนแปลงและ 5) เพิ่มการทดสอบหรือทำให้ข้อมูลจำเพาะชัดเจนขึ้นในครั้งต่อไปที่ความผิดพลาดนี้จะไม่เกิดซ้ำ โปรดทราบว่าไม่ว่าการทดสอบจะผ่านหรือไม่ก็ตามได้รับบางอย่าง - ทั้งรหัส / การทดสอบ / ข้อมูลจำเพาะได้รับการปรับปรุง - ความพยายามของฉันจะไม่กลายเป็นของเสียทั้งหมด

สำหรับขอบเขตอื่น ๆ - จนถึงตอนนี้ฉันไม่มีโชคมาก

"ผู้ใช้ที่สังเกตเห็นได้" เป็นเดิมพันที่ปลอดภัยหากใครมีวินัยในการติดตาม - ซึ่งสำหรับฉันแล้วฉันมีส่วนเกี่ยวข้องกับความพยายามอย่างมากในการวิเคราะห์ที่มีอยู่ / สร้างการทดสอบใหม่ - อาจเป็นความพยายามมากเกินไป อีกสิ่งหนึ่งที่ฉันไม่ชอบเกี่ยวกับวิธีการนี้ก็คือการติดตามอย่างสุ่มสี่สุ่มห้ามันอาจเข้มงวดเกินไป- การเปลี่ยนแปลงนี้เป็นสิ่งต้องห้ามเพราะเมื่อมีการโหลดข้อมูลจะใช้เวลา 3 วินาทีแทนที่จะเป็น 2 - เอ่อเป็นอย่างดีวิธีการตรวจสอบกับผู้ใช้ / ผู้เชี่ยวชาญ UX ไม่ว่าจะเป็นสิ่งที่เกี่ยวข้องหรือไม่? - ไม่มีทางห้ามการเปลี่ยนแปลงใด ๆ ในพฤติกรรมที่สังเกตได้ระยะเวลา ปลอดภัยหรือไม่ พนันได้เลย! การผลิต? ไม่ได้จริงๆ

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


3

Refactoringหนังสือสวยที่แข็งแกร่งในข้อความที่คุณสามารถเพียงดำเนินการ refactoring เมื่อคุณมีความคุ้มครองการทดสอบหน่วย

ดังนั้นคุณสามารถพูดได้ว่าตราบใดที่คุณยังไม่ได้ทำการทดสอบหน่วยใด ๆ คุณก็จะทำการเปลี่ยนโครงสร้างใหม่ เมื่อคุณหยุดการทดสอบคุณจะไม่ทำการปรับโครงสร้างอีกต่อไป

แต่: แล้วการปรับโครงสร้างอย่างง่ายเช่นการเปลี่ยนชื่อของคลาสหรือสมาชิก? พวกเขาไม่ทำการทดสอบใช่ไหม

ใช่พวกเขาทำและในแต่ละกรณีคุณจะต้องพิจารณาว่าการหยุดพักนั้นสำคัญหรือไม่ หากSUTของคุณเป็น API / SDK สาธารณะการเปลี่ยนชื่อย่อมเป็นการเปลี่ยนแปลงที่ไม่แน่นอน ถ้าไม่มันอาจจะโอเค

แต่พิจารณาว่ามักจะทดสอบทำลายไม่ได้เพราะคุณเปลี่ยนพฤติกรรมที่คุณจริงเกี่ยวกับการดูแล แต่เนื่องจากการทดสอบมีการทดสอบที่เปราะบาง


3

วิธีที่ดีที่สุดในการกำหนด "พฤติกรรมภายนอก" ในบริบทนี้อาจเป็น "กรณีทดสอบ"

หากคุณปรับโครงสร้างโค้ดอีกครั้งและรหัสผ่านยังคงผ่านกรณีทดสอบ (กำหนดไว้ก่อนการปรับโครงสร้างใหม่) แสดงว่าการเปลี่ยนแปลงนั้นไม่ได้เปลี่ยนลักษณะการทำงานภายนอก หากกรณีทดสอบอย่างน้อยหนึ่งรายการล้มเหลวแสดงว่าคุณมีเปลี่ยนพฤติกรรมภายนอกแล้ว

อย่างน้อยนั่นคือความเข้าใจของฉันเกี่ยวกับหนังสือต่าง ๆ ที่ตีพิมพ์ในหัวข้อ (เช่นของนักล่า


2

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

ดังนั้นจึงควรตกลงที่จะย้ายฟังก์ชั่นระหว่างคลาสตราบใดที่ไม่ใช่สิ่งที่ผู้ใช้เห็น

ตราบใดที่การทำงานซ้ำของรหัสไม่เปลี่ยนพฤติกรรมภายนอกเพิ่มฟังก์ชั่นใหม่หรือลบฟังก์ชั่นที่มีอยู่ฉันคิดว่ามันก็โอเคที่จะเรียก reworkoring เป็นการทำซ้ำ


ไม่เห็นด้วย หากคุณแทนที่รหัสการเข้าถึงข้อมูลทั้งหมดของคุณด้วย nHibernate จะไม่เปลี่ยนพฤติกรรมภายนอก แต่ไม่เป็นไปตาม "เทคนิคการลงโทษทางวินัย" ของนักล่าสัตว์ นี่จะเป็นการรื้อปรับระบบและเรียกมันว่า refactoring ซ่อนปัจจัยเสี่ยงที่เกี่ยวข้อง
pdr

1

ด้วยความเคารพอย่างสูงเราต้องจำไว้ว่าผู้ใช้ของชั้นเรียนไม่ได้เป็นผู้ใช้ปลายทางของแอปพลิเคชันที่สร้างด้วยคลาส แต่เป็นคลาสที่นำไปใช้โดยการใช้ - ไม่ว่าจะโทรหรือสืบทอดจากชั้นเรียน .

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

ดังนั้นถ้าคลาสมีเมธอดที่เรียกว่า "doSomethingAmazing" มันไม่สำคัญสำหรับผู้ใช้ถ้ามันถูกใช้งานโดยคลาสที่พวกมันอ้างถึงหรือโดยซูเปอร์คลาสที่คลาสนั้นถูกสร้างขึ้น สิ่งที่สำคัญสำหรับผู้ใช้คือ "doSomethingAmazing ใหม่" มีผลเช่นเดียวกับของเก่า (ไม่ได้รับการชำระ) "doSomethingAmazing

อย่างไรก็ตามสิ่งที่เรียกว่า refactoring ในหลายกรณีนั้นไม่ใช่ refactoring จริง แต่อาจเป็นการ replplmentation ที่ทำเพื่อให้โค้ดง่ายต่อการปรับเปลี่ยนเพื่อเพิ่มคุณสมบัติใหม่บางอย่าง ดังนั้นในกรณีต่อไปนี้ของ (หลอก) -refactoring รหัสใหม่ (refactored) จริง ๆ แล้วทำอะไรที่แตกต่างกันหรือบางทีสิ่งที่มากกว่าเก่า


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

@job: คุณได้เปลี่ยนโปรแกรมให้เป็นไปตามข้อกำหนดใหม่
jmoreno

IMHO คุณอาจผสมเกณฑ์ที่แตกต่างกันที่นี่ การเขียนโค้ดซ้ำตั้งแต่เริ่มต้นนั้นไม่ใช่การสร้างใหม่ แต่ก็เป็นเช่นนั้นไม่ว่ามันจะเปลี่ยนพฤติกรรมภายนอกหรือไม่ก็ตาม นอกจากนี้หากการเปลี่ยนอินเตอร์เฟสคลาสไม่ได้ทำการเปลี่ยนโครงสร้างวิธีการย้ายและอื่น ๆ มีอยู่ในแคตตาล็อกของ refactorings ?
PéterTörök

@ PéterTörök - ขึ้นอยู่กับสิ่งที่คุณหมายถึงโดย "การเปลี่ยนอินเทอร์เฟซสำหรับชั้นเรียน" เพราะในภาษา OOP ที่ใช้การสืบทอดมรดกอินเทอร์เฟซของชั้นเรียนไม่ได้รวมเฉพาะสิ่งที่นำมาใช้ในชั้นเรียน การเปลี่ยนอินเตอร์เฟสคลาสหมายถึงการลบ / เพิ่มเมธอดให้กับอินเตอร์เฟส (หรือเปลี่ยนลายเซ็นของเมธอด - นั่นคือหมายเลขชนิดของพารามิเตอร์ที่ส่งผ่าน) การเปลี่ยนโครงสร้างหมายถึงผู้ที่ตอบสนองต่อวิธีการคลาสหรือซุปเปอร์คลาส
Zeke Hansell

IMHO - คำถามทั้งหมดนี้อาจเป็นเรื่องลึกลับเกินกว่าที่จะเป็นประโยชน์ต่อโปรแกรมเมอร์
Zeke Hansell

1

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

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

e2: "ดังนั้นคำที่เหมาะสมสำหรับ reworks ซึ่งเปลี่ยนพฤติกรรมภายนอกคืออะไร?" - API Refactoring, Breaking Change และอื่น ๆ ... ยังคงทำการเปลี่ยนสถานะใหม่มันไม่เพียงแค่ปฏิบัติตามแนวทางปฏิบัติที่ดีที่สุดสำหรับการปรับโครงสร้างส่วนต่อประสานสาธารณะที่มีอยู่แล้วในตัวกับลูกค้า


แต่ถ้าเขาพูดถึงส่วนต่อประสานสาธารณะการเปลี่ยนโครงสร้าง "วิธีย้าย" ล่ะ
SiberianGuy

@Idsa แก้ไขคำตอบของฉันเพื่อตอบคำถามของคุณ

@kekela แต่ก็ยังไม่ชัดเจนสำหรับฉันที่สิ่งนี้ "refactoring" จบลง
SiberianGuy

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

0

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

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

โดยสรุป "ขอบเขต" ที่กล่าวถึงในคำถามจะถูกข้ามถ้าคุณสับสน (ผสม: D) เทคนิคการปรับโครงสร้างด้วยเทคนิคการเปลี่ยนโครงสร้างใหม่

PS: คำถามที่ดี btw


อ่านหลาย ๆ ครั้ง แต่ก็ยังไม่เข้าใจ
SiberianGuy

ส่วนไหนที่คุณไม่เข้าใจ (มี refactoring-the-process ที่คำจำกัดความของคุณใช้หรือ refactoring-the- เทคนิค, ในตัวอย่างของคุณ, วิธีการย้าย, ซึ่งไม่ได้ใช้คำจำกัดความนั้น, ดังนั้น, วิธีการย้ายจะไม่ทำลายคำนิยามของ refactoring-the- ดำเนินการหรือไม่ข้ามเขตแดนไม่ว่าจะเป็นอะไรก็ตาม) ฉันกำลังพูดถึงข้อกังวลที่คุณไม่ควรมีอยู่สำหรับตัวอย่างของคุณ ขอบเขตของการปรับโครงสร้างใหม่นั้นไม่ใช่สิ่งที่คลุมเครือ คุณแค่ใช้คำจำกัดความของบางสิ่งกับสิ่งอื่น
Belun

0

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


0

ขอบเขตของการรีแฟคเตอร์นั้นมีความเฉพาะกับการรีแฟคเตอร์ที่กำหนด มีเพียงคำตอบเดียวและรวมทุกอย่างไม่ได้ เหตุผลหนึ่งคือการปรับเปลี่ยนคำศัพท์นั้นไม่เฉพาะเจาะจง

คุณสามารถ refactor:

  • รหัสแหล่งที่มา
  • สถาปัตยกรรมโปรแกรม
  • การออกแบบ UI / การโต้ตอบกับผู้ใช้

และฉันแน่ใจว่าสิ่งอื่น ๆ อีกมากมาย

บางที refactor อาจถูกกำหนดเป็น

"การกระทำหรือชุดการกระทำที่ลดเอนโทรปีในระบบใดระบบหนึ่ง"


0

มีขอบเขตที่แน่นอนว่าคุณสามารถปรับโครงสร้างได้ไกลแค่ไหน ดู: เมื่อสองอัลกอริทึมเหมือนกันหรือไม่

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

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


0

คุณสามารถคิดถึงความหมาย“ ภายนอก”

ภายนอกให้ยืนขึ้นทุกวัน

ดังนั้นการเปลี่ยนแปลงใด ๆ ในระบบที่ไม่ส่งผลกระทบต่อหมูเลยถือได้ว่าเป็นการปรับโครงสร้าง

การเปลี่ยนอินเทอร์เฟซของคลาสเป็นปัญหาที่ไม่มีหากคลาสนั้นถูกใช้โดยระบบเดียวที่สร้างและดูแลโดยทีมของคุณ อย่างไรก็ตามถ้าคลาสนั้นเป็นคลาสสาธารณะใน. NET Framework ที่ใช้โดยโปรแกรมเมอร์. net ทุกคนมันเป็นเรื่องที่แตกต่างกันมาก

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.