"ภายนอก" ในบริบทนี้หมายถึง "ผู้ใช้งานสามารถสังเกตได้" ผู้ใช้อาจเป็นมนุษย์ในกรณีของแอปพลิเคชันหรือโปรแกรมอื่น ๆ ในกรณีของ API สาธารณะ
ดังนั้นหากคุณย้ายเมธอด M จากคลาส A ไปยังคลาส B และคลาสทั้งสองอยู่ลึกเข้าไปในแอปพลิเคชันและไม่มีผู้ใช้ใดสามารถสังเกตเห็นการเปลี่ยนแปลงพฤติกรรมของแอปเนื่องจากการเปลี่ยนแปลงคุณสามารถเรียกมันว่า
หาก OTOH ระบบย่อย / ส่วนประกอบระดับสูงอื่น ๆ บางส่วนเปลี่ยนพฤติกรรมหรือการแบ่งเนื่องจากการเปลี่ยนแปลงซึ่งแน่นอน (ปกติ) สังเกตได้กับผู้ใช้ (หรืออย่างน้อยก็เพื่อตรวจสอบบันทึกระบบ) หรือถ้าคลาสของคุณเป็นส่วนหนึ่งของ API สาธารณะอาจมีรหัสของบุคคลที่สามออกมาซึ่งขึ้นอยู่กับ M ที่เป็นส่วนหนึ่งของคลาส A ไม่ใช่ B ดังนั้นกรณีเหล่านี้จึงไม่ได้รับการแก้ไขในความหมายที่เข้มงวด
มีแนวโน้มที่จะเรียกใช้การทำงานซ้ำของรหัสใด ๆ เป็นการ refactoring ซึ่งฉันเดาไม่ถูกต้อง
อันที่จริงมันเป็นผลลัพธ์ที่น่าเศร้า นักพัฒนาได้ทำการปรับปรุงโค้ดในลักษณะที่เป็นกิจวัตรสำหรับทุกวัยและแน่นอนว่ามันจะง่ายต่อการเรียนรู้คำศัพท์ใหม่มากกว่าการวิเคราะห์และเปลี่ยนนิสัยที่ฝังแน่น
ดังนั้นคำที่ถูกต้องสำหรับการทำงานซ้ำที่เปลี่ยนพฤติกรรมภายนอกคืออะไร
ฉันจะเรียกมันว่าการออกแบบ
ปรับปรุง
คำตอบที่น่าสนใจมากมายเกี่ยวกับอินเตอร์เฟส แต่จะไม่ย้ายการปรับโครงสร้างวิธีใหม่ให้เปลี่ยนอินเตอร์เฟสหรือไม่
ของอะไร? คลาสที่เฉพาะเจาะจงใช่ แต่ชั้นเรียนเหล่านี้สามารถมองเห็นโดยตรงกับโลกภายนอกในทางใดทางหนึ่ง ถ้าไม่ใช่ - เพราะสิ่งเหล่านี้อยู่ในโปรแกรมของคุณและไม่ใช่ส่วนหนึ่งของอินเทอร์เฟซภายนอก (API / GUI) ของโปรแกรม - ไม่มีการเปลี่ยนแปลงใด ๆ ที่ทำให้บุคคลภายนอกสามารถสังเกตได้ (ยกเว้นกรณีที่มีการเปลี่ยนแปลงเกิดขึ้น)
ฉันรู้สึกว่ามีคำถามที่ลึกกว่านี้: มีชั้นเรียนเฉพาะอยู่ในฐานะองค์กรอิสระหรือไม่? ในกรณีส่วนใหญ่คำตอบคือไม่ : คลาสมีอยู่เป็นส่วนหนึ่งขององค์ประกอบที่มีขนาดใหญ่ขึ้นเท่านั้นระบบนิเวศของคลาสและวัตถุโดยที่ไม่สามารถสร้างอินสแตนซ์ได้และ / หรือใช้ไม่ได้ ระบบนิเวศนี้ไม่เพียง แต่รวมถึงการพึ่งพา (โดยตรง / โดยอ้อม) แต่ยังรวมถึงคลาส / วัตถุอื่น ๆ ที่ขึ้นอยู่กับมันด้วย เนื่องจากไม่มีคลาสระดับสูงเหล่านี้ความรับผิดชอบที่เกี่ยวข้องกับคลาสของเราอาจไม่มีความหมาย / ไร้ประโยชน์ต่อผู้ใช้ระบบ
เช่นในโครงการของเราที่เกี่ยวกับการเช่ารถ Charge
ชั้น ชั้นนี้ไม่มีประโยชน์ต่อผู้ใช้ระบบด้วยตัวเองเพราะตัวแทนสถานีเช่าและลูกค้าไม่สามารถทำอะไรได้มากนักกับค่าใช้จ่ายส่วนตัว: พวกเขาจัดการสัญญาสัญญาการเช่าโดยรวม (ซึ่งรวมถึงค่าใช้จ่ายประเภทต่าง ๆ ) . ผู้ใช้ส่วนใหญ่มีความสนใจในยอดรวมของค่าใช้จ่ายเหล่านี้ที่พวกเขาจะต้องจ่ายในที่สุด; ตัวแทนมีความสนใจในตัวเลือกสัญญาที่แตกต่างกันความยาวของการเช่ากลุ่มยานพาหนะแพคเกจประกันภัยรายการพิเศษ ฯลฯ เลือกซึ่ง (ผ่านกฎเกณฑ์ทางธุรกิจที่ซับซ้อน) ควบคุมค่าใช้จ่ายที่มีอยู่และวิธีการชำระเงินงวดสุดท้าย จากสิ่งเหล่านี้ และตัวแทนประเทศ / นักวิเคราะห์ธุรกิจต่างก็ใส่ใจในกฎเกณฑ์ทางธุรกิจเฉพาะเรื่องการรวมพลังและผลกระทบของพวกเขา (ต่อรายได้ของ บริษัท ฯลฯ )
เมื่อเร็ว ๆ นี้ฉันกลับมาใช้คลาสนี้อีกครั้งโดยเปลี่ยนชื่อฟิลด์และวิธีการส่วนใหญ่ (เพื่อให้เป็นไปตามระเบียบการตั้งชื่อมาตรฐานของจาวา ฉันยังวางแผนการปรับโครงสร้างเพิ่มเติมเพื่อแทนที่String
และchar
ฟิลด์ด้วยความเหมาะสมenum
และboolean
ประเภท ทั้งหมดนี้จะเปลี่ยนอินเทอร์เฟซของคลาสอย่างแน่นอน แต่ (ถ้าฉันทำหน้าที่ของฉันอย่างถูกต้อง) ผู้ใช้แอปของเราจะไม่เห็นสิ่งใดเลย ไม่มีใครสนใจว่าจะมีการคิดค่าใช้จ่ายเป็นรายบุคคลอย่างไรแม้ว่าพวกเขาจะรู้ถึงแนวคิดเรื่องค่าใช้จ่าย. ฉันสามารถเลือกเป็นตัวอย่างหนึ่งร้อยคลาสอื่น ๆ ที่ไม่ได้แสดงถึงแนวคิดโดเมนใด ๆ ดังนั้นแม้กระทั่งแนวคิดที่มองไม่เห็นกับผู้ใช้ปลายทาง แต่ฉันคิดว่ามันน่าสนใจกว่าที่จะเลือกตัวอย่างที่มีการมองเห็นอย่างน้อยในระดับแนวคิด สิ่งนี้แสดงให้เห็นว่าอินเทอร์เฟซคลาสเป็นเพียงการแสดงแนวคิดเกี่ยวกับโดเมน (อย่างดีที่สุด) ไม่ใช่ของจริง * การเป็นตัวแทนสามารถเปลี่ยนแปลงได้โดยไม่กระทบต่อแนวคิด และผู้ใช้มีและเข้าใจแนวคิดเท่านั้น มันเป็นหน้าที่ของเราในการทำแผนที่ระหว่างแนวคิดและการเป็นตัวแทน
* และหนึ่งสามารถเพิ่มได้อย่างง่ายดายว่ารูปแบบโดเมนซึ่งชั้นของเราเป็นตัวแทนเป็นเพียงตัวแทนโดยประมาณของ "ของจริงบางอย่าง" ...