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

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

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 …

12
เหตุใดภาษาการเขียนโปรแกรมส่วนใหญ่จึงมีคำหลักหรือไวยากรณ์พิเศษสำหรับการประกาศฟังก์ชั่น [ปิด]
ภาษาโปรแกรมส่วนใหญ่ (ทั้งภาษาแบบไดนามิกและแบบคงที่) มีคำหลักพิเศษและ / หรือไวยากรณ์ที่มีลักษณะแตกต่างจากการประกาศตัวแปรสำหรับฟังก์ชั่นการประกาศ ฉันเห็นฟังก์ชั่นเช่นเดียวกับการประกาศเอนทิตีที่มีชื่ออื่น: ตัวอย่างเช่นใน Python: x = 2 y = addOne(x) def addOne(number): return number + 1 ทำไมจะไม่ล่ะ: x = 2 y = addOne(x) addOne = (number) => return number + 1 ในทำนองเดียวกันในภาษาเช่น Java: int x = 2; int y = addOne(x); int addOne(int x) { return …

6
ทำไม“ การมีเพศสัมพันธ์อย่างแน่นหนาระหว่างฟังก์ชั่นและข้อมูล” ไม่ดี?
ฉันพบข้อความนี้ใน " ความสุขของ Clojure " บนหน้า 32 แต่มีบางคนพูดสิ่งเดียวกันกับฉันในมื้อค่ำเมื่อสัปดาห์ที่แล้วและฉันก็ได้ยินที่อื่นเช่นกัน: [A] ข้อเสียของการเขียนโปรแกรมเชิงวัตถุคือการมีเพศสัมพันธ์อย่างแน่นหนาระหว่างฟังก์ชั่นและข้อมูล ฉันเข้าใจว่าเหตุใดการเชื่อมต่อที่ไม่จำเป็นจึงไม่ดีในแอปพลิเคชัน นอกจากนี้ฉันรู้สึกสบายใจที่จะบอกว่าควรหลีกเลี่ยงสถานะและการสืบทอดที่ไม่แน่นอนแม้ในการเขียนโปรแกรมเชิงวัตถุ แต่ฉันล้มเหลวที่จะเห็นว่าทำไมการติดฟังก์ชั่นในชั้นเรียนจึงไม่ดีอย่างแท้จริง ฉันหมายถึงการเพิ่มฟังก์ชั่นในชั้นเรียนดูเหมือนว่าจะติดแท็กเมลใน Gmail หรือติดไฟล์ในโฟลเดอร์ เป็นเทคนิคขององค์กรที่ช่วยให้คุณค้นพบอีกครั้ง คุณเลือกเกณฑ์บางอย่างจากนั้นรวบรวมสิ่งต่าง ๆ เข้าด้วยกัน ก่อน OOP โปรแกรมของเรามีวิธีการมากมายในไฟล์ ฉันหมายความว่าคุณต้องใส่ฟังก์ชั่นบางแห่ง ทำไมไม่จัดระเบียบพวกเขา? หากนี่เป็นการโจมตีแบบ veiled ในประเภททำไมพวกเขาถึงไม่พูดว่าการ จำกัด ประเภทของอินพุตและเอาต์พุตไปยังฟังก์ชันนั้นผิด ฉันไม่แน่ใจว่าฉันจะเห็นด้วยกับเรื่องนี้หรือไม่ แต่อย่างน้อยฉันก็คุ้นเคยกับข้อโต้แย้งอย่างมืออาชีพและความปลอดภัยในการพิมพ์ ฟังดูเป็นเรื่องที่ฉันกังวลเป็นส่วนใหญ่ แน่นอนว่าบางครั้งผู้คนเข้าใจผิดและวางการทำงานผิดประเภท แต่เมื่อเทียบกับข้อผิดพลาดอื่น ๆ ดูเหมือนว่าจะเป็นความไม่สะดวกเล็กน้อย ดังนั้น Clojure มีเนมสเปซ การผสานฟังก์ชันกับคลาสใน OOP แตกต่างจากการผสานฟังก์ชันในเนมสเปซใน Clojure ได้อย่างไรและทำไมมันจึงไม่ดี โปรดจำไว้ว่าฟังก์ชั่นในชั้นเรียนไม่จำเป็นต้องทำงานกับสมาชิกของคลาสนั้นเสมอไป ดูที่ java.lang.StringBuilder - ทำงานกับประเภทการอ้างอิงใด …

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

10
เหตุใดวันนี้ () เป็นตัวอย่างของฟังก์ชันที่ไม่บริสุทธิ์
ดูเหมือนว่าเมื่ออ่านบางอย่างเช่นบทความ Wikipedia เกี่ยวกับ "ฟังก์ชั่นบริสุทธิ์"พวกเขาระบุToday()ว่าเป็นตัวอย่างของฟังก์ชั่นที่ไม่บริสุทธิ์ แต่ดูเหมือนว่าบริสุทธิ์สำหรับฉัน เป็นเพราะไม่มีอาร์กิวเมนต์อินพุตที่เป็นทางการหรือไม่ เหตุใดเวลาที่แท้จริงของวันจึงไม่ถือว่าเป็น "อินพุตไปยังฟังก์ชัน" ซึ่งในกรณีนี้ถ้าคุณให้อินพุตเดียวกันนั่นคือดำเนินการtoday()สองครั้งในเวลาเดียวกันหรือย้อนเวลากลับไปดำเนินการอีกครั้ง (อาจเป็นสมมุติฐาน: )) ผลลัพธ์จะเป็นเวลาเดียวกัน Today()ไม่เคยให้ตัวเลขสุ่ม มันให้เวลากับวันเสมอ บทความ Wikipedia กล่าวว่า "เวลาที่ต่างกันมันจะให้ผลลัพธ์ที่แตกต่างกัน" แต่นั่นก็เหมือนกับการบอกว่าต่างกันx sin(x)จะให้อัตราส่วนต่างกัน และsin(x)เป็นตัวอย่างของฟังก์ชันบริสุทธิ์

