การพึ่งพาการกำหนดค่าเริ่มต้นของฟิลด์เริ่มต้น - เป็นรูปแบบการเขียนโปรแกรมที่ไม่ดีใช่หรือไม่ [ปิด]


20

ฉันได้รับลิงก์ไปยังเอกสารของ oracle อย่างเป็นทางการ: https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

มันบอกว่าที่ไหน:

ค่าเริ่มต้น

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

ฉันต้องการเน้นส่วนนี้:

อย่างไรก็ตามการใช้ค่าเริ่มต้นนั้นถือว่าเป็นลักษณะการเขียนโปรแกรมที่ไม่ดี

แต่นี่คือสิ่งที่ฉันจะบอกว่าเป็นส่วนพื้นฐานของข้อกำหนดภาษาที่รู้ว่าตัวแปรอินสแตนซ์มีค่าเริ่มต้น ทำไมในโลกนี้เป็นแบบฝึกหัดการเขียนโปรแกรมที่ไม่ถูกต้องถ้ามันถูกใช้อย่างกว้างขวางแม้ในซอร์สโค้ด Java SE ไลบรารี?


5
ฮะ. ฉันไม่เคยรู้ว่าคำสั่งนั้นอยู่ในนั้น ฉันคิดว่ามันเป็นการปฏิบัติที่ดีที่จะพึ่งพาพวกเขา private int count = 0;เป็นรหัสที่ไม่ทำอะไรเลยและรหัสที่ไม่ทำอะไรที่ยุ่งเหยิง มันก็เหมือนกับการนำเข้าชั้นเรียนจาก java.lang extends Objectหรือประกาศที่มีระดับ
VGR

2
... หรือมีpublic abstractวิธีการในอินเทอร์เฟซ
mumpitz

1
เกิดอะไรขึ้นกับบทคัดย่อสาธารณะ?
John Keates

1
ชิ้นส่วนของปริศนาอาจมาจาก C ++ มันเป็นภาษายอดนิยมและการจัดการการกำหนดค่าเริ่มต้นเมื่อเทียบกับการเริ่มต้นเป็นศูนย์เป็นแหล่งของข้อบกพร่องอย่างต่อเนื่อง ใน C ++ มันเป็นความคิดที่ไม่ดีตรงไปตรงมาที่จะใช้ค่าเริ่มต้นในทุกกรณียกเว้นกรณีที่พิเศษที่สุด ที่อาจรั่วไหลลงสู่จาวาวัฒนธรรม
Cort Ammon

@JohnKeates - Java ของฉันเป็นสนิมเล็กน้อย แต่privateวิธีการในส่วนติดต่อจะไม่มีเหตุผลและabstractโดยนัย
Scott Smith

คำตอบ:


6

ข้อความที่ยกมาคือ:

"การใช้ค่าเริ่มต้นนั้นโดยทั่วไปถือว่าเป็นรูปแบบการเขียนโปรแกรมที่ไม่ดี"

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

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

(หมายเหตุวิธีการของฉันสำหรับการสุ่มตัวอย่างคือดูที่ 5 อันดับแรกของการค้นหาของ Google ที่แตกต่างกันสำหรับ "java style guide" จากนั้นฉันค้นหาแต่ละเอกสารเพื่อหา "ค่าเริ่มต้น" นี่ไม่ใช่การวิเคราะห์ที่ละเอียดถี่ถ้วน )


ตกลง. ดังนั้นมันช่วยให้อ่านง่ายของรหัส Java?

นี้เป็นที่ถกเถียงกัน

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

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

ในใจของฉันสิ่งเดียวที่ทำได้โดยการเริ่มต้นซ้ำซ้อนของเขตข้อมูลคือการส่งสัญญาณไปยังผู้อ่านในอนาคตของรหัสของคุณที่คุณคิดเกี่ยวกับค่าเริ่มต้น (ตามที่ @GhostCat แสดงไว้การกำหนดค่าเริ่มต้นจะไม่แสดงเจตนา)

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


