คำถามติดแท็ก readability

ความสามารถในการอ่านเป็นการวัดว่าโค้ดง่าย ๆ ในการอ่านและทำความเข้าใจ

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

20
`การแตก 'และ` การปฏิบัติการ' ที่แย่ ๆ
เจ้านายของฉันพูดถึงอย่างเมินเฉยว่าโปรแกรมเมอร์ที่ไม่ดีใช้breakและcontinueวนซ้ำ ฉันใช้มันตลอดเวลาเพราะมันสมเหตุสมผล ให้ฉันแสดงแรงบันดาลใจ: function verify(object) { if (object->value < 0) return false; if (object->value > object->max_value) return false; if (object->name == "") return false; ... } จุดที่นี่คือก่อนอื่นฟังก์ชันตรวจสอบว่าเงื่อนไขถูกต้องจากนั้นดำเนินการฟังก์ชันการทำงานจริง IMO เช่นเดียวกับลูป: while (primary_condition) { if (loop_count > 1000) break; if (time_exect > 3600) break; if (this->data == "undefined") continue; if (this->skip == …

10
มีเหตุผลที่เฉพาะเจาะจงหรือไม่ในการอ่านการออกแบบไวยากรณ์นิพจน์ปกติหรือไม่?
โปรแกรมเมอร์ทุกคนดูเหมือนจะยอมรับว่าการอ่านโค้ดมีความสำคัญมากกว่าการใช้ซินเทอร์แบบสั้นซึ่งทำงานอยู่ แต่ต้องการผู้พัฒนาระดับสูงในการตีความด้วยความถูกต้องในระดับใด ๆ มีเหตุผลสำหรับสิ่งนี้หรือไม่? เราทุกคนยอมรับว่าดีกว่าselfDocumentingMethodName() e()เหตุใดจึงไม่ควรใช้กับนิพจน์ทั่วไปด้วย ดูเหมือนว่าแทนที่จะออกแบบไวยากรณ์ของตรรกะหนึ่งบรรทัดโดยไม่มีโครงสร้างองค์กร: var parse_url = /^(?:([A-Za-z]+):)?(\/{0,3})(0-9.\-A-Za-z]+)(?::(\d+))?(?:\/([^?#]*))?(?:\?([^#]*))?(?:#(.*))?$/; และนี่ไม่ใช่การแยก URL อย่างเข้มงวดแม้แต่! แต่เราสามารถสร้างโครงสร้างไปป์ไลน์ที่จัดระเบียบและสามารถอ่านได้ตัวอย่างเช่น: string.regex .isRange('A-Z' || 'a-z') .followedBy('/r'); ไวยากรณ์ใดที่มีประโยชน์มากน้อยเพียงใดสำหรับนิพจน์ทั่วไปที่เสนอนอกเหนือจากการดำเนินการที่สั้นที่สุดและไวยากรณ์เชิงตรรกะ ในท้ายที่สุดมีเหตุผลทางเทคนิคเฉพาะสำหรับการอ่านการออกแบบไวยากรณ์นิพจน์ที่ไม่ดีหรือไม่?

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

10
ทำความสะอาดโค้ดที่อ่านได้และโค้ดที่อ่านยากอย่างรวดเร็ว เมื่อไหร่ที่จะข้ามเส้น?
เมื่อฉันเขียนรหัสฉันพยายามทำให้รหัสของฉันสะอาดและอ่านง่ายที่สุดเท่าที่จะทำได้ ทุกครั้งที่มีเวลาที่คุณต้องข้ามเส้นและไปจากรหัสที่สะอาดดีเป็นรหัสที่น่าเกลียดเล็กน้อยเพื่อให้เร็วขึ้น เมื่อไรที่จะข้ามเส้นนั้น?

18
วิธีการที่ยาวนานนั้นไม่ดีเสมอไปหรือไม่? [ปิด]
ดังนั้นก่อนหน้านี้ฉันสังเกตเห็นความคิดเห็นบางอย่างเกี่ยวกับวิธีการที่ยาวนานว่าเป็นการฝึกฝนที่ไม่ดี ฉันไม่แน่ใจว่าฉันเห็นด้วยเสมอว่าวิธีการที่ยาวนานนั้นไม่ดี (และต้องการความคิดเห็นจากผู้อื่น) ตัวอย่างเช่นฉันมีมุมมอง Django ที่ประมวลผลบางส่วนของวัตถุก่อนที่จะส่งไปยังมุมมองซึ่งเป็นวิธีการที่ยาวเป็นรหัส 350 บรรทัด ฉันได้เขียนโค้ดของฉันเพื่อให้เกี่ยวข้องกับพารามิเตอร์ - การเรียงลำดับ / กรองชุดสืบค้นจากนั้นการประมวลผลบางอย่างบนวัตถุที่แบบสอบถามของฉันส่งคืน ดังนั้นการประมวลผลส่วนใหญ่จะเป็นการรวมแบบมีเงื่อนไขซึ่งมีกฎที่ซับซ้อนพอที่จะไม่สามารถทำได้อย่างง่ายดายในฐานข้อมูลดังนั้นฉันจึงมีตัวแปรบางตัวที่ประกาศนอกลูปหลักจากนั้นจึงเปลี่ยนแปลงระหว่างลูป variable_1 = 0 variable_2 = 0 for object in queryset : if object.condition_condition_a and variable_2 > 0 : variable 1+= 1 ..... ... . more conditions to alter the variables return queryset, and context ตามทฤษฎีฉันควรแยกรหัสทั้งหมดออกเป็นวิธีที่เล็กลงเพื่อให้ฉันมีวิธีการดูว่ายาวที่สุดในหนึ่งหน้า อย่างไรก็ตามในอดีตเคยทำงานกับฐานรหัสหลาย …

11
นิพจน์บูลีนขนาดใหญ่สามารถอ่านได้มากกว่านิพจน์เดียวกันที่แบ่งออกเป็นวิธีเพรดิเคตหรือไม่ [ปิด]
จะเข้าใจอะไรได้ง่ายกว่าคำสั่งบูลีนขนาดใหญ่ (ค่อนข้างซับซ้อน) หรือคำเดียวกันนี้แบ่งออกเป็นเมธอดเพรดิเคต (มีโค้ดพิเศษมากมายให้อ่าน) ตัวเลือก 1 นิพจน์บูลีนขนาดใหญ่: private static bool ContextMatchesProp(CurrentSearchContext context, TValToMatch propVal) { return propVal.PropertyId == context.Definition.Id && !repo.ParentId.HasValue || repo.ParentId == propVal.ParentId && ((propVal.SecondaryFilter.HasValue && context.SecondaryFilter.HasValue && propVal.SecondaryFilter.Value == context.SecondaryFilter) || (!context.SecondaryFilter.HasValue && !propVal.SecondaryFilter.HasValue)); } ตัวเลือก 2 เงื่อนไขแบ่งออกเป็นวิธีเพรดิเคต: private static bool ContextMatchesProp(CurrentSearchContext context, TValToMatch propVal) { return …
63 c#  readability 

4
ควรใช้คำหลัก const แบบใดใน C เพื่อหาตัวแปรเมื่อใดและเพื่ออะไร
ในขณะที่รับรหัสของฉันได้รับการตรวจสอบที่นี่ปัญหาการใช้constคำหลักเกิดขึ้น ฉันเข้าใจว่ามันใช้สำหรับการใช้งานพฤติกรรมอ่านอย่างเดียวกับตัวแปร ฉันสับสนเกี่ยวกับสถานการณ์ต่าง ๆ ว่าจะมีประโยชน์เมื่อใด ควรใช้เพื่อความชัดเจนในฟังก์ชั่นต้นแบบหรือไม่ ควรใช้เป็นมาตรการรักษาความปลอดภัยระหว่างการพัฒนารหัสหรือไม่ มันควรจะใช้ในขอบเขตของฟังก์ชั่นต่าง ๆ เพื่อประกาศค่าคงที่แบบรันไทม์หรือไม่? ควรจะใช้เลยหรือไม่? คำถามเหล่านี้เป็นเพียงตัวอย่างของความสับสนที่ฉันเผชิญ ความสับสนทั่วไปคือ ควรconstใช้คำหลักในการเขียนโปรแกรม C เมื่อใด สิทธิประโยชน์หลายประเภทที่สามารถได้รับจากการใช้คำหลักนี้ใน C คืออะไร? มีข้อเสียของการใช้constคำหลักหรือไม่ มีการชี้ว่าคำถามนี้อาจกว้างเกินไปเนื่องจากคำถามเหล่านี้มีรายละเอียดตามคำถามของฉัน ฉันแค่อยากจะชี้แจงว่าคำถามเหล่านี้เป็นเพียงเพื่อชี้แจงความสับสนเกี่ยวกับคำถามหลัก ควรใช้คำหลัก const แบบใดใน C เพื่อหาตัวแปรเมื่อใดและเพื่ออะไร นอกจากนี้ยังสามารถใช้ถ้อยคำใหม่เป็น การใช้constคำหลักที่เหมาะสมใน C` ด้วยข้อดีข้อเสียของสิ่งเดียวกัน

9
ความสามารถในการอ่านและการบำรุงรักษากรณีพิเศษของการเขียนการเรียกฟังก์ชันที่ซ้อนกัน
รูปแบบการเข้ารหัสของฉันสำหรับการเรียกใช้ฟังก์ชันที่ซ้อนกันมีดังต่อไปนี้: var result_h1 = H1(b1); var result_h2 = H2(b2); var result_g1 = G1(result_h1, result_h2); var result_g2 = G2(c1); var a = F(result_g1, result_g2); ฉันเพิ่งเปลี่ยนเป็นแผนกที่ใช้รูปแบบการเข้ารหัสต่อไปนี้เป็นอย่างมาก: var a = F(G1(H1(b1), H2(b2)), G2(c1)); ผลของวิธีการเข้ารหัสของฉันคือในกรณีที่ฟังก์ชั่นการขัดข้อง Visual Studio สามารถเปิดการถ่ายโอนข้อมูลที่สอดคล้องกันและระบุบรรทัดที่ปัญหาเกิดขึ้น (ฉันกังวลเป็นพิเศษเกี่ยวกับการละเมิดการเข้าถึง) ฉันกลัวว่าในกรณีที่เกิดความผิดพลาดเนื่องจากปัญหาเดียวกันที่ตั้งโปรแกรมไว้ในวิธีแรกฉันจะไม่สามารถรู้ได้ว่าฟังก์ชันใดที่ทำให้เกิดความผิดพลาด ในทางกลับกันยิ่งการประมวลผลที่คุณใส่ในบรรทัดมากขึ้นเท่าไรคุณก็ยิ่งได้รับตรรกะมากขึ้นในหน้าเดียวซึ่งจะช่วยเพิ่มความสามารถในการอ่าน ความกลัวของฉันถูกต้องหรือฉันขาดอะไรไปและโดยทั่วไปแล้วสิ่งใดที่เป็นที่นิยมในสภาพแวดล้อมเชิงพาณิชย์ อ่านหรือบำรุงรักษา? ฉันไม่รู้ว่ามันเกี่ยวข้องหรือไม่ แต่เรากำลังทำงานใน C ++ (STL) / C #

4
หลักการตั้งชื่อที่โดดเด่นสำหรับตัวแปรใน PHP คือ camelcase หรือขีดล่าง? [ปิด]
ฉันทามติดูเหมือนว่าควรจะทำตามแบบแผนของแพลตฟอร์มที่พวกเขากำลังพัฒนา ดู: ขีดเส้นใต้หรืออูฐ? ข้อกำหนดการตั้งชื่อ: camelCase กับ underscore_case หรือไม่ อย่างไรก็ตาม, PHP ดูเหมือนจะไม่ปฏิบัติตามอย่างเคร่งครัดการประชุมใด ๆ ภายใน (ความผิดไม่มี) แม้สำหรับวิธีการและฟังก์ชั่น (เช่นmysqli::set_local_infile_default, PDOStatement::debugDumpParams); อย่างไรก็ตามเครื่องหมายขีดล่างดูเหมือนจะโดดเด่นในชื่อฟังก์ชัน อย่างไรก็ตามสิ่งที่ฉันไม่สามารถหาได้คือสิ่งนี้: อะไรคือหลักการตั้งชื่อที่เด่นชัดสำหรับตัวแปรใน PHP?

12
การสะกดผิดโดยเจตนาเพื่อหลีกเลี่ยงคำที่สงวนไว้
ฉันมักจะเห็นรหัสที่มีการสะกดผิดโดยเจตนาของคำทั่วไปที่ดีขึ้นหรือแย่ลงกลายเป็นคำสงวน: klassหรือclazzสำหรับชั้นเรียน :Class clazz = ThisClass.class kountสำหรับการนับใน SQL:count(*) AS kount โดยส่วนตัวแล้วฉันพบว่าการอ่านนี้ลดลง ในทางปฏิบัติของฉันเองฉันไม่ได้พบมากเกินไปกรณีที่ชื่อที่ดีกว่าอาจจะไม่ได้ถูกนำมาใช้ - หรือitemClassrecordTotal ตัวอย่างจาก JavaDocs สำหรับClassแสดงสิ่งนี้ในพารามิเตอร์: public <U> Class<? extends U> asSubclass(Class<U> clazz) นี่แสดงให้เห็นถึงกรณีการใช้งานที่สมเหตุสมผลหรือไม่?

15
มันเป็นการปฏิบัติที่ไม่ถูกต้องหรือไม่ที่จะตั้งชื่อตัวแปรที่ไม่ได้ใช้ด้วยการขีดเส้นใต้เดี่ยว?
_บ่อยครั้งเมื่อไวยากรณ์ของภาษาต้องการให้ฉันชื่อตัวแปรที่ไม่เคยใช้ผมจะตั้งชื่อมันว่า ในใจของฉันมันช่วยลดความยุ่งเหยิงและให้ฉันมุ่งเน้นไปที่ตัวแปรที่มีความหมายในโค้ด ฉันคิดว่ามันจะไม่เป็นการรบกวนเพื่อสร้างผล "นอกสายตาจากใจ" ตัวอย่างทั่วไปที่ฉันทำคือการตั้งชื่อแบบสอบถามย่อยใน SQL SELECT * FROM ( SELECT * FROM TableA JOIN TableB ON TableA.ColumnB = TableB.ColumnB WHERE [ColumnA] > 10 ) _ --This name is required, but never used here ORDER BY ColumnC อีกตัวอย่างหนึ่งคือตัวแปรลูปที่ไม่ได้ใช้ array = [[] for _ in range(n)] # Defines a list of …

15
มันไม่ได้ตั้งใจที่จะทำให้ฟังก์ชั่นที่เป็นหลักเปลี่ยนชื่อฟังก์ชั่นในตัวหรือไม่?
ฉันสับสนกับฟังก์ชั่นขั้นต่ำและสูงสุดในบางบริบท ในบริบทเดียวเมื่อคุณใช้ฟังก์ชั่นเพื่อรับค่าที่มากหรือน้อยกว่าสองค่าก็จะไม่มีปัญหา ตัวอย่างเช่น, //how many autographed CD's can I give out? int howManyAutographs(int CDs, int Cases, int Pens) { //if no pens, then I cannot sign any autographs if (Pens == 0) return 0; //I cannot give away a CD without a case or a case without a CD return …

8
เมื่อใช้วิธีการผูกมัดฉันจะนำวัตถุมาใช้ใหม่หรือสร้างใหม่ได้หรือไม่
เมื่อใช้วิธีการผูกมัดเช่น: var car = new Car().OfBrand(Brand.Ford).OfModel(12345).PaintedIn(Color.Silver).Create(); อาจมีสองวิธี: ใช้วัตถุเดียวกันซ้ำดังนี้: public Car PaintedIn(Color color) { this.Color = color; return this; } สร้างวัตถุชนิดใหม่Carในทุกขั้นตอนดังนี้ public Car PaintedIn(Color color) { var car = new Car(this); // Clone the current object. car.Color = color; // Assign the values to the clone, not the original object. return …

16
คุณควรเสียสละการอ่านรหัสด้วยรหัสที่มีประสิทธิภาพหรือไม่ [ปิด]
คุณควรเสียสละการอ่านรหัสด้วยรหัสที่มีประสิทธิภาพหรือไม่ เช่น 3 บรรทัดของรหัสเป็น 1 บรรทัด ฉันอ่านในCode Craftโดย Pete Goodliffe ว่าการอ่านเป็นกุญแจสำคัญ ความคิดของคุณ?

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