1
ชื่อฟังก์ชั่นที่คืนค่าอาร์กิวเมนต์?
ฟังก์ชั่นที่ไม่ทำอะไรเลยไม่มีการโต้แย้งและคืนสิ่งใด ๆ ที่เรียกว่า a noopหรือ no-op ตัวอย่างของ noop อยู่ด้านล่าง: function noop(){} http://en.wikipedia.org/wiki/NOP ดังนั้นมีชื่อฟังก์ชั่นซึ่งมีความหมายเพียงเพื่อกลับอาร์กิวเมนต์ของมันและไม่ทำอะไรอย่างอื่น? ตัวอย่างของฟังก์ชันประเภทนี้: function(a){return a}
34 functions 

6
รูปแบบการใช้งานที่ไม่บริสุทธิ์ถือว่าถูกปิดหรือไม่?
การปิดนั้นถือว่าไม่บริสุทธิ์ในฟังก์ชั่นการเขียนโปรแกรมหรือไม่? ดูเหมือนว่าเราสามารถหลีกเลี่ยงการปิดโดยการส่งค่าโดยตรงไปยังฟังก์ชั่น ดังนั้นควรหลีกเลี่ยงการปิดที่เป็นไปได้? หากพวกเขาไม่บริสุทธิ์และฉันถูกต้องในการระบุว่าพวกเขาสามารถหลีกเลี่ยงได้ทำไมภาษาการเขียนโปรแกรมการทำงานจำนวนมากจึงสนับสนุนการปิด? หนึ่งในเกณฑ์ของฟังก์ชั่น pureคือ "ฟังก์ชั่นจะประเมินค่าผลลัพธ์เดียวกันเสมอซึ่งให้ค่าอาร์กิวเมนต์ที่เหมือนกัน" สมมติ f: x -> x + y f(3)จะไม่ให้ผลลัพธ์เดียวกันเสมอ f(3)ขึ้นอยู่กับค่าของที่ไม่ได้เป็นข้อโต้แย้งของy fดังนั้นจึงfไม่ใช่ฟังก์ชั่นที่บริสุทธิ์ เนื่องจากการปิดทั้งหมดขึ้นอยู่กับค่าที่ไม่ใช่ข้อโต้แย้งมันเป็นไปได้อย่างไรที่การปิดใด ๆ จะบริสุทธิ์ ใช่ในทางทฤษฎีแล้วค่าปิดอาจคงที่ แต่ไม่มีทางรู้ได้ว่าเพียงแค่มองว่าซอร์สโค้ดของฟังก์ชันนั้น ที่ซึ่งสิ่งนี้ทำให้ฉันเป็นว่าฟังก์ชั่นเดียวกันอาจบริสุทธิ์ในสถานการณ์หนึ่ง แต่ไม่บริสุทธิ์ในอีกสถานการณ์หนึ่ง หนึ่งไม่สามารถเสมอตรวจสอบว่าฟังก์ชั่นบริสุทธิ์หรือไม่โดยการศึกษารหัสแหล่งที่มาของ แต่อาจต้องพิจารณาในบริบทของสภาพแวดล้อม ณ จุดที่มันถูกเรียกก่อนที่ความแตกต่างดังกล่าวจะสามารถทำได้ ฉันกำลังคิดเกี่ยวกับสิ่งนี้ถูกต้องหรือไม่

