这绝对是主观的,但我想尽量避免它变成争论。我认为如果人们恰当地对待它,这将是一个有趣的问题。

这个问题的想法来自于我对“你最讨厌的语言的哪五件事?”问题的回答。我认为c#中的类在默认情况下应该是密封的——我不会把我的理由放在这个问题上,但我可能会写一个更完整的解释来回答这个问题。我对评论中的讨论热度感到惊讶(目前有25条评论)。

那么,你有什么有争议的观点?我宁愿避免那些基于相对较少的基础而导致相当宗教的事情(例如,大括号放置),但例如可能包括“单元测试实际上并没有多大帮助”或“公共字段确实是可以的”之类的事情。重要的是(至少对我来说)你的观点背后是有理由的。

请提出你的观点和理由——我鼓励人们投票给那些有充分论证和有趣的观点,不管你是否恰好同意这些观点。


当前回答

方法/函数参数的先决条件应该是语言的一部分,而不是程序员总是检查它。

其他回答

我有争议的观点: OO编程被极大地高估了[并被视为一颗银弹],实际上它只是工具箱中的另一个工具,没有别的!

从长远来看,不需要探索所有形式的测试,QA也可以做得很好

很多地方似乎都有一种“方法”,即“我们怎么做”。这似乎隐含地排除了其他方法。

从长远来看,这是一个严重的问题,因为QA的主要功能是将错误归档并修复它们。

如果你不能找到尽可能多的bug,你就不能很好地做到这一点。例如,当您排除方法时,由于过于依赖黑盒,您开始忽略整个可发现的编码错误类别。这意味着,您正在使整个编码错误类无法修复,除非有人偶然发现它。

潜在的问题似乎往往是管理层+员工。有这个问题的管理者似乎对计算机科学和/或他们团队的价值主张有狭隘的想法。他们倾向于创建反映他们的方法的团队,以及测试方法的白名单。

我并不是说你可以或应该一直做所有的事情。让我们面对现实吧,对于给定的产品来说,一些测试方法只是在浪费时间。有些方法在产品成熟度的特定级别上更有用。但我认为,测试组织缺少的是挑战自己学习新事物的能力,并将其应用于整体绩效。

这里有一个假设的对话可以总结:

我:你测试了启动脚本10年,却对shell脚本及其工作原理一无所知?! 测试人员:是的。 我:权限? 测试人员:安装程序会这样做 我:平台,发布特定的依赖? 测试者:我们为此存档bug 我:错误处理? 测试人员:当错误发生时,客户支持会给我们发送一些信息。 我:好吧…(开始考虑在stackoverflow中写帖子…)

汇编程序没有死

在我的工作(复制保护系统)中,汇编程序是必不可少的,我使用了许多hll复制保护系统,只有汇编程序才能真正地利用隐藏在代码中的所有可能性(如代码突变,低级别的东西)。

此外,许多代码优化只有通过汇编程序才能实现,看看任何视频编解码器的源代码,源代码都是用汇编程序编写的,并优化为使用MMX/SSE/SSE2操作码,许多游戏引擎使用汇编程序优化例程,甚至Windows内核也有SSE优化例程:

NTDLL.RtlMoveMemory

.text:7C902CD8                 push    ebp
.text:7C902CD9                 mov     ebp, esp
.text:7C902CDB                 push    esi
.text:7C902CDC                 push    edi
.text:7C902CDD                 push    ebx
.text:7C902CDE                 mov     esi, [ebp+0Ch]
.text:7C902CE1                 mov     edi, [ebp+8]
.text:7C902CE4                 mov     ecx, [ebp+10h]
.text:7C902CE7                 mov     eax, [esi]
.text:7C902CE9                 cld
.text:7C902CEA                 mov     edx, ecx
.text:7C902CEC                 and     ecx, 3Fh
.text:7C902CEF                 shr     edx, 6
.text:7C902CF2                 jz      loc_7C902EF2
.text:7C902CF8                 dec     edx
.text:7C902CF9                 jz      loc_7C902E77
.text:7C902CFF                 prefetchnta byte ptr [esi-80h]
.text:7C902D03                 dec     edx
.text:7C902D04                 jz      loc_7C902E03
.text:7C902D0A                 prefetchnta byte ptr [esi-40h]
.text:7C902D0E                 dec     edx
.text:7C902D0F                 jz      short loc_7C902D8F
.text:7C902D11
.text:7C902D11 loc_7C902D11:                           ; CODE XREF: .text:7C902D8Dj
.text:7C902D11                 prefetchnta byte ptr [esi+100h]
.text:7C902D18                 mov     eax, [esi]
.text:7C902D1A                 mov     ebx, [esi+4]
.text:7C902D1D                 movnti  [edi], eax
.text:7C902D20                 movnti  [edi+4], ebx
.text:7C902D24                 mov     eax, [esi+8]
.text:7C902D27                 mov     ebx, [esi+0Ch]
.text:7C902D2A                 movnti  [edi+8], eax
.text:7C902D2E                 movnti  [edi+0Ch], ebx
.text:7C902D32                 mov     eax, [esi+10h]
.text:7C902D35                 mov     ebx, [esi+14h]
.text:7C902D38                 movnti  [edi+10h], eax

所以,如果你下次听到汇编器死了,想想你最近看过的电影或玩过的游戏(以及它的复制保护)。

如果语言已经公开了实际类型,就不要为基本类型使用关键字。在c#中,这将指bool (Boolean), int (Int32), float (Single), long (Int64)。'int', 'bool'等不是语言的实际部分,而只是实际类型的'快捷方式'或'别名'。不要使用不存在的东西!在我看来,Int16, Int32, Int64,布尔值等比'short', 'long', 'int'更有意义。

匿名函数很糟糕。

我正在自学jQuery,虽然它是一种优雅且非常有用的技术,但大多数人似乎都将其视为最大化匿名函数用户的某种竞争。

函数和过程命名(以及变量命名)是我们在编程中所拥有的最强大的表达能力。将函数作为数据传递是一项伟大的技术,但使它们匿名并因此非自文档化是一个错误。这样就失去了表达代码含义的机会。