Linq มีผลต่อจิตใจที่ทำให้มึนงงโปรแกรมเมอร์ NET หรือไม่?


36

จำนวนมากเราเริ่มเห็นปรากฏการณ์นี้กับ jQuery เกี่ยวกับปีที่ผ่านมาเมื่อผู้คนเริ่มถามถึงวิธีการทำสิ่งที่บ้าอย่างเช่นดึงสตริงแบบสอบถามกับ jQuery ความแตกต่างระหว่างไลบรารี (jQuery) และภาษา (JavaScript) นั้นหายไปกับโปรแกรมเมอร์จำนวนมากและทำให้โค้ดที่ไม่เหมาะสมและซับซ้อนถูกเขียนขึ้นโดยที่ไม่จำเป็น

บางทีมันอาจจะเป็นแค่จินตนาการของฉัน แต่ฉันสาบานฉันเริ่มที่จะเห็น uptick ในจำนวนของคำถามที่คนถามจะทำสิ่งที่บ้าในทำนองเดียวกันกับ Linq เช่นช่วงที่พบในอาร์เรย์เรียง ฉันไม่สามารถเข้าใจได้ว่าส่วนขยายของ Linq ไม่เหมาะสมสำหรับการแก้ไขปัญหานั้นอย่างไร แต่ที่สำคัญกว่านั้นความจริงที่ว่าผู้เขียนคิดว่าทางออกที่ดีที่สุดจะเกี่ยวข้องกับ Linqโดยไม่ต้องคิดอะไรเกี่ยวกับเรื่องนี้ ดูเหมือนว่าเรากำลังทำซ้ำประวัติศาสตร์ผสมโปรแกรมเมอร์รุ่นใหม่ของ. NET ที่ไม่สามารถบอกความแตกต่างระหว่างภาษา (C # / VB.NET) และไลบรารี่ (Linq)

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

ที่สำคัญกว่านั้นคือปัญหาจริงๆและถ้าเป็นเช่นนั้นวิธีที่ดีที่สุดในการช่วยเหลือผู้คนเหล่านี้คืออะไร?


6
+1 สำหรับ "สันนิษฐานว่าทางออกที่ดีที่สุดจะเกี่ยวข้องกับ Linq โดยที่ไม่ได้คิดถึงมัน" มันเกินกว่าฉันจริงๆ
Jaco Pretorius

1
Linq ช้า ...

2
@ เปียโน: คุณอ้างสิทธิ์บนพื้นฐานแบบใด
Aaronaught

5
@ Mason: นั่นเป็นเกณฑ์มาตรฐานที่น่ากลัวอย่างยิ่งที่เขียนโดยใครบางคนที่ไม่รู้ว่าพวกเขากำลังทำอะไรอยู่ การเปรียบเทียบในเห็บ? สัญกรณ์ฮังการี และรุ่น Linq ไม่ได้ทำสิ่งเดียวกันมันพยายามที่จะย้ำทุกผลเดียวแทนที่จะหยุดในตอนแรก ไม่พูดถึงหลักฐานทั้งหมดเป็นโง่เป็นที่ถูกกล่าวถึง concidentally ในคำถามที่ร้อนของวันนี้
Aaronaught

3
และโดยบังเอิญ @Mason นั้น Linq มีการเพิ่มประสิทธิภาพหลายอย่างในตัวสำหรับวิธีการใดก็ตามที่สามารถปรับให้เหมาะสมได้เกือบจะเป็นครั้งแรก สำหรับเมธอด set-based อื่น ๆ เช่น equijoins จะสร้างตารางแฮช มันไม่ได้ปรับโค้ดให้เหมาะกับคุณแต่จะไม่ทำให้โค้ดของคุณช้าลงเช่นกัน การชะลอตัวจริงของเอกสารส่วนใหญ่ที่เกิดขึ้นจริงนั้นเกิดจาก lambdas / closures ซึ่งเป็นอิสระจาก Linq
Aaronaught

คำตอบ:


52

มันเป็นเพราะการเขียนโปรแกรมเป็นพื้นฐานที่ยาก มันต้องใช้ความคิดเชิงตรรกะที่มีโครงสร้างจำนวนมากในแบบที่คนจำนวนมากไม่รู้จะทำอย่างไร (หรือไม่สามารถทำได้ขึ้นอยู่กับคนที่คุณฟัง)

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

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


30
+1 สำหรับ "เทคนิคการเขียนโปรแกรมอย่างง่ายไม่ทำให้โปรแกรมเมอร์โง่ แต่พวกเขาแค่ดึงดูดคนโง่ ๆ ให้เข้าสู่การเขียนโปรแกรม"
Steven Evers

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

4
ฉันยังคงสงสัยว่า LINQ ดึงดูดนักเขียนโปรแกรมที่ไร้ความสามารถ - จากสิ่งที่ฉันเห็นมันดูเหมือนจะเป็นหนึ่งในแนวคิดที่ยากที่สุดสำหรับมือใหม่ที่จะเข้าใจ - แต่นี่ดูเหมือนจะเป็นคำตอบที่ดีที่สุด
Aaronaught

1
คุณควรใส่ลิขสิทธิ์ในประโยคสุดท้ายนั้น ก็พูดกันแล้วครับ
AJ Johnson

1
ตลก. สำหรับฉันแล้ว LINQ ไม่ใช่แนวคิดที่ง่ายต่อการควบคุมโดยเฉพาะ หากคุณกำลังทำอะไรที่ไร้สาระคุณต้องหยุดคิดเกี่ยวกับพวงมาลัยและเริ่มเข้าใจการส่งสัญญาณ ฉันกำลังมองหาคุณลำดาส!
Brian MacKay

13

สำหรับฉันมันเป็นปรากฏการณ์ของเล่นใหม่ มีอะไรใหม่ออกมา (LINQ) และตอนนี้นักพัฒนาทุกคนต้องการเล่นกับมัน

พวกเขาเห็นว่า LINQ เป็นค้อนและปัญหาทุกอย่างก็คือเล็บ ใครจะเป็นห่วงถ้ามันง่ายกว่าที่จะทำอย่างอื่น? LINQ ต้องเป็นคำตอบ! เหมือนเมื่อทุกคนใช้ XML สำหรับทุกสิ่ง! ไฟล์การกำหนดค่า? XML กำลังจัดเก็บข้อมูลหรือไม่ XML ฯลฯ


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

3
+1: มันคุ้มค่าที่จะยืดเครื่องมือของคุณเพื่อดูว่ามีปัญหามากมายแค่ไหนที่สามารถตอกเข้ากับรูปร่างของเล็บเมื่อคุณเรียนรู้เทคโนโลยี
Steven Evers

+1: ตัวอย่างอื่นของค้อนวิเศษประเภทนี้คือ jQuery (ดังที่กล่าวไว้ในคำถาม) และนิพจน์ทั่วไป ไม่ใช่ว่าสิ่งเหล่านี้ไม่ดีจริง ๆ แล้วมันมีประโยชน์จริง ๆ แต่ไม่ใช่คำตอบสำหรับทุกสิ่ง
ทิมกู๊ดแมน

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

@Aaraught: ในทางกลับกันการใช้ XML ที่มีชื่อฟิลด์ยาว ๆ ดูเหมือนจะไม่ดีสำหรับฉันในการรับส่งข้อมูลผ่านแบนด์วิดท์ต่ำและลิงก์วิทยุที่ไม่น่าเชื่อถือทั้งหมด จากนั้นอีกครั้งนั่นคือสิ่งที่ฉันคิดเกี่ยวกับการออกแบบฐานข้อมูลในผลิตภัณฑ์นั้น
David Thornley

10

ฉันคิดว่า LINQ เสนอโอกาสที่ดีจริงๆใน C # ในการแก้ปัญหาโดยใช้วิธีการทำงานที่มากขึ้น เราไม่ควรมองข้ามการแก้ปัญหารูปแบบใหม่เพียงเพราะเรามีบางสิ่งที่ใช้ได้ผลอยู่แล้ว

มาจากพื้นหลัง SQL หนักฉันชอบมีตัวเลือกในการใช้ตรรกะตามชุดใน C # ของฉันเพื่ออธิบายเจตนาของการดำเนินงานของฉันได้ดียิ่งขึ้น

ที่กล่าวว่า; บริบทคือราชาและทุกสิ่งสามารถนำมาใช้มากเกินไป


ใครกำลังไล่ ฉันใช้ Linq ตลอดเวลาฉันแค่กังวลเกี่ยวกับจำนวนเหตุการณ์ที่ฉันเห็นจากคนที่ใช้มัน (หรือพยายามใช้) สำหรับปัญหาที่ชัดเจนซ้ำแล้วซ้ำอีกและไม่ได้ตั้งค่า
Aaronaught

ฉันคุ้นเคยกับการพยายามแก้ปัญหาที่ต้องเขียนใน SQL และใช้ตรรกะแบบ set-based แทนเคอร์เซอร์เพื่อทำเช่นนั้น การใช้เครื่องมือในทางที่ผิดจะเกิดขึ้นเสมอ แต่ฉันเดาว่าอย่างน้อยถ้าพวกเขาเขียนโค้ด LINQ ไม่ดีแทนที่จะเป็นรหัสโพรซีเดอร์ที่ไม่ดีเวอร์ชันที่ใหม่กว่าของ. NET จะง่ายกว่าอย่างน้อยก็จะสามารถทำให้มันขนานกันได้
dotjosh

2

LINQ และ jQuery เป็น "ของเล่น" ล่าสุดและผู้พัฒนาชอบที่จะแสดงออกว่าพวกเขาสามารถทำสิ่งต่าง ๆ ได้อย่างไรโดยใช้สิ่งล่าสุด


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

@ Aaronaught - ใช่ฉันคิดว่าฉันคิดว่าทำไมคนถึงตอบคำถามด้วยวิธีนี้
Dan Diplo

2

หากคุณใช้ Linq อย่างเหมาะสมและเข้าใจภายใต้ประทุนคุณจะพบกับเทคนิคการเขียนโปรแกรมที่ทันสมัยทุกประเภท

ดังนั้นถ้าคุณคิดอย่างลึกซึ้งเกี่ยวกับการปรับปรุงฉันยืนยันว่ามันทำให้คุณเป็นโปรแกรมเมอร์ที่ดีขึ้น ไม่ว่าโปรแกรมเมอร์ที่ได้รับจะทำสิ่งนี้จริงหรือไม่ไม่ใช่ความผิดของ Linq

สามารถสร้างอาร์กิวเมนต์เดียวกันสำหรับผู้ทำแผนที่วัตถุสัมพันธ์ ไม่มีใครเขียนแบบสอบถาม SQL ดิบกับตารางฐานข้อมูลอีกต่อไปจริงๆ :)