4
ภาษาการเขียนโปรแกรมกำหนดฟังก์ชั่นอย่างไร
ภาษาการเขียนโปรแกรมกำหนดและบันทึกฟังก์ชัน / วิธีอย่างไร ฉันกำลังสร้างภาษาการเขียนโปรแกรมตีความใน Ruby และฉันพยายามคิดวิธีการประกาศใช้ฟังก์ชั่น แนวคิดแรกของฉันคือการบันทึกเนื้อหาของการประกาศในแผนที่ ตัวอย่างเช่นถ้าฉันทำสิ่งที่ชอบ def a() { callSomething(); x += 5; } จากนั้นฉันจะเพิ่มรายการลงในแผนที่ของฉัน: { 'a' => 'callSomething(); x += 5;' } ปัญหานี้คือว่ามันจะกลายเป็นแบบเรียกซ้ำเพราะฉันจะต้องเรียกparseวิธีการของฉันบนสตริงซึ่งจะโทรparseอีกครั้งเมื่อพบdoSomethingและจากนั้นฉันก็จะหมดพื้นที่สแต็คในที่สุด ดังนั้นภาษาที่ตีความจะจัดการกับสิ่งนี้ได้อย่างไร

4
ประกาศฟังก์ชั่นเป็น var แทนฟังก์ชั่น
มากขึ้นเรื่อย ๆ ฉันเห็นว่ามีการประกาศฟังก์ชั่นเช่นนี้ var foo = function() { // things }; แทนที่จะเป็นวิธีที่ฉันได้เรียนรู้เช่น function foo() { // things } ความแตกต่างคืออะไร? ประสิทธิภาพที่ดีขึ้น? ขอบเขต? ฉันควรจะใช้วิธีนี้หรือไม่?

6
วิธีการสกัดเทียบกับสมมติฐาน
เมื่อฉันแยกวิธีการขนาดใหญ่ (หรือขั้นตอนหรือฟังก์ชั่น - คำถามนี้ไม่เฉพาะเจาะจงกับ OOP แต่เนื่องจากฉันทำงานในภาษา OOP 99% ของเวลามันเป็นคำศัพท์ที่ฉันรู้สึกสบายใจที่สุด) เป็นคำเล็ก ๆ ฉันมักจะพบว่าตัวเองไม่พอใจกับผลลัพธ์ มันยากที่จะให้เหตุผลเกี่ยวกับวิธีการขนาดเล็กเหล่านี้มากกว่าเมื่อพวกเขาเป็นเพียงบล็อกของรหัสในใหญ่เพราะเมื่อฉันแยกพวกเขาฉันสูญเสียสมมติฐานพื้นฐานมากมายที่มาจากบริบทของผู้โทร ต่อมาเมื่อฉันดูรหัสนี้และดูวิธีการต่าง ๆ ฉันไม่รู้ทันทีว่าพวกเขาจะเรียกจากที่ไหนและคิดว่าเป็นวิธีการส่วนตัวแบบธรรมดาที่สามารถเรียกได้จากทุกที่ในไฟล์ ตัวอย่างเช่นลองจินตนาการถึงวิธีการเริ่มต้น (ตัวสร้างหรืออื่น ๆ ) แบ่งออกเป็นชุดของตัวเล็ก: ในบริบทของวิธีการเองคุณรู้ชัดเจนว่าสถานะของวัตถุนั้นยังคงไม่ถูกต้อง แต่ในวิธีส่วนตัวปกติคุณอาจไปจากสมมติฐานว่าวัตถุนั้น เริ่มต้นแล้วและอยู่ในสถานะที่ถูกต้อง ทางออกเดียวที่ฉันเคยเห็นคือwhereclause ใน Haskell ซึ่งช่วยให้คุณกำหนดฟังก์ชันขนาดเล็กที่ใช้เฉพาะในฟังก์ชัน "parent" โดยทั่วไปดูเหมือนว่านี้: len x y = sqrt $ (sq x) + (sq y) where sq a = a * a แต่ภาษาอื่นที่ฉันใช้ไม่มีอะไรแบบนี้ - …

2
ทำไมการส่งผ่านฟังก์ชั่นที่ไม่ระบุชื่อขนาดใหญ่เป็นข้อโต้แย้งไปยังฟังก์ชั่นอื่น ๆ จึงได้รับการยอมรับใน JavaScript
ฉันมีความเห็น (ซึ่งฉันแน่ใจว่าจะแบ่งปันโดย) ว่าการส่งผ่านฟังก์ชั่นนิรนามซึ่งมีโค้ดมากกว่าสองสามบรรทัดเนื่องจากข้อโต้แย้งไปยังฟังก์ชั่นอื่น ๆ นั้นส่งผลกระทบต่อความสามารถในการอ่านและจัดทำเอกสารด้วยตนเองอย่างรุนแรง จะดีกว่าสำหรับทุกคนที่มีโอกาสใช้รหัสเพื่อประกาศฟังก์ชั่นที่มีชื่อ หรืออย่างน้อยก็กำหนดฟังก์ชั่นที่ไม่ระบุชื่อให้กับตัวแปรก่อนที่จะประกาศฟังก์ชั่นหลัก อย่างไรก็ตามไลบรารีJavaScriptจำนวนมาก(jQuery, d3.js / NVD3.js) เพียงแค่ให้ตัวอย่างสองสามตัวอย่างใช้ฟังก์ชันขนาดใหญ่ด้วยวิธีนี้ ทำไมจึงเป็นที่ยอมรับอย่างกว้างขวางใน JavaScript? มันเป็นสิ่งที่เกี่ยวกับวัฒนธรรมหรือมีข้อได้เปรียบที่ฉันขาดไปซึ่งจะทำให้การใช้งานเป็นที่นิยมมากกว่าการประกาศฟังก์ชั่นที่มีชื่อ?


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'); …

2
เป็นความคิดที่ดีหรือไม่ที่จะให้ลายเซ็นฟังก์ชันที่แตกต่างกันซึ่งทำสิ่งเดียวกัน
นี่คือคลาส C ++ ที่สร้างขึ้นด้วยค่าสามค่า class Foo{ //Constructor Foo(std::string, int, char); private: std::string foo; char bar; int baz; }; ชนิดพารามิเตอร์ทั้งหมดแตกต่างกัน ฉันสามารถสร้างคอนสตรัคเตอร์มากเกินไปเพื่อให้ลำดับนั้นไม่สำคัญ class Foo{ //Constructors Foo(std::string, char, int); Foo(std::string, int, char); Foo(char, int, std::string); Foo(char, std::string, int); Foo(int, std::string, char); Foo(int, char, std::string); private: std::string foo; char bar; int baz; }; แต่นั่นเป็นความคิดที่ดี? …

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

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