ฉันพยายามเรียนรู้ GRASP และฉันพบสิ่งนี้อธิบาย ( ที่หน้า 3 ) เกี่ยวกับการมีเพศสัมพันธ์ต่ำและฉันรู้สึกประหลาดใจมากเมื่อฉันพบสิ่งนี้:
พิจารณาวิธีการ
addTrack
สำหรับAlbum
ชั้นเรียนสองวิธีที่เป็นไปได้คือ:
addTrack( Track t )
และ
addTrack( int no, String title, double duration )
วิธีใดลดข้อต่อ อย่างที่สองทำเนื่องจากคลาสที่ใช้คลาส Album ไม่จำเป็นต้องทราบคลาส Track โดยทั่วไปพารามิเตอร์สำหรับเมธอดควรใช้ประเภทฐาน (int, char ... ) และคลาสจากแพ็กเกจ java. *
ฉันมักจะพูดพล่ามกับเรื่องนี้; ฉันเชื่อว่าaddTrack(Track t)
ดีกว่าaddTrack(int no, String title, double duration)
เนื่องจากเหตุผลหลายประการ:
มันจะดีกว่าเสมอสำหรับวิธีการที่จะทำให้พารามิเตอร์น้อยลงที่สุดเท่าที่จะเป็นไปได้ (ตาม Clean Code ของลุงบ็อบไม่มีหรืออย่างใดอย่างหนึ่งที่ดีกว่า, 2 ในบางกรณีและ 3 ในกรณีพิเศษมากกว่า 3 ต้องการ refactoring .
หาก
addTrack
เป็นวิธีการของอินเตอร์เฟซและข้อกำหนดที่ต้องการให้ aTrack
ควรมีข้อมูลเพิ่มเติม (เช่นปีหรือประเภท) ดังนั้นอินเทอร์เฟซที่จะต้องมีการเปลี่ยนแปลงและเพื่อให้วิธีการที่ควรสนับสนุนพารามิเตอร์อื่นการห่อหุ้มถูกทำลาย ถ้า
addTrack
อยู่ในอินเตอร์เฟซแล้วมันไม่ควรจะรู้ internalsTrack
ของเป็นจริงมากขึ้นควบคู่ไปกับวิธีที่สองด้วยพารามิเตอร์จำนวนมาก สมมติว่า
no
พารามิเตอร์ต้องเปลี่ยนจากint
เป็นlong
เพราะมีมากกว่าMAX_INT
แทร็ก (หรือด้วยเหตุผลใดก็ตาม); ดังนั้นทั้งสองTrack
และวิธีการจะต้องมีการเปลี่ยนแปลงในขณะที่ถ้าวิธีการจะมีaddTrack(Track track)
เพียงTrack
จะมีการเปลี่ยนแปลง
อาร์กิวเมนต์ 4 ข้อทั้งหมดเชื่อมโยงกันจริง ๆ และบางข้อขัดแย้งกัน
วิธีไหนดีกว่ากัน