9
สวัสดีฉันเขียน SQL ดิบ ... สูดอากาศ
Aaronaught

2
Raw SQL เป็นทางออกที่ดีที่สุดหากคุณรู้ว่าคุณกำลังทำอะไรอยู่
Fosco

1
+1 สำหรับอาร์กิวเมนต์ "ทำให้คุณเป็นโปรแกรมเมอร์ที่ดีกว่า" การเข้าใจ linq และโดยเฉพาะอย่างยิ่งวิธีการที่สนับสนุนมันทำให้ฉันเข้าใจแนวคิดการเขียนโปรแกรมที่มีประโยชน์มากอย่างแน่นอน
John M Gant

1
ฉันคิดว่ามีคนทำผิดกับ ORM กับความคิดเห็น SQL ดิบ มันไม่ใช่ฉัน ฉันใช้ทั้งสองและฉันเข้าใจคำพูดที่ว่าเป็นลิ้น - แก้ม
Aaronaught

1
ฉันจะไม่เชื่อถือการสืบค้นฐานข้อมูลที่ซับซ้อนของฉันไปยังอึที่ ORM เขียนมันเป็นเรื่องง่ายสำหรับสิ่งต่าง ๆ แต่เอ่อสำหรับการรายงานประเภทการสืบค้น อีกครั้งในมือของใครบางคนที่รู้ว่าสิ่งที่พวกเขากำลังทำออมเป็นสิ่งที่ดีในมือของคนที่ขี้เกียจเกินไปที่จะเข้าใจฐานข้อมูลภัยพิบัติข้างหน้า
HLGEM

