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

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

10
มีชื่อสำหรับรูปแบบ (ต่อต้าน -) ของพารามิเตอร์การส่งผ่านที่จะใช้หลายระดับลึกในสายการโทรหรือไม่
ฉันพยายามหาทางเลือกในการใช้ตัวแปรทั่วโลกในรหัสดั้งเดิม แต่คำถามนี้ไม่เกี่ยวกับทางเลือกทางเทคนิคผมส่วนใหญ่กังวลเกี่ยวกับคำศัพท์ ทางออกที่ชัดเจนคือการส่งผ่านพารามิเตอร์เข้าสู่ฟังก์ชั่นแทนที่จะใช้โกลบอล ใน codebase ดั้งเดิมนี้หมายความว่าฉันต้องเปลี่ยนฟังก์ชั่นทั้งหมดในสายโซ่ยาวระหว่างจุดที่จะใช้ค่าในที่สุดและฟังก์ชั่นที่ได้รับพารามิเตอร์ก่อน higherlevel(newParam)->level1(newParam)->level2(newParam)->level3(newParam) newParamก่อนหน้านี้ซึ่งเคยเป็นตัวแปรทั่วโลกในตัวอย่างของฉัน แต่มันอาจเป็นค่าฮาร์ดโค้ดที่ก่อนหน้านี้แทน ประเด็นก็คือว่าตอนนี้ค่าของ newParam จะได้รับที่higherlevel()และมีการ "เดินทาง" level3()ทุกวิธีการ ฉันสงสัยว่ามีชื่อ (s)สำหรับสถานการณ์ / รูปแบบเช่นนี้ซึ่งคุณต้องเพิ่มพารามิเตอร์ในฟังก์ชั่นมากมายที่เพียงแค่ "ส่ง" ค่าที่ไม่เปลี่ยนแปลง หวังว่าการใช้คำศัพท์ที่เหมาะสมจะช่วยให้ฉันค้นหาทรัพยากรเพิ่มเติมเกี่ยวกับโซลูชันสำหรับการออกแบบใหม่และอธิบายสถานการณ์นี้ให้เพื่อนร่วมงานทราบ

5
อะไรคือนิสัยที่ดีในการออกแบบอาร์กิวเมนต์บรรทัดคำสั่ง
ขณะพัฒนาแอปพลิเคชันฉันเริ่มสงสัย - ฉันควรออกแบบอาร์กิวเมนต์บรรทัดคำสั่งได้อย่างไร จำนวนมากของโปรแกรมที่ใช้สูตรเช่นนี้หรือ-argument value วิธีการแก้ปัญหาที่เข้ามาอยู่ในใจของผมก็คือ/argument value argument:valueฉันคิดว่ามันดีเพราะไม่มีช่องว่างสีขาวไม่มีทางที่ค่าและการขัดแย้งสามารถทำให้ยุ่งเหยิงได้ นอกจากนี้ยังเป็นการง่ายที่จะแยกสตริงออกเป็นสอง:อักขระจากอักขระตัวแรกทางซ้าย คำถามของฉันคือ: -argument valueสูตรยอดนิยมนั้นดีกว่าargument:value(อ่านง่ายขึ้นเขียนง่ายขึ้นไร้ข้อผิดพลาดเข้าใจง่ายขึ้นโดยนักพัฒนาผู้เชี่ยวชาญ) หรือไม่ มีกฎที่รู้จักกันทั่วไปซึ่งฉันควรปฏิบัติตามในขณะที่ออกแบบอาร์กิวเมนต์บรรทัดคำสั่ง (นอกเหนือจากถ้ามันทำงานมันเป็น OK)? ขอรายละเอียดเพิ่มเติมฉันจะให้มัน อย่างไรก็ตามฉันคิดว่าพวกเขาไม่ควรส่งผลกระทบต่อคำตอบ คำถามเกี่ยวกับนิสัยที่ดีโดยทั่วไป ฉันคิดว่ามันเหมือนกันสำหรับแอปพลิเคชันทุกประเภท เรากำลังทำงานกับแอปพลิเคชั่นที่จะใช้ในสถานที่สาธารณะ (touch totems, table) แอปพลิเคชันเขียนโดยใช้ Qt Quick 5 (C ++, QML, JS) อุปกรณ์จะติดตั้ง Windows 8.1 / 10 เราจะให้ส่วนต่อประสานส่วนหน้าเพื่อจัดการอุปกรณ์ อย่างไรก็ตามผู้ดูแลระบบขั้นสูงบางรายอาจต้องการกำหนดค่าแอปพลิเคชันด้วยตนเอง มันไม่สำคัญมากนักจากธุรกิจ แต่เป็นเพราะฉันเห็นด้วยกับสิ่งที่Kilian Fothบอกว่าฉันไม่ต้องการให้ใบสมัครของฉันเจ็บปวดสำหรับผู้ใช้ ไม่พบในอินเทอร์เน็ตสิ่งที่ฉันต้องการฉันถามที่นี่ สำหรับผู้ใช้ Stack Exchange ขั้นสูง: ฉันต้องการให้คำถามนี้เป็นเรื่องทั่วไป บางทีอาจมีคุณสมบัติเป็น wiki …
190 design  parameters  cli 

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

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

