ต้องการสมาชิกชั้นเรียนหรือผ่านการขัดแย้งระหว่างวิธีการภายใน?


39

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

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

แก้ไข:

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

ไม่สนใจมุม OOP สักครู่กรณีการใช้งานเฉพาะที่ฉันมีในใจคือต่อไปนี้ (สมมติว่าผ่านโดยการอ้างอิงเพียงเพื่อให้ตัวทำความสะอาดรหัสเทียม)

int x
doSomething(x)
doAnotherThing(x)
doYetAnotherThing(x)
doSomethingElse(x)

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


1
ใช้ค่านี้อย่างไร? มันคงที่หรือไม่ มันเปลี่ยนหรือไม่ มันอาจมีการเปลี่ยนแปลงระหว่างการรวบรวม?
Oded

เมื่อสิ่งต่าง ๆ ถูกกำหนดโดยอัตโนมัติว่าเหมือนกันทั้งหมดจะง่ายกว่าที่จะคิดว่าไม่สำคัญ ถ้าคุณมีฟังก์ชั่นที่ต้องการค่าที่ปรับ (x) เช่น x-1
JeffO

คำตอบ:


15

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

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


1
ฉันเห็นด้วย - การออกแบบ / วัตถุประสงค์ดั้งเดิมของชั้นเรียนควรบอกคุณว่าควรเป็นตัวแปรสมาชิกหรือการโต้แย้ง ควรคำนึงถึงมุมการฉีดที่ต้องพึ่งพาด้วย
Martijn Verburg

14

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

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


10

ขอบคุณที่ถามคำถามฉันต้องการถามด้วย

เมื่อฉันคิดเกี่ยวกับเรื่องนี้มีข้อดีบางประการในการที่จะผ่านมันไปเป็นอาร์กิวเมนต์

  • ง่ายต่อการทดสอบ -> ง่ายต่อการบำรุงรักษา (เกี่ยวข้องกับจุดสุดท้าย)
  • ไม่มีผลข้างเคียง
  • ง่ายต่อการเข้าใจ

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

ฉันจะบอกว่าควรมีชื่อสำหรับรูปแบบการต่อต้านนี้หรือไม่? (ไม่อยู่ในรายการที่นี่ )


Anti-Pattern ใดที่คุณหมายถึง
Vahid Ghadiri

ในระยะสั้นเพื่อให้ตัวแปรสมาชิกเพียงเพื่อใช้พารามิเตอร์ระหว่างสอง (หรือมากกว่า) ฟังก์ชั่นการโทร ...
Betlista

1

บางทีคุณควรแยกคลาสใหม่ที่มีเมธอดทั้งหมดที่แชร์ค่านั้น แน่นอนว่าวิธีการระดับสูงสุดจะเป็นสาธารณะในชั้นเรียนใหม่ อาจเป็นประโยชน์ในการเปิดเผยวิธีการทดสอบ

หากคุณมีสองหรือมากกว่าชั่วคราวที่ผ่านมาเสมอกันคุณควรจะแยกชั้นใหม่อย่างแน่นอน


1

คนชอบมีการกำหนดนี้เป็นตัวแปรสมาชิกสำหรับชั้นเรียนหรือผ่านมันเป็นอาร์กิวเมนต์สำหรับแต่ละวิธี - และทำไม

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

ในอีกด้านหนึ่งฉันสามารถเห็นการโต้แย้งที่จะทำให้การลดสถานะ (เช่นตัวแปรสมาชิก) ในชั้นเรียนโดยทั่วไปเป็นสิ่งที่ดี ...

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

แม้ว่าจะมีการใช้ค่าเดียวกันซ้ำ ๆ ตลอดทั้งวิธีของคลาส ...

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


0

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

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