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

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

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

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


当前回答

对象不应该处于无效状态

不幸的是,许多ORM框架要求所有实体类都使用零参数构造函数,使用setter填充成员变量。在这些情况下,很难知道为了构造一个有效的对象必须调用哪些setter。

MyClass c = new MyClass(); // Object in invalid state. Doesn't have an ID.
c.setId(12345); // Now object is valid.

在我看来,一个对象不可能发现自己处于无效状态,类的API应该在每次方法调用后主动强制它的类不变量。

构造函数和突变方法应该原子地将对象从一种有效状态转换为另一种有效状态。这个好多了:

MyClass c = new MyClass(12345); // Object starts out valid. Stays valid.

作为一些库的使用者,在尝试使用一个对象之前跟踪是否调用了所有正确的setter是一件非常痛苦的事情,因为文档通常没有提供关于类契约的线索。

其他回答

一个文件一个类

谁在乎呢?我更喜欢把整个程序包含在一个文件中,而不是一百万个不同的文件。

复制/粘贴不是反模式,事实上它有助于避免产生更多的错误

我的经验法则——只输入不能复制/粘贴的东西。如果创建类似的方法,类或文件-复制现有的并更改所需的内容。(我不是在谈论复制应该放在单个方法中的代码)。

我通常从不输入变量名——要么复制粘贴,要么使用IDE自动补全。如果需要一些DAO方法-复制类似的方法并更改所需的内容(即使将更改90%)。对某些人来说,这可能看起来是极度的懒惰或缺乏知识,但我几乎从来没有处理过由拼写错误引起的问题,而且它们通常很难捕捉(如果没有在编译级别检测到)。

每当我偏离我的复制粘贴规则,开始输入东西时,我总是拼写错误(这只是一个统计数据,没有人能立即写出完美的文本),然后花更多的时间试图找出哪里。

人脑是开启所有锁的万能钥匙。

世界上没有任何东西能让你的大脑运转得更快。相信我,这不是哲学上的,而是实际的。就意见而言,他们就像下面一样


1)永远不要超出编程语言指定的界限,一个简单的例子就是C和c++中的指针。不要误用它们,因为你可能会得到该死的分割错误。

2)始终遵循编码标准,是的,你读的是正确的,编码标准对你的程序有很大的影响,毕竟你的程序是由机器执行的,但要被其他大脑理解:)

Visual Basic和c#都不能胜过对方。除了一些语法和格式之外,它们几乎是一样的。

使软件可配置是一个坏主意。

可配置软件允许最终用户(或管理员等)选择太多的选项,这些选项可能没有一起测试过(或者,如果有超过非常小的数量,我可以保证没有测试过)。

因此,我认为将配置硬编码(但不一定回避常量等)为JUST WORK的软件是一个好主意。使用合理的默认值运行,并且不允许更改它们。

一个很好的例子是谷歌Chrome上的配置选项的数量-然而,这可能仍然太多:)