10
เราควรหลีกเลี่ยงวัตถุที่กำหนดเองเป็นพารามิเตอร์?
สมมติว่าฉันมีวัตถุที่กำหนดเองนักเรียน : public class Student{ public int _id; public String name; public int age; public float score; } และคลาส, หน้าต่างที่ใช้เพื่อแสดงข้อมูลของนักเรียน : public class Window{ public void showInfo(Student student); } มันดูค่อนข้างปกติ แต่ฉันพบว่าWindowนั้นไม่ง่ายที่จะทำการทดสอบเป็นรายบุคคลเพราะมันต้องการออบเจ็กต์Studentจริงเพื่อเรียกใช้ฟังก์ชัน ดังนั้นฉันจึงพยายามปรับเปลี่ยน showInfo เพื่อที่จะไม่ยอมรับวัตถุนักเรียนโดยตรง: public void showInfo(int _id, String name, int age, float score); เพื่อให้ง่ายต่อการทดสอบหน้าต่างแยกต่างหาก: showInfo(123, "abc", 45, 6.7); แต่ฉันพบว่าเวอร์ชันที่แก้ไขมีปัญหาอื่น: …

7
การใช้ชื่อพารามิเตอร์ที่แตกต่างจากชื่อประเภทเท่านั้นโดยปลอกถือเป็นแนวทางปฏิบัติที่ไม่ดีใน C #?
ฉันเห็นคำถามที่คล้ายกับเรื่องนี้เกี่ยวกับชื่อพารามิเตอร์ที่ตรงกับคุณสมบัติในคลาส แต่ฉันไม่พบสิ่งใดเกี่ยวกับการใช้ชื่อพารามิเตอร์ที่เหมือนกับชื่อประเภทพารามิเตอร์ยกเว้นการใส่ใน C # ดูเหมือนจะไม่เป็นการละเมิดที่ฉันสามารถหาได้ แต่มันถือว่าเป็นการปฏิบัติที่ไม่ดี ตัวอย่างเช่นฉันมีวิธีการดังต่อไปนี้ public Range PadRange(Range range) {} วิธีนี้ใช้ช่วงและส่งกลับช่วงใหม่ที่มีการเติมเต็มบางส่วน ดังนั้นด้วยบริบททั่วไปฉันไม่สามารถนึกถึงชื่อที่อธิบายเพิ่มเติมสำหรับพารามิเตอร์ได้ อย่างไรก็ตามฉันระลึกถึงปลายที่ฉันหยิบขึ้นมาเมื่ออ่านรหัสสมบูรณ์เกี่ยวกับ "ระยะทางทางจิตวิทยา" มันบอกว่า ระยะทางทางจิตวิทยาสามารถกำหนดได้ว่าเป็นความง่ายในการแยกความแตกต่างของสองรายการ ... เมื่อคุณดีบั๊กให้พร้อมสำหรับปัญหาที่เกิดจากระยะห่างทางจิตใจไม่เพียงพอระหว่างชื่อตัวแปรที่คล้ายกันและระหว่างชื่อรูทีนที่คล้ายกัน ในขณะที่คุณสร้างรหัสให้เลือกชื่อที่มีความแตกต่างมากเพื่อให้คุณสามารถหลีกเลี่ยงปัญหาได้ ลายเซ็นวิธีการของฉันมี "ช่วง" มากมายเกิดขึ้นดังนั้นจึงรู้สึกว่ามันอาจเป็นปัญหาเกี่ยวกับระยะห่างทางจิตวิทยานี้ ตอนนี้ฉันเห็นนักพัฒนาหลายคนทำต่อไปนี้ public Range PadRange(Range myRange) {} โดยส่วนตัวฉันมีความไม่พอใจที่แข็งแกร่งสำหรับการประชุมครั้งนี้ การเพิ่มคำนำหน้า "ของฉัน" ไปยังชื่อตัวแปรไม่มีบริบทเพิ่มเติม ฉันยังเห็นดังต่อไปนี้ public Range PadRange(Range rangeToPad) {} ฉันชอบสิ่งนี้ดีกว่าส่วนนำหน้า "ของฉัน" แต่ก็ยังไม่สนใจโดยรวม มันรู้สึก verbose มากเกินไปสำหรับฉันและอ่านอย่างเชื่องช้าเป็นชื่อตัวแปร สำหรับฉันมันเป็นที่เข้าใจกันดีว่าช่วงนั้นจะถูกเพิ่มเนื่องจากชื่อเมธอด ดังนั้นเมื่อทั้งหมดนี้ออกมาอุทรของฉันคือการได้ไปกับลายเซ็นแรก สำหรับฉันมันสะอาด ไม่จำเป็นต้องบังคับบริบทเมื่อไม่จำเป็น …

