在强类型世界中,为什么 ASP.NET MVC 对命名约定的脆弱依赖不会引起人们的不满?

Elo*_*dev 5 c# asp.net-mvc programming-languages

一直以来,强类型对象一直是面向对象编程的基础。快进到 5 分钟前,当使用实体框架和 MVC3 时,我被迫将其添加到我的 Web.config 中:

\n\n
<connectionStrings>\n    <add name="_MY_EXACT_CLASS_NAME_DbContext" connectionString="Data Source=blahblah.../>\n</connectionStrings>\n
Run Code Online (Sandbox Code Playgroud)\n\n

太棒了,我的整个应用程序依赖于 XML 属性中任意选择的名称。这真的是现代编程的样子吗?类名拼写错误是一种严重的错误,编译器会直接引导我们进行修复,但在这种情况下,我只会收到运行时异常消息。如果前面提到的异常消息先生心情好的话,他会把我引向魔多,然后我就会长途跋涉走向另一座末日山,浪费调试时间来摧毁看不见的“一个打字错误统治他们所有人” 。

\n\n

控制器也是如此:

\n\n
routes.MapRoute("BE_CAREFUL","{controller}/{action}/{id}",\n            new { controller = "ONE_FALSE_MOVE_AND",\n            action = "BUT_I_SWEAR_IT_SAID_BUILD_SUCCEEDED" }\n);\n
Run Code Online (Sandbox Code Playgroud)\n\n

事情似乎一波一波地来来去去。强类型对象曾经风光无限,现在我们都是匿名“var”的邻家女孩。我承认,对自己的类型含糊其辞会引发很多性感的场景 - 特别是知道你不需要做任何设置工作 - 但这里是实际问题:

\n\n

面向对象编程的先驱们对我们通过添加一堆软弱的、无所事事的匿名构造同时创建对命名约定的脆弱依赖来“进步”他们的艺术有何感想?

\n\n

据我们所知,MVC4 可能突然要求所有名称前面必须有 4.7 个空格,后跟 lolcat ASCII art。为什么?因为是的,这就是原因。花点时间,惊叹一下您刚刚见证了命名约定的诞生这一事实。显然,这是旗舰框架非常坚实的基础材料。

\n\n

因此,如果我希望我的整个代码库在功能上和哲学上都依赖一件事,那么对于编程的数学逻辑来说,没有什么比......微软的\xc2\更关键的任务了。 xae 英语命名约定!

\n\n
</sarcasm>\n</griping>\n\n<!-- resume enjoying all of MVC\'s amazing features, after eating any humble pie served up in the comments -->\n
Run Code Online (Sandbox Code Playgroud)\n

jco*_*and 2

我的整个应用程序依赖于 XML 属性中任意选择的名称。

这称为“按约定编码”或“约定优于配置”……您选择一些需要配置的内容,然后其他所有内容都“就位”。就像使用 razor 并将 _layout.cshtml 放在 /views/shared 中一样。或者像使用剃刀和使用...mySpecialController这些只是让惯例为您服务的一种方式。ActionResult Index/views/mySpecial/Index.cshtml

一直以来,强类型对象一直是面向对象编程的基础。强类型对象曾经风光无限,现在我们都是匿名“var”的邻家女孩。

var 变量只是使内容更具可读性的简写,编译器仍然在编译时对内容进行强静态类型化。考虑一下这里的区别:

foreach (var c in Customers) { /* do stuff */ }
foreach (CustomerDataItem customerDataItem in Customers) { /* do stuff */ }
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,第一个代码说“从客户处获取项目 c”,第二个代码说同样的事情,但是天哪,当您还在输入长代码时,我已经又写了两行代码。诚然,有了 ReSharper,这种优势就消失了,但是……

据我们所知,MVC4 可能突然要求所有名称前面必须有 4.7 个空格,后跟 lolcat ASCII art。为什么?因为是的,这就是原因。

哈。

面向对象编程的先驱们对我们通过添加一堆软弱的、无所事事的匿名构造同时创建对命名约定的脆弱依赖来“进步”他们的艺术有何感想?

好吧,这主要是因为挫败感,但我会咬住。刚开始的人想要更简单的代码(BASIC、COBOL 查看它们的含义),因此他们希望事情变得更简单、更数学化。这就是事情的发展方向(LINQ 是集合数学和高阶微积分;另请参阅 F# 和 Python)

所以他们会喜欢我们现在所做的事情。摆脱过程代码(代数)并转向面向集合的逻辑(高级微积分)。另请参阅事件处理程序;-)


所以..说了这么多:我一直处于你的处境。我已经问过这些问题了。我曾在大师的脚下学习过。我喜欢语言的发展方向。

下辈子,我希望你学习node.js。我希望您学习异步事件处理,并且希望您了解事物如何不再依赖 ANSI-C。我们在这个行业取得了很大的进步,而且情况正在好转。事情每天都在好转。我喜欢我们所处的位置,我认为这对我们的行业来说是正确的。

干杯,HTH。