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

Function คือบล็อกของรหัสที่ทำหน้าที่เฉพาะ

16
เจ้านายของฉันขอให้ฉันหยุดเขียนฟังก์ชั่นเล็ก ๆ และทำทุกอย่างในลูปเดียวกัน
ฉันอ่านหนังสือชื่อClean Codeของ Robert C. Martin แล้ว ในหนังสือเล่มนี้ฉันได้เห็นวิธีการมากมายในการทำความสะอาดโค้ดเช่นการเขียนฟังก์ชั่นเล็ก ๆ การเลือกชื่ออย่างระมัดระวัง ฯลฯ ดูเหมือนว่าหนังสือที่น่าสนใจที่สุดเกี่ยวกับรหัสที่ฉันอ่าน อย่างไรก็ตามวันนี้เจ้านายของฉันไม่ชอบวิธีที่ฉันเขียนโค้ดหลังจากอ่านหนังสือเล่มนี้ ข้อโต้แย้งของเขาคือ การเขียนฟังก์ชั่นเล็ก ๆ เป็นความเจ็บปวดเพราะมันบังคับให้คุณย้ายเข้าไปในฟังก์ชั่นเล็ก ๆ แต่ละอันเพื่อดูว่าโค้ดกำลังทำอะไรอยู่ ใส่ทุกอย่างไว้ในลูปหลักหลักแม้ว่าลูปหลักจะมีมากกว่า 300 บรรทัดมันจะอ่านเร็วขึ้น เขียนฟังก์ชั่นเล็ก ๆ เท่านั้นหากคุณต้องทำซ้ำรหัส อย่าเขียนฟังก์ชั่นที่มีชื่อของความคิดเห็นใส่รหัสบรรทัดที่ซับซ้อนของคุณ (3-4 บรรทัด) ด้วยความคิดเห็นด้านบน คุณสามารถแก้ไขโค้ดที่ล้มเหลวได้เช่นเดียวกัน สิ่งนี้ขัดต่อทุกสิ่งที่ฉันอ่าน ปกติคุณเขียนรหัสได้อย่างไร หนึ่งวงใหญ่หลักไม่มีฟังก์ชั่นเล็ก ๆ ? ภาษาที่ฉันใช้ส่วนใหญ่เป็นจาวาสคริปต์ ตอนนี้ฉันมีปัญหาในการอ่านเนื่องจากฉันได้ลบฟังก์ชั่นที่ตั้งชื่อไว้อย่างชัดเจนแล้วนำทุกอย่างมารวมกันเป็นวงใหญ่ อย่างไรก็ตามเจ้านายของฉันชอบวิธีนี้ ตัวอย่างหนึ่งคือ: // The way I would write it if (isApplicationInProduction(headers)) { phoneNumber = …