1

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

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

ฉันใช้คำถามแบบนี้ในสองส่วน:

  1. สามารถทำได้และถ้าเป็นเช่นนั้นจะมีลักษณะอย่างไร
  2. ควรจะทำมีความเสี่ยงหรือทางเลือกที่ดีกว่า

ฉันพบว่าฉันทำตามลำดับนั้นเกือบทุกครั้ง มันตอบคำถามและยังช่วยให้คุณสามารถอธิบายทางเลือกที่ดีกว่าได้


0

ฉันไม่รู้เกี่ยวกับผลกระทบที่ทำให้มึนงงต่อความคิดของนักพัฒนา แต่ลองดูที่นี่เพื่อดูผลของเครื่องมือ / ภาษาที่ไม่คิดค่าใช้จ่าย พูดคุยเกี่ยวกับการลดบาร์!


0

ฉันเห็นด้วยกับ Mason Wheeler แต่ก็เป็นไม่บ้าทั้งหมดเพื่อพยายามที่จะแก้ https://stackoverflow.com/questions/3762202/get-range-of-integers-with-linqโดยการดำเนินงานใน "ลำดับ" ปัญหาคือตัววนซ้ำของ Java และ. Net ไม่สนับสนุนการดำเนินการทั้ง 3 รายการ: ค่าปัจจุบัน, ค่าถัดไป, และย้ายไปยังถัดไป Clojure สามารถทำทั้งหมด 3 และฉันสงสัยว่าใน Clojure มันง่ายกว่าที่จะทำสิ่งนี้ให้ถูกต้อง Python ก็มีกิจวัตรร่วมเช่นกันและฉันต้องการลองถอดรหัสดู http://clojure.org/sequences http://www.try-clojure.org/

