ฉันควรใส่บรรทัดใหม่ก่อนหรือหลังตัวดำเนินการไบนารีหรือไม่ [ปิด]


11

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

แต่ใน C หรือ C ++ นี่ไม่ใช่ปัญหาดังนั้นฉันจึงสงสัยว่า:

มีเหตุผลใดที่ฉันจะเลือกรุ่นที่สองมากกว่ารุ่นแรก

return lots_of_text
       + 1;

กับ

return lots_of_text +
       1;

(ตัวอย่างเช่นข้อใดข้อหนึ่งช่วยป้องกันข้อผิดพลาดชนิดอื่นหรือไม่หรือข้อใดข้อหนึ่งพิจารณาว่าสามารถอ่านได้มากกว่า)


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

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

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

@delnan: จริง ๆ แล้วมันง่ายมากที่จะพลาดการเยื้องโดยใช้โปรแกรมแก้ไขข้อความของคุณเช่นเมื่อแก้ไขจำนวนมากหรือเลือกแบบสี่เหลี่ยม และถ้า / เมื่อสิ่งนั้นเกิดขึ้นในระหว่างการบำรุงรักษาคุณจะไม่ได้รับข้อผิดพลาดในกรณีแรกและมันจะลื่นหลุดโดยคุณ แต่คุณจะได้รับข้อผิดพลาดที่ดีในกรณีที่สอง
user541686

4
ไม่แน่ใจว่าทำไมสิ่งนี้จึงถูกลดระดับลง ดูเหมือนว่าคำถามสไตล์การเขียนโปรแกรมที่เหมาะสม
Stuart Marks

คำตอบ:


18

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


ฉันชอบการขึ้นบรรทัดใหม่ต่อหน้าผู้ให้บริการ

เมื่อใดก็ตามที่ฉันต้องหยุดสายฉันมักจะใส่มากที่สุดหนึ่งคำของ "ระดับ" เดียวกันในบรรทัด:

กฎความโน้มถ่วงของนิวตันใน Python:

force = (
    gravitational_constant
    * mass_1
    * mass_2
    / (distance * distance)
)

เปรียบเทียบสิ่งนี้กับ:

force = (
    gravitational_constant *
    mass_1 *
    mass_2 /
    (distance * distance)
)

ฉันต้องการที่จะรู้ว่าผม "หารโดยระยะยืด" ผมไม่ต้องการที่จะรู้ว่า "mass_2 ได้รับการแบ่ง" เพราะนั่นไม่ใช่วิธีการที่ฉันคิดว่าการแสดงออกทางคณิตศาสตร์

นอกจากนี้ฉันมักจะต้องการทราบก่อนสิ่งที่ฉันกำลังทำ (โอเปอเรเตอร์) ก่อนที่ฉันจะสนใจสิ่งที่ฉันทำกับ (ตัวถูกดำเนินการ)

หรือพิจารณาคำสั่ง SQL ที่ซับซ้อนนี้:

WHERE
  a = 1
  AND b = 2
  AND c = 3
  AND ( -- or put the OR on one line together with the AND
    d = 3 
    OR e = 1)
  AND x = 5

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

WHERE
  a = 1 AND
  b = 2 AND
  c = 3 AND
  ( 
    d = 3 OR
    e = 1) AND
  x = 5

ฉันคิดถึงอดีตในแง่ของ " Xเป็นจริง" จากนั้นฉันก็แก้ไขโดยพูดว่า: " และนี่ก็เป็นความจริง" ซึ่งทำให้ฉันรู้สึกเป็นธรรมชาติมากกว่าวิธีอื่น ๆ ยิ่งกว่านั้นฉันพบว่าการแยกวิเคราะห์ภาพด้วยวิธีแรกง่ายกว่ามาก

หรือตัวอย่าง PHP:

$text = "lorem ipsum"
      . "dolor sit amet, "
      . "consectetur adipisicing elit, "
      . "sed do eiusmod tempor";

อีกครั้งฉันสามารถอ่านอ่านในแนวตั้งเพื่อดูว่าฉันเป็นเพียงข้อความที่ต่อกันเพราะส่วนใหญ่ฉันรู้สึกว่าฉันไม่สนใจสิ่งที่อยู่ในเงื่อนไข / เงื่อนไข

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