11
ฟังก์ชั่นหนึ่งบรรทัดที่เรียกว่าครั้งเดียวเท่านั้น
พิจารณาฟังก์ชั่นแบบไม่มีพารามิเตอร์ ( แก้ไข:ไม่จำเป็น) ที่ดำเนินการรหัสบรรทัดเดียวและถูกเรียกเพียงครั้งเดียวในโปรแกรม (แม้ว่าจะเป็นไปไม่ได้ที่จะต้องใช้อีกครั้งในอนาคต) มันสามารถทำการสืบค้นตรวจสอบค่าบางอย่างทำบางสิ่งที่เกี่ยวข้องกับ regex ... อะไรที่คลุมเครือหรือ "แฮ็ค" เหตุผลเบื้องหลังสิ่งนี้คือการหลีกเลี่ยงการประเมินที่อ่านยาก: if (getCondition()) { // do stuff } ซึ่งgetCondition()เป็นฟังก์ชั่นหนึ่งบรรทัด คำถามของฉันคือ: นี่เป็นการปฏิบัติที่ดีหรือไม่? ดูเหมือนจะไม่เป็นไรสำหรับฉัน แต่ฉันไม่รู้เกี่ยวกับระยะยาว ...
120 functions 

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

15
เมื่อใดจึงควรปรับให้เหมาะสมสำหรับหน่วยความจำและประสิทธิภาพความเร็วสำหรับวิธีการ?
ฉันเพิ่งสัมภาษณ์ที่อเมซอน ในระหว่างเซสชันการเข้ารหัสผู้สัมภาษณ์ถามว่าทำไมฉันถึงประกาศตัวแปรในวิธีหนึ่ง ฉันอธิบายกระบวนการของฉันและเขาท้าทายให้ฉันแก้ปัญหาเดียวกันโดยมีตัวแปรน้อยลง ยกตัวอย่างเช่น (นี่คือไม่ได้มาจากการสัมภาษณ์) ผมเริ่มต้นด้วยวิธี A:แล้วดีขึ้นก็จะวิธีการ Bint sโดยการเอา เขายินดีและกล่าวว่าวิธีนี้จะลดการใช้หน่วยความจำด้วยวิธีนี้ ฉันเข้าใจตรรกะเบื้องหลัง แต่คำถามของฉันคือ: เมื่อใดจึงเหมาะสมที่จะใช้วิธี A กับวิธี B และในทางกลับกัน คุณจะเห็นว่าA วิธีการที่เป็นไปได้ใช้หน่วยความจำที่สูงขึ้นเนื่องจากint sมีการประกาศ a + bแต่มันเท่านั้นที่มีการดำเนินการอย่างใดอย่างหนึ่งในการคำนวณคือ ในทางกลับกันวิธีการ Bมีการใช้หน่วยความจำลดลง แต่ต้องทำการคำนวณa + bสองครั้งคือสองครั้ง ฉันจะใช้เทคนิคหนึ่งเหนือเทคนิคอื่นได้อย่างไร หรือเป็นหนึ่งในเทคนิคที่ต้องการมากกว่าเสมอ? สิ่งที่ต้องพิจารณาเมื่อประเมินทั้งสองวิธีมีอะไรบ้าง วิธี A: private bool IsSumInRange(int a, int b) { int s = a + b; if (s > 1000 …

6
คำสำหรับฟังก์ชั่นที่เรียกซ้ำหลายครั้งจะมีผลเช่นเดียวกับการโทรครั้งเดียว?
(สมมติว่ามีสภาพแวดล้อมแบบเธรดเดียว) ฟังก์ชั่นที่ตอบสนองเกณฑ์นี้คือ: bool MyClass::is_initialized = false; void MyClass::lazy_initialize() { if (!is_initialized) { initialize(); //Should not be called multiple times is_initialized = true; } } ในสาระสำคัญฉันสามารถเรียกใช้ฟังก์ชั่นนี้ได้หลายครั้งและไม่ต้องกังวลกับการเริ่มทำงานMyClassหลายครั้ง ฟังก์ชันที่ไม่เป็นไปตามเกณฑ์นี้อาจเป็น: Foo* MyClass::ptr = NULL; void initialize() { ptr = new Foo(); } การโทรinitialize()หลายครั้งจะทำให้หน่วยความจำรั่ว แรงจูงใจ มันจะดีถ้ามีคำสั้น ๆ เพื่ออธิบายพฤติกรรมนี้เพื่อให้ฟังก์ชั่นที่คาดว่าจะได้พบกับเกณฑ์นี้สามารถแสดงความคิดเห็นได้อย่างถูกต้อง (โดยเฉพาะอย่างยิ่งมีประโยชน์เมื่ออธิบายฟังก์ชั่นอินเตอร์เฟสที่คาดว่าจะถูกแทนที่)
96 naming  functions 

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

5
ทำไมต้องเก็บฟังก์ชั่นภายในพจนานุกรมหลาม?
ฉันเป็นผู้เริ่มต้นงูใหญ่และฉันเพิ่งเรียนรู้เทคนิคที่เกี่ยวข้องกับพจนานุกรมและฟังก์ชั่น ไวยากรณ์เป็นเรื่องง่ายและดูเหมือนว่าเป็นเรื่องเล็กน้อย แต่ความรู้สึกของฉันหลามรู้สึกเสียวซ่า มีบางอย่างบอกฉันว่านี่เป็นแนวคิดที่ลึกและไพเราะมากและฉันก็ไม่เข้าใจถึงความสำคัญของมัน ใครสามารถใส่ชื่อให้กับเทคนิคนี้และอธิบายว่ามันมีประโยชน์หรือไม่? เทคนิคคือเมื่อคุณมีพจนานุกรมไพ ธ อนและฟังก์ชั่นที่คุณตั้งใจจะใช้ คุณแทรกองค์ประกอบพิเศษลงใน dict ที่มีค่าเป็นชื่อของฟังก์ชั่น เมื่อคุณพร้อมที่จะเรียกฟังก์ชั่นที่คุณออกโทรทางอ้อมโดยอ้างถึงองค์ประกอบ Dict ไม่ใช่ฟังก์ชั่นตามชื่อ ตัวอย่างที่ฉันใช้งานมาจาก Learn Python the Hard Way, 2nd Ed (นี่เป็นรุ่นที่มีให้เมื่อคุณสมัครใช้งานผ่านUdemy.comแต่น่าเสียดายที่เวอร์ชัน HTML ที่ใช้งานได้ฟรีปัจจุบันเป็น Ed 3 และไม่มีตัวอย่างนี้อีกต่อไป) ในการถอดความ: # make a dictionary of US states and major cities cities = {'San Diego':'CA', 'New York':'NY', 'Detroit':'MI'} # define a function …

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

10
การใช้คอมไพเลอร์ C ++ เป็นเพียงการปฏิบัติที่เกินความจำเป็นหรือไม่
ดังนั้นฉันจึงทำงานเกี่ยวกับการออกแบบซอฟต์แวร์โดยใช้ C สำหรับโปรเซสเซอร์บางตัว ชุดเครื่องมือประกอบด้วยความสามารถในการคอมไพล์ C และ C ++ สำหรับสิ่งที่ฉันทำไม่มีการจัดสรรหน่วยความจำแบบไดนามิกในสภาพแวดล้อมนี้และโปรแกรมโดยรวมค่อนข้างง่าย ไม่ต้องพูดถึงว่าอุปกรณ์มีพลังประมวลผลหรือทรัพยากรเกือบไม่ ไม่จำเป็นต้องใช้ C ++ ใด ๆ เลย ที่ถูกกล่าวว่ามีไม่กี่สถานที่ที่ฉันทำฟังก์ชั่นมากไป (คุณสมบัติของ C ++) ฉันต้องการส่งข้อมูลประเภทต่าง ๆ และไม่รู้สึกอยากใช้printfการจัดรูปแบบสไตล์กับ%sอาร์กิวเมนต์ (หรืออะไรก็ตาม) บางประเภท ฉันเคยเห็นบางคนที่ไม่สามารถเข้าถึงคอมไพเลอร์ C ++ ที่ทำprintfสิ่งนี้ได้ แต่ในกรณีของฉันรองรับ C ++ พร้อมใช้งาน ตอนนี้ฉันแน่ใจว่าฉันอาจได้รับคำถามว่าทำไมฉันต้องโอเวอร์โหลดฟังก์ชันเพื่อเริ่มต้นด้วย ดังนั้นฉันจะพยายามตอบตอนนี้ ฉันต้องส่งข้อมูลประเภทต่าง ๆ ออกจากพอร์ตอนุกรมดังนั้นฉันจึงมีข้อมูลเกินจำนวนเล็กน้อยที่ส่งประเภทข้อมูลต่อไปนี้: unsigned char* const char* unsigned char const char ฉันแค่ไม่อยากมีวิธีการหนึ่งที่จัดการกับสิ่งเหล่านี้ทั้งหมด เมื่อฉันเรียกใช้ฟังก์ชั่นที่ฉันต้องการให้มันส่งออกพอร์ตอนุกรมฉันไม่มีทรัพยากรมากมายดังนั้นฉันจึงไม่ต้องการที่จะทำอะไรเลยนอกจากการส่งสัญญาณของฉัน มีคนอื่นเห็นโปรแกรมของฉันและถามฉันว่า "ทำไมคุณถึงใช้ไฟล์ …

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

9
คุณควรป้องกันค่าที่ไม่คาดคิดจาก API ภายนอกหรือไม่
ช่วยบอกว่าคุณมีการเข้ารหัสฟังก์ชั่นที่ต้องใช้ข้อมูลจาก MyAPIAPI ที่ภายนอก ที่ภายนอก API MyAPIมีสัญญาที่ระบุว่ามันจะกลับมาได้หรือstringnumber มันคือการแนะนำเพื่อป้องกันสิ่งที่ชอบnull, undefined, booleanฯลฯ แม้ว่ามันจะไม่ได้เป็นส่วนหนึ่งของ API ของMyAPI? โดยเฉพาะอย่างยิ่งเนื่องจากคุณไม่สามารถควบคุม API นั้นคุณไม่สามารถรับประกันผ่านการวิเคราะห์ประเภทแบบคงที่ดังนั้นจะปลอดภัยกว่าขออภัยหรือไม่ ฉันกำลังคิดเกี่ยวกับหลักการความแข็งแกร่ง

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

5
ฉันควรใส่ฟังก์ชั่นที่ไม่เกี่ยวข้องกับคลาสได้ที่ไหน
ฉันกำลังทำงานในโครงการ C ++ ที่ฉันมีฟังก์ชั่นทางคณิตศาสตร์มากมายซึ่งตอนแรกฉันเขียนเพื่อใช้เป็นส่วนหนึ่งของชั้นเรียน ถึงแม้ว่าฉันจะเขียนโค้ดเพิ่มเติม แต่ฉันก็ตระหนักว่าฉันต้องการฟังก์ชันคณิตศาสตร์เหล่านี้ทุกที่ สถานที่ที่ดีที่สุดที่จะนำพวกเขาอยู่ที่ไหน สมมติว่าฉันมีสิ่งนี้: class A{ public: int math_function1(int); ... } และเมื่อฉันเขียนชั้นเรียนอื่นฉันไม่สามารถ (หรืออย่างน้อยฉันไม่รู้วิธี) ที่ใช้math_function1ในชั้นเรียนอื่นนั้น นอกจากนี้ฉันได้ตระหนักถึงฟังก์ชั่นบางอย่างที่ไม่เกี่ยวข้องกับคลาส A พวกเขาดูเหมือนจะเป็นจุดเริ่มต้น แต่ตอนนี้ฉันสามารถเห็นได้ว่าพวกเขาเป็นเพียงฟังก์ชันทางคณิตศาสตร์ การปฏิบัติที่ดีในสถานการณ์นี้คืออะไร? ตอนนี้ฉันได้คัดลอกพวกเขาไปสู่คลาสใหม่ซึ่งฉันแน่ใจว่าเป็นการปฏิบัติที่แย่ที่สุด
47 c++  functions  class 

3
บูลีนการตั้งชื่อวิธียืนยันและเชิงลบ
วิธีการบูลีนควรใช้รูปแบบการยืนยันเสมอแม้ว่าจะใช้ในรูปแบบเชิงลบหรือไม่? สมมติว่าฉันต้องการตรวจสอบว่ามีเอนทิตีอยู่ก่อนสร้างหนึ่งหรือไม่อาร์กิวเมนต์ของฉันคือว่ารูปแบบแรกด้านล่างดีกว่ารูปแบบที่สองไม่ว่าจะใช้วิธีการนี้ในรูปแบบที่ยืนยันหรือไม่ โดยสรุปผมหาอ่านได้ง่ายขึ้นกว่าif(!affirmative) if(negative)ฉันมีเพื่อนร่วมงานที่ไม่เห็นด้วยความคิดเหรอ? แบบฟอร์มแรก: int entity_id = 42; if(!entity_exists(entity_id)) create_entity(entity_id); แบบฟอร์มที่สอง: int entity_id = 42; if(entity_not_exist(entity_id)) create_entity(entity_id);
43 naming  functions 

8
เริ่มต้นประโยคด้วยชื่อฟังก์ชั่นหรือไม่? [ปิด]
บางครั้งในขณะที่พิมพ์บางสิ่งบางอย่างที่เกี่ยวข้องกับภาษาการเขียนโปรแกรมเล็ก ๆ น้อย ๆ ฉันจะเริ่มต้นประโยคด้วยชื่อฟังก์ชั่น ตอนนี้กฎของรัฐอังกฤษว่าคำแรกในประโยคจะต้องเป็นตัวพิมพ์ใหญ่; แม้ว่าชื่อฟังก์ชันจะเป็นตัวพิมพ์เล็ก หากคุณสงสัยว่าสิ่งใดที่ฉันสามารถบอกได้ว่าจะส่งผลให้คำแรกเป็นชื่อฟังก์ชั่นใช้ตัวอย่างนี้: การใช้ Fread ของคุณใช้งานไม่ได้ fread ต้องการคืนจำนวนไบต์ที่อ่าน ฉันเข้าใจว่าฉันสามารถเปลี่ยนอินสแตนซ์ที่สองของfreadให้เป็นมันได้แต่ฉันต้องการทราบวิธีที่ดีที่สุดในการจัดการกับสิ่งอื่นนอกเหนือจากการเขียนประโยคใหม่ ฉันควรใช้ชื่อฟังก์ชันเป็นตัวพิมพ์ใหญ่หรือไม่ วิธีเดียวที่ฉันอยากจะได้ยิน "เขียนประโยคใหม่" เป็นคำตอบก็คือถ้าเริ่มต้นประโยคด้วยชื่อฟังก์ชั่นละเมิดกฎภาษาอังกฤษบางอย่างที่ฉันไม่ทราบ แก้ไข: ฉันขอบคุณทุกคนสำหรับคำตอบเหล่านี้ พวกเขามีการเปลี่ยนแปลงและปรับปรุงความเข้าใจของฉันเป็นปัญหา ฉันได้เรียนรู้จากนี้เล็กน้อย ฉันประหลาดใจมากที่ฉันไม่ได้คิดถึงวิธีแก้ปัญหาที่ง่าย แต่ดีเหล่านี้ ฉันคิดว่าท่าทางของฉันในการสลับประโยคนั้นยากเกินไปและตอนนี้ฉันรู้แล้วว่าเนื่องจากคำตอบที่ดีเหล่านี้ว่าการแก้ไขประโยคโดยรวมดูเหมือนจะเป็นตัวเลือกที่ดีที่สุดสำหรับการจัดการกับกรณีเหล่านี้ไม่ว่าจะเป็นการเพิ่มวงเล็บหลังฟังก์ชั่น ชื่อฟังก์ชั่นและหากมีโดยใช้การจัดรูปแบบสำหรับชื่อฟังก์ชั่น
42 functions 

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