9
ฉันควรยอมรับคอลเลกชันที่ว่างเปล่าในวิธีการของฉันที่ทำซ้ำมากกว่าพวกเขา
ฉันมีวิธีการที่ตรรกะทั้งหมดจะดำเนินการภายในวง foreach ที่ iterates มากกว่าพารามิเตอร์ของวิธีการ: public IEnumerable<TransformedNode> TransformNodes(IEnumerable<Node> nodes) { foreach(var node in nodes) { // yadda yadda yadda yield return transformedNode; } } ในกรณีนี้การส่งคอลเล็กชันว่างเปล่าจะส่งผลให้เกิดคอลเล็กชันที่ว่างเปล่า แต่ฉันสงสัยว่ามันไม่ฉลาด ตรรกะของฉันที่นี่คือถ้าใครบางคนกำลังเรียกวิธีนี้พวกเขาตั้งใจจะส่งผ่านข้อมูลและจะส่งเฉพาะคอลเลกชันที่ว่างเปล่าไปยังวิธีการของฉันในสถานการณ์ที่ผิดพลาด ฉันควรจะตรวจจับพฤติกรรมนี้และทิ้งข้อยกเว้นไว้หรือเป็นวิธีที่ดีที่สุดในการส่งคืนคอลเลกชันที่ว่างเปล่า?

13
การใช้พารามิเตอร์บูลีนผิดพลาดหรือไม่
ตามที่มันเป็นความผิดที่จะใช้พารามิเตอร์แบบบูลเพื่อตรวจสอบพฤติกรรม? ฉันรู้ถึงความสำคัญของการหลีกเลี่ยงการใช้พารามิเตอร์บูลีนเพื่อกำหนดพฤติกรรมเช่น: รุ่นเดิม public void setState(boolean flag){ if(flag){ a(); }else{ b(); } c(); } เวอร์ชั่นใหม่: public void setStateTrue(){ a(); c(); } public void setStateFalse(){ b(); c(); } แต่วิธีการเกี่ยวกับกรณีที่พารามิเตอร์บูลีนจะใช้ในการกำหนดค่าแทนพฤติกรรม? เช่น: public void setHint(boolean isHintOn){ this.layer1.visible=isHintOn; this.layer2.visible=!isHintOn; this.layer3.visible=isHintOn; } ฉันกำลังพยายามกำจัดการตั้งค่าสถานะ isHintOn และสร้าง 2 ฟังก์ชันที่แยกกัน: public void setHintOn(){ this.layer1.visible=true; this.layer2.visible=false; this.layer3.visible=true; } public …

2
ทำไมเมธอดที่รับพารามิเตอร์ไม่ จำกัด จำนวนมักกำหนดโอเวอร์โหลดด้วยพารามิเตอร์ที่น้อยลง
ตัวอย่างเช่นSystem.IO.Path.Combineวิธีการใน. NET มีการโอเวอร์โหลดดังต่อไปนี้: Combine(params String[]) Combine(String, String) Combine(String, String, String) Combine(String, String, String, String) จุดสามจุดสุดท้ายคืออะไร? คนแรกจะครอบคลุมพวกเขาทั้งหมดราวกับว่าคุณดูอย่างใกล้ชิดมันใช้paramsคำหลัก อาร์กิวเมนต์ของความเข้ากันได้ย้อนหลังจะครอบคลุมเฉพาะCombine(String, String)ตัวแปรเนื่องจากเป็นรุ่นเดียวจนถึง. NET 4

9
วิธีตั้งชื่อเมธอดที่ทั้งสองทำงานและส่งคืนบูลีนเป็นสถานะได้อย่างไร?
หากมีวิธีการ bool DoStuff() { try { // doing stuff... return true; } catch (SomeSpecificException ex) { return false; } } มันควรจะถูกเรียกว่าค่อนข้างIsStuffDone()? ผู้ใช้ทั้งสองชื่ออาจตีความผิด: หากชื่อเป็นDoStuff()สาเหตุว่าทำไมจึงส่งคืนบูลีน หากชื่อIsStuffDone()ไม่ชัดเจนว่าวิธีการทำงานหรือตรวจสอบผลของมันเท่านั้น มีแบบแผนสำหรับกรณีนี้หรือไม่? หรือวิธีการอื่นเป็นวิธีนี้ถือว่ามีข้อบกพร่อง? ยกตัวอย่างเช่นในภาษาที่มีพารามิเตอร์ที่ส่งออกเช่น C # voidตัวแปรสถานะบูลีนอาจจะส่งผ่านไปยังวิธีการที่เป็นหนึ่งและประเภทผลตอบแทนของวิธีการที่จะเป็น แก้ไข: ในการจัดการข้อยกเว้นปัญหาเฉพาะของฉันไม่สามารถมอบหมายโดยตรงไปยังผู้โทรเพราะวิธีการเป็นส่วนหนึ่งของการใช้อินเตอร์เฟซ ดังนั้นผู้เรียกไม่สามารถเรียกเก็บเงินกับการจัดการกับข้อยกเว้นทั้งหมดของการใช้งานที่แตกต่างกัน ไม่คุ้นเคยกับข้อยกเว้นเหล่านั้น แต่โทรสามารถจัดการกับข้อยกเว้นที่กำหนดเองเช่นStuffHasNotBeenDoneForSomeReasonExceptionเป็นได้รับการแนะนำในคำตอบของ npinti และแสดงความคิดเห็น

3
พารามิเตอร์ทางเลือกหรือตัวสร้างที่มากเกินไป
ฉันกำลังดำเนินการDelegateCommandและเมื่อฉันกำลังจะใช้ตัวสร้างฉันจะมาพร้อมกับสองตัวเลือกการออกแบบต่อไปนี้: 1: มีตัวสร้างโอเวอร์โหลดหลายตัว public DelegateCommand(Action<T> execute) : this(execute, null) { } public DelegateCommand(Action<T> execute, Func<T, bool> canExecute) { this.execute = execute; this.canExecute = canExecute; } 2: มีคอนสตรัคเตอร์เดียวเท่านั้นที่มีพารามิเตอร์เป็นตัวเลือก public DelegateCommand(Action<T> execute, Func<T, bool> canExecute = null) { this.execute = execute; this.canExecute = canExecute; } ฉันไม่รู้ว่าจะใช้อันไหนเพราะฉันไม่รู้ว่าข้อดี / ข้อเสียที่เป็นไปได้มาจากวิธีใดวิธีหนึ่งจากสองวิธีที่เสนอ ทั้งสองสามารถถูกเรียกเช่นนี้: var command = …

3
ทำไมไม่ใส่คำอธิบายประกอบพารามิเตอร์ฟังก์ชั่น?
เพื่อให้คำถามนี้ตอบได้สมมติว่าค่าใช้จ่ายของความคลุมเครือในใจของโปรแกรมเมอร์นั้นแพงกว่าการกดแป้นพิเศษเล็กน้อย ระบุว่าทำไมฉันจะอนุญาตให้เพื่อนร่วมทีมของฉันหนีไปโดยไม่ใส่หมายเหตุประกอบพารามิเตอร์ฟังก์ชันของพวกเขา ใช้โค้ดต่อไปนี้เป็นตัวอย่างของสิ่งที่อาจเป็นโค้ดที่ซับซ้อนกว่านี้: let foo x y = x + y ตอนนี้การตรวจสอบอย่างรวดเร็วของคำแนะนำเครื่องมือจะแสดงให้คุณเห็นว่า F # ได้พิจารณาแล้วว่าคุณต้องการให้ x และ y เป็น ints ถ้านั่นคือสิ่งที่คุณตั้งใจไว้ทุกอย่างก็ดี แต่ฉันไม่รู้ว่านั่นคือสิ่งที่คุณต้องการหรือไม่ จะเกิดอะไรขึ้นถ้าคุณสร้างรหัสนี้เพื่อเชื่อมสองสายเข้าด้วยกัน หรือถ้าฉันคิดว่าคุณอาจหมายถึงการเพิ่มคู่? หรือถ้าฉันไม่ต้องการเลื่อนเมาส์ไปเหนือพารามิเตอร์ฟังก์ชันทุกตัวเพื่อกำหนดประเภทของมัน ตอนนี้ใช้ตัวอย่างนี้: let foo x y = "result: " + x + y ตอนนี้ F # สมมติว่าคุณตั้งใจจะเชื่อมสตริงดังนั้น x และ y จึงถูกนิยามเป็นสตริง อย่างไรก็ตามในฐานะที่เป็น schmuck ที่ไม่ดีที่รักษารหัสของคุณฉันอาจดูที่นี่และสงสัยว่าบางทีคุณอาจต้องการเพิ่ม x และ …
28 f#  parameters 

7
ระบุชื่อพารามิเตอร์ทางเลือกแม้ว่าจะไม่จำเป็นก็ตาม?
พิจารณาวิธีการต่อไปนี้: public List<Guid> ReturnEmployeeIds(bool includeManagement = false) { } และสายต่อไปนี้: var ids = ReturnEmployeeIds(true); สำหรับนักพัฒนาใหม่สำหรับระบบมันค่อนข้างยากที่จะคาดเดาสิ่งที่trueทำ สิ่งแรกที่คุณต้องทำคือวางเม้าส์เหนือชื่อเมธอดหรือไปที่คำจำกัดความ (ซึ่งไม่ได้เป็นงานใหญ่เลยแม้แต่น้อย) แต่เพื่อประโยชน์ในการอ่านมันทำให้รู้สึกถึงการเขียน: var ids = ReturnEmployeeIds(includeManagement: true); มีที่ไหนที่อย่างเป็นทางการกล่าวถึงว่าจะระบุพารามิเตอร์ทางเลือกอย่างชัดเจนหรือไม่เมื่อคอมไพเลอร์ไม่ต้องการให้คุณ? บทความต่อไปนี้กล่าวถึงข้อตกลงการเข้ารหัสบางอย่าง: https://msdn.microsoft.com/en-gb/library/ff926074.aspx สิ่งที่คล้ายกับบทความข้างต้นจะดีมาก

5
อาร์กิวเมนต์หลายตัวในการเรียกใช้ฟังก์ชันเทียบกับอาร์เรย์เดียว
ฉันมีฟังก์ชั่นที่ใช้ในชุดของพารามิเตอร์จากนั้นนำไปใช้กับพวกเขาเป็นเงื่อนไขในแบบสอบถาม SQL อย่างไรก็ตามในขณะที่ฉันชอบอาร์เรย์อาร์กิวเมนต์เดียวที่มีเงื่อนไขตัวเอง: function searchQuery($params = array()) { foreach($params as $param => $value) { switch ($param) { case 'name': $query->where('name', $value); break; case 'phone': $query->join('phone'); $query->where('phone', $value); break; } } } เพื่อนร่วมงานของฉันต้องการแสดงรายการอาร์กิวเมนต์ทั้งหมดแทนอย่างชัดเจน: function searchQuery($name = '', $phone = '') { if ($name) { $query->where('name', $value); } if ($phone) { $query->join('phone'); …

6
ควรมีวิธีการให้อภัยเมื่อมีข้อโต้แย้งที่ผ่านเข้ามาหรือไม่? [ปิด]
ปิด คำถามนี้จะต้องมีมากขึ้นมุ่งเน้น ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้มุ่งเน้นที่ปัญหาเดียวโดยแก้ไขโพสต์นี้ ปิดให้บริการใน4 ปีที่แล้ว สมมติว่าเรามีวิธีการfoo(String bar)ที่ทำงานบนสตริงที่ตรงกับเกณฑ์บางอย่างเท่านั้น [a-z0-9-_./@]+ตัวอย่างเช่นมันจะต้องเป็นตัวพิมพ์เล็กต้องไม่ว่างเปล่าหรือมีเพียงช่องว่างและต้องตรงกับรูปแบบ เอกสารประกอบสำหรับวิธีการระบุเกณฑ์เหล่านี้ วิธีการที่ควรปฏิเสธการเบี่ยงเบนใด ๆ และทั้งหมดจากเกณฑ์นี้หรือวิธีการควรให้อภัยมากขึ้นเกี่ยวกับเกณฑ์บางอย่าง? ตัวอย่างเช่นถ้าวิธีการเริ่มต้นคือ public void foo(String bar) { if (bar == null) { throw new IllegalArgumentException("bar must not be null"); } if (!bar.matches(BAR_PATTERN_STRING)) { throw new IllegalArgumentException("bar must match pattern: " + BAR_PATTERN_STRING); } this.bar = bar; } …
21 java  parameters 

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