ในความเป็นจริงหากอินพุตเป็นลำดับที่ไม่สิ้นสุดเช่นhttp://oeis.org/A007401 แสดงว่าขี้เกียจเป็นวิธีเดียวเท่านั้น


"Linq" ไม่ได้หมายถึง "ตัววนซ้ำ" หรือ "ขี้เกียจ" ที่จำเป็น - อันที่จริง Linq ส่วนใหญ่เกี่ยวกับต้นไม้แสดงออก คุณสามารถทำได้อย่างง่ายดายถ้าคุณต้องการใช้การรวม 3 หรือ N มูลค่าของคุณเองด้วยการปิดและรหัสไม่มากเลยใน C # ปัญหาเกิดขึ้นเมื่อผู้คนไม่ทราบวิธีการทำเช่นนั้นจริง ๆ หรือแม้กระทั่งวิธีเริ่มต้นและกำลังมองหาคาถาเวทมนต์ที่อาศัยอยู่ในSystem.Linqเนมสเปซ
Aaronaught

@Aaraught ... '' '"Linq" ไม่ได้หมายถึง "iterators" หรือ "ขี้เกียจ" ไม่จำเป็น "' '- ดี Linq สามารถดูเหมือน SQL แต่น้ำตาล syntactic นี้คอมไพล์ลงในรหัส IL จริงซึ่งถ้าไม่คอมไพล์ จะมีลักษณะเทียบเท่ากับกลุ่มของ IEnumerable [<T>] นับรวมกัน สิ่งนั้นขี้เกียจและใช้ตัวแจงนับซึ่งในภาษาอื่นจะเรียกว่าตัววนซ้ำ แต่ใช่ปัญหาคือ LINQ ทำให้การเข้ารหัสดูง่ายและผู้ทดลองนั้นไม่มีเงื่อนไข บางคนยังอาจเป็นโปรแกรมเมอร์ที่ดี หาก C # เป็นภาษาแรกของพวกเขาและพวกเขาเป็น noobs รวมแล้วพวกเขากำลังจัดการกับภาษาขนาดใหญ่
งาน

แน่นอนว่า Linq to Objects (ไม่ใช่ Linq ถึง SQL, Linq to Entities, Linq to DataSet หรือสาขาอื่น ๆ ของ Linq) ขึ้นอยู่กับตัววนซ้ำและการประมวลผลที่เลื่อนออกไป Iterator บล็อกและyieldคำสั่งที่มีอยู่ก่อน Linq เช่นเดียวกับผู้ได้รับมอบหมาย การปิดตัวเข้ามาในรุ่นเดียวกันกับ Linq แต่การดำเนินการ "Linq" เพียงไม่กี่อย่างนั้นจำเป็นต้องมีการจับภาพตัวแปรท้องถิ่น การถาม "ฉันจะทำอย่างไร [คำอธิบายของการทำงาน / ฟังก์ชั่นซ้ำ ๆ ทั้งหมด] กับ Linq ได้อย่างไร" หักล้างความไม่รู้ที่ลึกซึ้งของ Linq ทั้งสอง (สิ่งที่มันหมายถึงการทำ) และภาษาเอง
Aaronaught
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.