แล้วความน่าเชื่อถือล่ะ

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

ในระยะสั้นพฤติกรรมการใช้งานจริงของตัวแปรที่ไม่ได้เริ่มต้นอย่างชัดเจนสามารถคาดการณ์ได้ทั้งหมด

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


แล้วประสิทธิภาพล่ะ

มันไม่ควรสร้างความแตกต่าง คอมไพเลอร์ JIT ควรจะสามารถเริ่มต้นซ้ำซ้อนและการเริ่มต้นเริ่มต้นเหมือนกัน


19

ง่าย: การพึ่งพาค่าเริ่มต้นไม่ได้สื่อสารเจตนา

คุณต้องการให้ฟิลด์นั้นเริ่มต้นด้วย 0 หรือคุณลืมกำหนดค่าหรือไม่!

และแน่นอนการอ้างอิงที่เป็นโมฆะนั้นเป็นครึ่งหนึ่งของสองสิ่งที่คุณจำเป็นต้องใช้ในการยกเว้น nullpointer

ในที่สุดการใช้ค่าเริ่มต้นก็หมายความว่าคุณมีเขตข้อมูลที่ไม่ใช่เขตข้อมูลสุดท้าย ซึ่งคุณหลีกเลี่ยงที่เป็นไปได้

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


3
เช่นอีกครั้ง: ไม่ได้ตั้งใจสื่อสาร - จะเกิดอะไรขึ้นถ้า "แมนนี่ผู้ดูแล" กำลังดูโค้ดของคุณและไม่รู้ว่าค่าเริ่มต้นสำหรับประเภทข้อมูลเฉพาะคืออะไร เขาสมมติว่าเป็น 0 เมื่อเป็นค่า NULL จริง ๆ และนั่นคือจุดบกพร่องทั้งหมดในการตรวจสอบ === (หรืออะไรก็ตามที่การตรวจสอบความเสมอภาคที่เท่าเทียมกันสำหรับค่าและประเภทอยู่ใน java, เท่ากับ ()?) ชั่วโมงในการค้นหา (สำหรับโปรแกรมเมอร์ที่ไม่มีประสบการณ์) อาจเป็นผลมาจากบางสิ่งที่ง่ายมาก ป.ล. พยายามเล่นทนายของปีศาจ ฉันว่าใช้ค่าเริ่มต้นทุกวัน (แม้ว่าฉันไม่เคยทำ) และรับคนฉลาด (หรืออย่างน้อยใส่ใจรายละเอียด) เพื่อรักษารหัสของคุณ
TCooper

@TCooper เมื่อแมนนี่ผู้ดูแลรู้น้อยเกี่ยวกับ Java แล้วเขาไม่มีธุรกิจที่สัมผัสโค้ด Java ในโลกแห่งความเป็นจริง แต่ฉันเห็นด้วยกับความคิดพื้นฐาน มันทำให้สิ่งที่ยากสำหรับมือใหม่
GhostCat ทักทายโมนิก้าซี

12

ทำไมบนโลกนี้เป็นวิธีการเขียนโปรแกรมที่ไม่ดี

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

... หากมีการใช้กันอย่างแพร่หลายแม้ในซอร์สโค้ดไลบรารี Java SE ??

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


2
นี่อาจจะถูกต้อง แต่ฉันไม่เห็นด้วย
VGR

3
@VGR เท่าที่ฉันมักจะเห็นด้วยกับการเรียกร้องที่ขึ้นอยู่กับค่าเริ่มต้นคือย่อยที่ดีที่สุดฉันระมัดระวังที่จะวลีในทางที่เป็นกลางด้วยเหตุผลนั้น คุณภาพของรหัสเป็นเรื่องส่วนตัวและฉันก็ทราบดีว่านี่ไม่ใช่มุมมองที่จัดขึ้นในระดับสากล
Michael Berry
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.