เหตุใดโลกของ. Net จึงดูเหมือนว่าจะโอบกอดสายเวทมนตร์แทนที่จะเป็นทางเลือกที่ถูกพิมพ์อย่างคงที่?


47

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

ASP.Net MVC:

สวัสดีเส้นทางโลก:

        routes.MapRoute(
            "Default",                                              // Route name
            "{controller}/{action}/{id}",                           // URL with parameters
            new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
        );

สิ่งนี้หมายความว่า ASP.Net MVC จะค้นหาHomeControllerรหัสของคุณ สร้างอินสแตนซ์ใหม่ของมันแล้วเรียกใช้ฟังก์ชันIndex กับidพารามิเตอร์บางประเภท แล้วมีสิ่งอื่น ๆ เช่น:

RenderView("Categories", categories);
...or..
ViewData["Foobar"]="meh";

แล้วมีสิ่งที่คล้ายกันกับ XAML เช่นกัน DataContextได้รับการปฏิบัติเหมือนเป็นวัตถุและคุณต้องหวังและสวดภาวนาเพื่อแก้ไขสิ่งที่คุณต้องการ DependencyProperties ต้องใช้สายเวทและแบบแผนการตั้งชื่อเวทมนต์ และสิ่งนี้:

  MyData myDataObject = new MyData(DateTime.Now);      
  Binding myBinding = new Binding("MyDataProperty");
  myBinding.Source = myDataObject;

แม้ว่าจะขึ้นอยู่กับการคัดเลือกนักแสดงและสนับสนุนเวทย์มนตร์ต่างๆ

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

มีสาเหตุมาจากสาเหตุที่ฉันขาดหายไปหรือไม่เพราะเหตุใดไวยากรณ์การจัดเส้นทางของ ASP.Net อาศัยการสะท้อนกลับเพื่อแก้ไขวิธีจัดการเส้นทางอย่างแท้จริงหรือไม่ ฉันเกลียดเมื่อฉันเปลี่ยนชื่อของเมธอดหรือคุณสมบัติและทันใดนั้นสิ่งต่าง ๆ แตกสลาย แต่ดูเหมือนจะไม่มีการอ้างอิงใด ๆ กับวิธีการหรือคุณสมบัตินั้นและแน่นอนว่าไม่มีข้อผิดพลาดของคอมไพเลอร์ เหตุใดความสะดวกสบายที่ชัดเจนของสายเวทจึงถูกพิจารณาว่า "คุ้มค่า"?

ฉันรู้ว่ายังมีตัวเลือกที่พิมพ์แบบคงที่ทั่วไปบางสิ่งบางอย่าง แต่พวกเขามักจะใช้เบาะหลังและดูเหมือนจะไม่เคยอยู่ในบทเรียนหรือวัสดุเริ่มต้นอื่น ๆ


14
พลวัตไร้จุดหมายเป็นสิ่งที่โกรธแค้นตั้งแต่ซีพียูของเราเร็วพอที่จะรันได้
DeadMG

7
งั้นเหรอ ฉันไม่เห็นตัวอย่างดังกล่าวกับ LINQ
DeadMG

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

2
@Earlz ที่สำคัญกว่าวัตถุที่ไม่ระบุชื่อจะถูกพิมพ์แบบคงที่ ไม่มีสายเวทย์มนตร์คอมไพเลอร์รู้ชื่อและประเภทของทุกสิ่งที่เกี่ยวข้อง บันทึกไว้สำหรับการใช้งานทุกอื่น ๆ varของ

1
@Earlz ที่น่าสนใจแม้ว่าหนึ่งสามารถยืนยันว่าไวยากรณ์แลมบ์ดาเป็นขยายเพิ่มเติมที่นี่ ฉันเดาว่าพวกเขาไปกับสายเวท / วิธีการประชุมเพราะมันง่าย "ดีพอ" สำหรับหลาย ๆ คนและพวกเขาสามารถปรับเครื่องมือเพื่อให้คำแนะนำ / ความปลอดภัย เป็นการแลกเปลี่ยนระหว่างความปลอดภัยและความสะดวก IMHO การใช้ ViewBag แบบไดนามิกยังบ่งบอกถึงความคิดนี้ (ไม่ใช่ว่าฉันเห็นด้วยอย่างเต็มที่)
Daniel B

คำตอบ:


31

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

คุณยังพูดถึง XAML / WPF ซึ่งทั้งคู่อยู่ในระหว่างการพัฒนาที่ดีก่อนที่จะนำ generics ไปสู่. NET และการกลับไปที่การสนับสนุน generics จะทำให้เกิดความล่าช้าของผลิตภัณฑ์ที่ล่าช้ามาก (Longhorn / Vista)

มีตัวอย่างภายในกรอบ ASP.NET MVC ของการใช้แลมบ์ดานิพจน์แทนสตริงมายากลและเอนทิตี Framework / LINQ นำมันยิ่งไปกว่านั้นที่ภาษาและกรอบให้การสนับสนุนพื้นเมืองสำหรับการเขียนแบบสอบถาม SQL บนกราฟวัตถุแบบคงที่ (แทนที่จะสร้าง สตริง Magic SQL คุณจะได้รับการตรวจสอบเวลาของแบบสอบถามของคุณ

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

ดังนั้นคำตอบสั้น ๆ ก็คือในอดีตนั้น. NET ไม่รองรับการเคลื่อนที่แบบคงที่ของกราฟวัตถุจนกระทั่งการปล่อย 3.5 ตอนนี้เรามีแล้วนักพัฒนาหลายคนชอบมันมากกว่าสายเวทและหลายคนก็ผลักดันการสนับสนุนที่ลึกซึ้งยิ่งขึ้นเช่นตัวดำเนินการ symbolOf ที่ทำงานคล้ายกับตัวดำเนินการ typeOf


3
XAML เป็น verbose ตามที่มัน ... การเพิ่มการสนับสนุนสำหรับ generics จะทำให้มันยิ่ง moreso (ใช่ฉันรู้ว่า XAML ทั้งหมดไม่ได้ทำเพื่อมนุษย์อาร์กิวเมนต์) นอกจากนี้ฉันเห็น XAML คล้ายกับ HTML มากกว่าภาษาโปรแกรมจริง มันไม่ควรสนใจชนิดของวัตถุที่มันกำลังแสดงเพียงวิธีที่จะแสดงมัน
Michael Brown

2
Generics มาใน 2.0 แต่เราไม่ได้รับนิพจน์จนถึง 3.5 (ด้วย LINQ) นิพจน์คือพลังของ LINQ และชุมชนได้ใช้พลังงานนั้นและดำเนินการกับมัน เทคนิคนี้รู้จักกันในนามการสะท้อนคงที่
Michael Brown

1
จุดที่ดีเกี่ยวกับการสะท้อนคงที่ ฉันลืมเกี่ยวกับการเปิดตัวใน 3.5
Earlz

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

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