เพิ่มวงเล็บที่ขาดหายไปเป็นตัวอย่างแรก
kevin cline

1
+1: ถูกต้อง; คณิตศาสตร์เป็นประเภทเรียงเสมอเพื่อให้บรรทัดต่อเนื่องเริ่มต้นด้วยโอเปอเรเตอร์
วินไคลน์

+1 ด้วยเหตุผลเดียวกันกับที่คุณอธิบาย แต่ตัวอย่าง PHP ของคุณดูค่อนข้างแปลกสำหรับฉัน คอนคอตเหล่านั้นไม่ควรจะใช่หรือ.ไม่.=?
Izkata

@ Izkata โอ้ใช่คุณถูกต้องแน่นอน ขอบคุณ เควิน: วงเล็บถูกต้อง;) ฉันเพิ่งปรับมันด้วยforce
phant0m

11

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

if (first_part_of_condition &&
    second_part_of_condition) {
    statement_within_then_part;
}

ส่วนที่สองของนิพจน์เงื่อนไขนั้นสับสนได้อย่างง่ายดายด้วยคำสั่งแรกของส่วนนั้น สิ่งนี้อาจทำให้เกิดความสับสนหากส่วนแรกของเงื่อนไขยาวและ && สิ้นสุดลงทางด้านขวา เปรียบเทียบกับทางเลือกอื่น:

if (first_part_of_condition
    && second_part_of_condition) {
    statement_within_then_part;
}

นี่ดูค่อนข้างแปลก แต่ก็ค่อนข้างชัดเจนว่าส่วนที่สองของเงื่อนไขไม่ใช่จุดเริ่มต้นของข้อความ

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

tl; dr ปลายด้านซ้ายของบรรทัดมีความสำคัญมากกว่าความเข้าใจในการอ่านอย่างรวดเร็วดังนั้นการวางโอเปอเรเตอร์ที่ด้านซ้ายเป็นเครื่องหมายที่โดดเด่นกว่าว่านี่เป็นการแสดงออกที่ต่อเนื่องไม่ใช่คำสั่ง


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

"ส่วนที่สองของการแสดงออกตามเงื่อนไขสับสนได้ง่าย ๆ กับคำสั่งแรกของส่วนนั้น": สิ่งนี้จะไม่เกิดขึ้นหากคุณจัดแนว "{" และ "}" ในแนวตั้ง (คอลัมน์เดียวกัน) เพื่อเริ่มต้นและสิ้นสุด ของบล็อกโดดเด่นมากขึ้น
Giorgio

8

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

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


อันดับสอง ...........
James

7

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

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

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

ฉันจม
ดังนั้นฉันว่าย

คุณจะไม่เขียน

ฉันจม
ดังนั้นฉันว่าย


3
+1: ฉันมักจะอ่าน + ที่ท้ายบรรทัดด้วยเครื่องหมายจุลภาคคั่นสองรายการในรายการตัวถูกดำเนินการ ด้วยเหตุนี้ฉันต้องการวางเครื่องหมาย + ที่ท้ายบรรทัดเหมือนกับที่ใช้เครื่องหมายจุลภาค (ฉันจะไม่เริ่มบรรทัดด้วยเครื่องหมายจุลภาค)
Giorgio

@Giorgio จุดนี้ยอดเยี่ยมมากจนฉันได้ขโมยไปเพื่อเป็นคำตอบ ฉันหวังว่าคุณจะยกโทษให้ฉันได้
Konrad Rudolph

ไปข้างหน้า: ฉันรู้สึกเป็นเกียรติ ;-)
Giorgio

7
รหัสไม่ใช่ภาษาอังกฤษและฉันคิดว่ามันเป็นการเปรียบเทียบที่ผิดพลาดในการใช้กฎไวยากรณ์ภาษาอังกฤษเป็นวิธีในการปรับการประชุมการเข้ารหัส ฉันไม่ชอบสไตล์ตัวดำเนินการต่อท้าย แต่ยอมรับว่า Konrad มีจุดที่ดีเกี่ยวกับภาษาเช่น Python
เอ็มดัดลีย์

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