มันเป็นกลิ่นรหัสที่จะเรียกวิธีสาธารณะในวิธีส่วนตัวของอินสแตนซ์วัตถุเดียวกันหรือไม่?
มันเป็นกลิ่นรหัสที่จะเรียกวิธีสาธารณะในวิธีส่วนตัวของอินสแตนซ์วัตถุเดียวกันหรือไม่?
คำตอบ:
ไม่มีกลิ่นเหม็น อาจจำเป็นต้องใช้ทำไมคุณคิดว่ามันผิด วิธีการในระดับอะตอมเป็นเอนทิตี้อิสระที่ทำหน้าที่ ตราบใดที่ยังมีงานใครก็ตามที่เข้าถึงมันสามารถโทรหามันเพื่อทำงานให้สำเร็จ
กลิ่นรหัส? ใช่ไม่ใช่เรื่องเลวร้าย แต่เป็นตัวบ่งชี้ที่ดีว่าชั้นเรียนอาจมีความรับผิดชอบมากเกินไป
ใช้เป็นสัญญาณว่าชั้นเรียนอาจต้องแตกออกเป็นวัตถุต่าง ๆ วิธีส่วนตัวไม่ควรเรียกวิธีสาธารณะของวัตถุเดียวกันอย่างแน่นอนในการออกแบบ OO ที่สะอาด
แน่นอนว่าเมื่อคุณตรวจสอบชั้นเรียนแล้วและเหตุผลของการเรียกใช้เมธอดนั้นชัดเจนแล้วมันอาจเป็นการใช้งานที่สมเหตุสมผลอย่างสมบูรณ์แบบโดยทั่วไปคุณคาดหวังว่าวิธีการอรรถประโยชน์สำหรับชั้นเรียนจะเป็นแบบส่วนตัว แต่ถ้ามีประโยชน์พอที่จะ เป็นสาธารณะและใช้ประโยชน์จากวิธีอื่นโดยทั่วไปแล้วฉันคาดหวังว่าวิธีเหล่านั้นจะเป็นสาธารณะด้วย
เช่นเดียวกับกลิ่นของรหัสทั้งหมดนี่คือแรงจูงใจสำหรับการตรวจสอบรหัสเพิ่มเติมหาเหตุผลเข้าข้างตนเองและอาจ refactor แต่ไม่ใช่สาเหตุของการเตือนภัย
มันอาจนำไปสู่ความประหลาดใจอันไม่พึงประสงค์ถ้าคนที่ไม่ได้อ่านซอร์สโค้ดของคลาสนี้พยายามซับคลาสมันและแทนที่เมธอดสาธารณะ ไม่ว่าจะเป็นเรื่องจริงที่แท้จริงขึ้นอยู่กับสถานการณ์ของคุณ บางทีคุณควรพิจารณาทำวิธีสาธารณะหรือแม้กระทั่งชั้นสุดท้าย
ฉันไม่คิดว่าเราสามารถแยกแยะได้
ทุกอย่างขึ้นอยู่กับบริบทเป็นอย่างมาก
ฉันอาจจะมีวิธีการสาธารณูปโภคในชั้นเรียนที่ใช้โดยชั้นเรียนอื่น ๆ และยังมีวิธีการส่วนตัวในชั้นเรียนเดียวกัน
ไม่ควรทำอย่างอื่นในกรณีนี้ ทำให้วิธีส่วนตัวเป็นสาธารณะหรือวิธีสาธารณะเป็นส่วนตัว? คัดลอกวางรหัสจากวิธีสาธารณะไปยังส่วนตัวหรือไม่
ไม่ไม่มีกลิ่นเหม็นที่นี่
ถ้าเราใช้อินเตอร์เฟสของคิวกับ List มันเป็นกลิ่นเหม็นเพียงแค่เรียกฟังก์ชั่น List ที่เหมาะสมเพื่อให้สามารถใช้คิวได้อย่างง่ายดายหรือไม่?
หากคุณมีบางอย่างและคุณต้องการแปลงเป็นอย่างอื่น (เช่นเสื้อคลุม) แล้วมันก็ไม่ได้มีกลิ่นเหม็นรหัสใช้งานได้อีกครั้งด้วยรูปแบบการออกแบบที่ดำเนินการในระดับฟังก์ชั่น (เป็นฟังก์ชั่นวัตถุหรือไม่)
ฉันรู้ว่านี่เป็นโพสต์เก่า แต่มันเป็นสิ่งที่ฉันโต้เถียงในที่ทำงาน ฉันคิดว่ามันเป็นกลิ่นของรหัสและไม่เข้าใจว่าทำไมคุณถึงอยากทำเช่นนี้ หากวิธีส่วนตัวต้องเรียกใช้วิธีสาธารณะดังนั้นเนื้อหาของวิธีสาธารณะควรถูกนำมาใช้และวางไว้ในวิธีส่วนตัวซึ่งทั้งสองวิธีสามารถเรียกได้ ทำไม?
วิธีการสาธารณะอาจมีการทดสอบที่ไม่จำเป็นเมื่อรหัสการดำเนินการของคุณภายใน มันอาจได้รับ UserObj และต้องการทดสอบสิทธิ์ผู้ใช้เช่น
หลังจากการโทรสาธารณะคุณอาจต้องการล็อควัตถุถ้าคุณใช้เธรดดังนั้นภายในคุณจะไม่ต้องการโทรกลับไปที่วิธีการสาธารณะ
มีแนวโน้มที่จะแนะนำข้อผิดพลาดแบบวงกลมและลูปแบบไม่ จำกัด และข้อยกเว้นไม่จำในความคิดของฉัน
ธรรมดาและเรียบง่ายการออกแบบที่ไม่ดีและ "ขี้เกียจ" วิธีการสาธารณะให้การเข้าถึงโลกภายนอก ไม่มีเหตุผลที่จะเดินกลับออกไปข้างนอกเมื่อคุณอยู่ข้างในแล้ว
ลองจินตนาการถึงสิ่งที่ตรงกันข้าม คุณอยู่ในวิธีส่วนตัวและคุณต้องการฟังก์ชั่นในวิธีสาธารณะถ้าคุณไม่สามารถเรียกวิธีสาธารณะนั้นจากวิธีส่วนตัว คุณจะทำอย่างไร
คำตอบนั้นชัดเจนว่าเมื่อคุณต้องการฟังก์ชั่นในวิธีสาธารณะคุณควรจะสามารถเรียกวิธีนั้นจากวิธีการเรียนนี้หรือจากชั้นเรียนอื่น ๆ
ในรหัสของฉันฉันมักจะสร้างตัวรับสัญญาณที่ขี้เกียจซึ่งก็คือการบอกว่าวัตถุได้รับการเริ่มต้นในครั้งแรกที่มีการร้องขอและหลังจากนั้นก็นำวัตถุอินสแตนซ์เดียวกันมาใช้ซ้ำ อย่างไรก็ตามวัตถุที่สร้างอินสแตนซ์โดยใช้การโหลดแบบขี้เกียจก็หมายความว่ามันอาจไม่จำเป็นต้องถูกสร้างอินสแตนซ์ ณ จุดใดก็ตาม แทนที่จะห่อหัวของฉันรอบลำดับของการโทรเช่นที่ฉันรู้ว่าวัตถุนั้นอินสแตนซ์แล้วหรือทำซ้ำรหัสเดียวกันของการโหลดแบบ lazy ในวิธีอื่นฉันเพียงเรียกตัวโหลดแบบขี้เกียจเมื่อใดก็ตามที่ฉันต้องการวัตถุนั้น
เช่นเดียวกับที่คุณสามารถใช้วิธีสาธารณะในวิธีที่ชาญฉลาดคุณสามารถใช้วิธีการเหล่านั้นอย่างไม่ถูกต้อง ตัวอย่างนี้อาจเป็นวิธีสาธารณะซึ่งประมวลผลพารามิเตอร์ก่อนเรียกวิธีส่วนตัวอื่น มันจะเป็นความผิดพลาดที่จะเรียกวิธีการสาธารณะว่าเพียงเพราะคุณมีพารามิเตอร์เดียวกัน ความผิดพลาดนั้นบอบบาง แต่ก็เป็นข้อผิดพลาดในการออกแบบมากกว่าสิ่งอื่นและคุณต้องเรียนรู้ที่จะจัดการกับพารามิเตอร์ของวิธีการภายในมากกว่าพารามิเตอร์ของวิธีการสาธารณะ
ดังนั้นเพื่อตอบคำถามของคุณแน่นอนว่าไม่ใช่รหัสที่แย่หากคุณใช้อย่างถูกต้อง
คำถามที่คุณต้องถามตัวเองคือทำไมชั้นเรียนของคุณมีความต้องการเช่นเดียวกับลูกค้าในชั้นเรียนของคุณ โดยปกติชั้นเรียนมีความต้องการที่แตกต่างกันมากจากลูกค้า ใช่แล้วนี่เป็นข้อบ่งชี้ว่าคุณมีเช่นกัน
(a) เปิดเผยบางสิ่งต่อสาธารณะที่ควรเป็นแบบส่วนตัว หรือ
(b) พฤติกรรมของชั้นเรียนไม่แคบพอ (คิดว่าความรับผิดชอบหลักเดียว)