คำถามติดแท็ก coding-style

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

8
การกำหนดในส่วนของเงื่อนไขเป็นเงื่อนไขที่ไม่ดีหรือไม่?
สมมติว่าฉันต้องการเขียนฟังก์ชันที่เชื่อมสองสายเข้าด้วยกันใน C วิธีที่ฉันจะเขียนคือ: void concat(char s[], char t[]){ int i = 0; int j = 0; while (s[i] != '\0'){ i++; } while (t[j] != '\0'){ s[i] = t[j]; i++; j++; } s[i] = '\0'; } อย่างไรก็ตามK&Rในหนังสือของพวกเขามีการใช้งานที่แตกต่างกันโดยเฉพาะอย่างยิ่งรวมถึงสภาพของลูปในขณะที่มากที่สุด: void concat(char s[], char t[]){ int i, j; i = j = 0; …

3
นี่เป็นการใช้ค่าคงที่ที่เป็นสัญลักษณ์มากเกินไปหรือไม่?
ฉันค่อนข้างใหม่สำหรับวิศวกรรมซอฟต์แวร์และเพื่อเป็นแบบฝึกหัดการเรียนรู้ฉันเขียนเกมหมากรุก เพื่อนของฉันดูและชี้ให้เห็นว่ารหัสของฉันดูเหมือน for (int i = 0; i < 8; i++){ for (int j = 0; j < 8; j++){ ในขณะที่เขายืนยันว่ามันควรจะเป็นแทน for (int i = 0; i < CHESS_CONST; i++){ for (int j = 0; j < CHESS_CONST; j++){ ด้วยชื่อสัญลักษณ์ที่ดีกว่าที่ฉันไม่สามารถนึกได้ตอนนี้ ตอนนี้แน่นอนฉันรู้ว่าหลีกเลี่ยงการใช้หมายเลขเวทย์มนตร์ แต่ฉันรู้สึกเหมือนตั้งแต่ หมายเลขนี้จะไม่เปลี่ยนแปลง ชื่อนั้นไม่สามารถสื่อความหมายได้เนื่องจากมีการใช้ตัวเลขในหลาย ๆ ที่ตลอดทั้งรหัส และ ใครก็ตามที่ต้องผ่านซอร์สโค้ดสำหรับโปรแกรมหมากรุกควรรู้เกี่ยวกับหมากรุกอย่างเพียงพอเพื่อให้ทราบว่าสิ่งใดที่ 8 นั้น …

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

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

5
ฉันควรเริ่มต้น C structs ผ่านพารามิเตอร์หรือโดยค่าตอบแทน? [ปิด]
บริษัท ที่ฉันทำงานอยู่นั้นกำลังเริ่มต้นโครงสร้างข้อมูลทั้งหมดผ่านฟังก์ชันเตรียมใช้งานเช่น: //the structure typedef struct{ int a,b,c; } Foo; //the initialize function InitializeFoo(Foo* const foo){ foo->a = x; //derived here based on other data foo->b = y; //derived here based on other data foo->c = z; //derived here based on other data } //initializing the structure Foo foo; InitializeFoo(&foo); …

8
การขว้างข้อยกเว้นเป็นการต่อต้านแบบที่นี่หรือไม่?
ฉันเพิ่งพูดคุยเกี่ยวกับตัวเลือกการออกแบบหลังจากการตรวจสอบโค้ด ฉันสงสัยว่าความคิดเห็นของคุณคืออะไร มีPreferencesคลาสนี้ซึ่งเป็นที่เก็บข้อมูลสำหรับคู่คีย์ - ค่า ค่า Null นั้นถูกกฎหมาย (สำคัญมาก) เราคาดหวังว่าค่าบางอย่างอาจยังไม่ถูกบันทึกและเราต้องการจัดการกับกรณีเหล่านี้โดยอัตโนมัติโดยเริ่มต้นด้วยค่าเริ่มต้นที่กำหนดไว้ล่วงหน้าเมื่อมีการร้องขอ วิธีแก้ปัญหาที่กล่าวถึงใช้รูปแบบต่อไปนี้ (หมายเหตุ: นี่ไม่ใช่รหัสจริงแน่นอน - มันง่ายสำหรับจุดประสงค์ในการอธิบาย): public class Preferences { // null values are legal private Map<String, String> valuesFromDatabase; private static Map<String, String> defaultValues; class KeyNotFoundException extends Exception { } public String getByKey(String key) { try { return getValueByKey(key); } catch …

10
ผ่านตัวแปรสมาชิกเป็นพารามิเตอร์วิธี
ในโครงการฉันพบรหัสเช่นนี้: class SomeClass { private SomeType _someField; public SomeType SomeField { get { return _someField; } set { _someField = value; } } protected virtual void SomeMethod(/*...., */SomeType someVar) { } private void SomeAnotherMethod() { //............. SomeMethod(_someField); //............. } }; ฉันจะโน้มน้าวให้เพื่อนร่วมทีมของฉันว่านี่เป็นรหัสไม่ดีได้อย่างไร ฉันเชื่อว่านี่เป็นภาวะแทรกซ้อนที่ไม่จำเป็น ส่งผ่านตัวแปรสมาชิกเป็นพารามิเตอร์เมธอดทำไมถ้าคุณสามารถเข้าถึงมันได้? นี่ก็เป็นการละเมิด encapsulation คุณเห็นปัญหาอื่น ๆ ของรหัสนี้หรือไม่?

10
“ Parent x = new Child ();” แทนที่จะเป็น“ Child x = new Child ();” เป็นการปฏิบัติที่ไม่ดีถ้าเราสามารถใช้อันหลังได้หรือไม่?
ตัวอย่างเช่นฉันเคยเห็นรหัสบางอย่างที่สร้างชิ้นส่วนเช่นนี้: Fragment myFragment=new MyFragment(); ซึ่งประกาศตัวแปรเป็นชิ้นส่วนแทน MyFragment ซึ่ง MyFragment เป็นคลาสย่อยของ Fragment ฉันไม่พอใจรหัสบรรทัดนี้เพราะฉันคิดว่ารหัสนี้ควรเป็น: MyFragment myFragment=new MyFragment(); ข้อไหนเจาะจงกว่ากันจริงหรือ? หรือโดยทั่วไปของคำถามเป็นการใช้งานไม่ถูกต้อง: Parent x=new Child(); แทน Child x=new Child(); หากเราสามารถเปลี่ยนคนที่เคยเป็นคนหลังได้โดยไม่ผิดพลาด

8
ลักษณะใดที่ดีกว่า (ตัวแปรอินสแตนซ์กับค่าตอบแทน) ใน Java
ฉันมักจะพบว่าตัวเองกำลังดิ้นรนเพื่อตัดสินใจว่าจะใช้วิธีใดในสองวิธีนี้เมื่อฉันต้องการใช้ข้อมูลทั่วไปในบางวิธีในชั้นเรียนของฉัน อะไรจะเป็นทางเลือกที่ดีกว่า ในตัวเลือกนี้ฉันสามารถสร้างตัวแปรอินสแตนซ์เพื่อหลีกเลี่ยงความต้องการที่จะต้องประกาศตัวแปรเพิ่มเติมและเพื่อหลีกเลี่ยงการกำหนดพารามิเตอร์เมธอด public class MyClass { private int var1; MyClass(){ doSomething(); doSomethingElse(); doMoreStuff(); } private void doSomething(){ var1 = 2; } private void doSomethingElse(){ int var2 = var1 + 1; } private void doMoreStuff(){ int var3 = var1 - 1; } } หรือเพียงแค่สร้างตัวแปรท้องถิ่นและส่งให้พวกเขาเป็นอาร์กิวเมนต์? public class MyClass { MyClass(){ int …

8
การเปรียบเทียบความเท่าเทียมกันของจำนวนลอยเข้าใจผิดนักพัฒนารุ่นน้องแม้ว่าจะไม่มีข้อผิดพลาดในการปัดเศษในกรณีของฉันหรือไม่?
ตัวอย่างเช่นฉันต้องการแสดงรายการปุ่มจาก 0,0.5, ... 5 ซึ่งข้ามไปแต่ละ 0.5 ฉันใช้สำหรับการวนรอบเพื่อทำเช่นนั้นและมีสีที่แตกต่างกันที่ปุ่ม STANDARD_LINE: var MAX=5.0; var DIFF=0.5 var STANDARD_LINE=1.5; for(var i=0;i<=MAX;i=i+DIFF){ button.text=i+''; if(i==STANDARD_LINE){ button.color='red'; } } ในกรณีนี้ไม่ควรมีข้อผิดพลาดในการปัดเศษเนื่องจากค่าแต่ละค่าเป็นค่าที่แน่นอนใน IEEE 754 แต่ฉันกำลังลำบากถ้าฉันควรเปลี่ยนเพื่อหลีกเลี่ยงการเปรียบเทียบความเท่าเทียมกันของทศนิยม var MAX=10; var STANDARD_LINE=3; for(var i=0;i<=MAX;i++){ button.text=i/2.0+''; if(i==STANDARD_LINE/2.0){ button.color='red'; } } ในมือข้างหนึ่งรหัสดั้งเดิมนั้นเรียบง่ายกว่าและส่งต่อมาให้ฉัน แต่มีสิ่งหนึ่งที่ฉันกำลังพิจารณา: i == STANDARD_LINE ทำให้เข้าใจผิดว่าเป็นเพื่อนร่วมทีมของจูเนียร์หรือไม่? มันซ่อนข้อเท็จจริงที่ว่าตัวเลขจุดลอยตัวอาจมีข้อผิดพลาดในการปัดเศษหรือไม่ หลังจากอ่านความคิดเห็นจากโพสต์นี้: https://stackoverflow.com/questions/33646148/is-hardcode-float-precise-if-it-can-be-represented-by-binary-format-in-ieee-754 ดูเหมือนว่ามีนักพัฒนาหลายคนไม่ทราบว่าตัวเลขลอยตัวบางอย่างแน่นอน ฉันควรหลีกเลี่ยงการเปรียบเทียบความเท่าเทียมกันของจำนวนทศนิยมแม้ว่าจะถูกต้องในกรณีของฉัน หรือฉันกำลังคิดถึงเรื่องนี้อยู่

3
ข้อผิดพลาดในการพิจารณาการจัดการ
ปัญหา: ตั้งแต่เวลานานฉันกังวลเกี่ยวกับexceptionsกลไกเพราะฉันรู้สึกว่ามันไม่ได้แก้ไขสิ่งที่ควร เคลม: มีการถกเถียงกันนานเกี่ยวกับหัวข้อนี้และพวกเขาส่วนใหญ่มักจะพยายามเปรียบเทียบexceptionsและส่งกลับรหัสข้อผิดพลาด นี่ไม่ใช่หัวข้อที่แน่นอน พยายามกำหนดข้อผิดพลาดฉันจะเห็นด้วยกับ CppCoreGuidelines จาก Bjarne Stroustrup & Herb Sutter ข้อผิดพลาดหมายความว่าฟังก์ชันไม่สามารถบรรลุวัตถุประสงค์ที่โฆษณาไว้ การเรียกร้อง: exceptionกลไกคือ semantic ภาษาสำหรับการจัดการข้อผิดพลาด การเรียกร้อง: สำหรับฉันมี "ไม่มีข้อแก้ตัว" สำหรับฟังก์ชั่นที่ไม่ได้งาน: เพราะเรากำหนดเงื่อนไขล่วงหน้า / โพสต์ผิดดังนั้นฟังก์ชันไม่สามารถรับประกันผลลัพธ์ได้หรือกรณีพิเศษบางกรณีไม่ถือว่าสำคัญพอสำหรับการใช้เวลาในการพัฒนา ทางออก เมื่อพิจารณาแล้ว IMO ความแตกต่างระหว่างการจัดการรหัสปกติและรหัสข้อผิดพลาดคือ (ก่อนการติดตั้ง) บรรทัดที่เป็นอัตนัย การเรียกร้อง: การใช้ข้อยกเว้นเพื่อระบุว่าเมื่อใดที่ไม่ได้รักษาเงื่อนไขก่อนหรือหลังการโพสต์ไว้เป็นอีกจุดประสงค์หนึ่งของexceptionกลไก ฉันไม่ได้กำหนดเป้าหมายการใช้งานของexceptionsที่นี่ ในหนังสือหลายบทช่วยสอนและแหล่งข้อมูลอื่น ๆ พวกเขามักจะแสดงการจัดการข้อผิดพลาดเป็นศาสตร์ที่ค่อนข้างมีวัตถุประสงค์ซึ่งแก้ไขได้ด้วยexceptionsและคุณเพียงแค่ต้องการให้catchพวกเขามีซอฟต์แวร์ที่แข็งแกร่งสามารถกู้คืนจากสถานการณ์ใด ๆ แต่เป็นเวลาหลายปีในฐานะนักพัฒนาทำให้ฉันเห็นปัญหาจากแนวทางที่แตกต่าง: โปรแกรมเมอร์มีแนวโน้มที่จะทำให้งานของพวกเขาง่ายขึ้นโดยการโยนข้อยกเว้นเมื่อกรณีที่เฉพาะเจาะจงดูยากเกินกว่าที่จะดำเนินการอย่างระมัดระวัง กรณีทั่วไปนี้คือ: ปัญหาหน่วยความจำไม่เพียงพอ, ปัญหาเต็มรูปแบบดิสก์, ปัญหาไฟล์ที่เสียหายเป็นต้นซึ่งอาจเพียงพอ แต่ไม่สามารถตัดสินใจได้เสมอจากระดับสถาปัตยกรรม โปรแกรมเมอร์ไม่อ่านเอกสารอย่างละเอียดเกี่ยวกับข้อยกเว้นในไลบรารีและมักจะไม่ทราบว่าเมื่อใดและเมื่อใด นอกจากนี้แม้ว่าพวกเขารู้ว่าพวกเขาไม่ได้จัดการพวกเขาจริงๆ โปรแกรมเมอร์มักจะไม่ได้รับข้อยกเว้นเร็วพอและเมื่อพวกเขาทำมันส่วนใหญ่จะเข้าสู่ระบบและโยนต่อไป (อ้างถึงจุดแรก) สิ่งนี้มีสองผล: …

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

7
เมื่อใดที่ฉันควรใช้คลาส 2 คุณสมบัติเหนือโครงสร้างที่สร้างไว้ล่วงหน้าเช่น KeyValuePair
เมื่อใดที่คุณควรใส่ข้อมูล Key / Value ในคลาสของตัวเองแทนที่จะใช้โครงสร้างทั่วไปที่สร้างไว้ล่วงหน้าเช่น a KeyValuePairหรือ a Tuple? ตัวอย่างเช่น ComboBox ส่วนใหญ่ที่ฉันสร้างมี DisplayName และค่า นี่เป็นข้อมูลประเภทหนึ่งที่ฉันพยายามจะตัดสินใจว่าจะใส่คลาสใหม่เมื่อใดและเมื่อใดควรใช้ KeyValuePair ขณะนี้ฉันกำลังทำงานกับบางสิ่งที่ใช้iCalendarงานอยู่และในที่สุดข้อมูลของผู้ใช้ที่เลือกจะได้รับการรวมกันเป็นkey1=value1;key2=value2;สตริงชนิดหนึ่ง ฉันเริ่มต้นด้วยการใส่ข้อมูลในKeyValuePair<string,string>แต่ตอนนี้ฉันสงสัยว่ามันควรจะเป็นชั้นเรียนของตัวเองแทน โดยรวมแล้วฉันสนใจที่จะทราบว่าจะใช้แนวทางใดเมื่อตัดสินใจใช้โครงสร้าง / คลาสที่มีอยู่เช่นKeyValuePairวัตถุ 2 คุณสมบัติและในสถานการณ์แบบใดที่คุณจะใช้อีกแบบหนึ่ง
31 c#  coding-style 

4
การใช้งานสายอักขระ / หมายเลข [ปิด]
นี่เป็นหัวข้อที่ถกเถียงกันอยู่และฉันคิดว่ามีความคิดเห็นมากเท่ากับที่มีโปรแกรมเมอร์ แต่เพื่อประโยชน์ของมันฉันต้องการทราบว่าการปฏิบัติทั่วไปในธุรกิจคืออะไร (หรือในที่ทำงานของคุณ) ในที่ทำงานของฉันเรามีแนวทางการเข้ารหัสที่เข้มงวด ส่วนหนึ่งของนั้นจะทุ่มเทให้กับสายอักขระ / หมายเลข มันระบุ (สำหรับ C #): อย่าใช้ค่าตัวอักษรตัวเลขหรือสตริงในรหัสของคุณนอกเหนือจากการกำหนดค่าคงที่เชิงสัญลักษณ์ ใช้รูปแบบต่อไปนี้เพื่อกำหนดค่าคงที่: public class Whatever { public static readonly Color PapayaWhip = new Color(0xFFEFD5); public const int MaxNumberOfWheels = 18; } มีข้อยกเว้นคือค่า 0, 1 และ null สามารถใช้ได้อย่างปลอดภัยเกือบตลอดเวลา บ่อยครั้งที่ค่า 2 และ -1 ก็โอเคเช่นกัน สตริงที่มีไว้สำหรับการบันทึกหรือการติดตามได้รับการยกเว้นจากกฎนี้ อนุญาตให้ใช้ตัวอักษรเมื่อความหมายชัดเจนจากบริบทและไม่ขึ้นอยู่กับการเปลี่ยนแปลงในอนาคต mean = (a + b) …

6
รูปแบบที่จะใช้สำหรับพารามิเตอร์ส่งคืนที่ไม่ได้ใช้ในการเรียกใช้ฟังก์ชัน Python
มีรูปแบบการเข้ารหัสที่แนะนำ / ยอมรับโดยทั่วไปสำหรับการจัดการสถานการณ์ที่ฟังก์ชันส่งคืนค่า tuple แต่จะใช้ค่าเหล่านั้นเพียงหนึ่งค่าในภายหลัง (โปรดทราบว่านี่เป็นความหมายส่วนใหญ่สำหรับฟังก์ชั่นห้องสมุดที่ฉันไม่สามารถเปลี่ยนแปลงได้ การโทรน่าจะเกินกำลังเล็กน้อย ... )? แทนที่จะทำ a, b, c = foo() และจากนั้นก็ไม่ได้ใช้bและcควรเลือกอันใดของตัวแปรต่อไปนี้ (หรือมีอีกอันหนึ่ง): ตัวแปร 1 (ขีดล่าง) a, _, _ = foo() (ซึ่งมีความชัดเจนและเรียบง่าย แต่อาจขัดแย้งกับการ_ = gettext.gettextใช้งานในหลาย ๆ แอปพลิเคชันที่ใช้การแปล) ตัวแปร 2 (ชื่อจำลอง) a, unused, unused = foo() (ไม่น่าสนใจมากฉันคิดว่าเหมือนกันไปสำหรับชื่ออื่น ๆ เช่นdummy) ตัวแปร 3 (ดัชนี) a = foo()[0] (สำหรับฉัน()[0]ภาพลักษณ์ที่ไม่ไพเราะ…)

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