这绝对是主观的,但我想尽量避免它变成争论。我认为如果人们恰当地对待它,这将是一个有趣的问题。
这个问题的想法来自于我对“你最讨厌的语言的哪五件事?”问题的回答。我认为c#中的类在默认情况下应该是密封的——我不会把我的理由放在这个问题上,但我可能会写一个更完整的解释来回答这个问题。我对评论中的讨论热度感到惊讶(目前有25条评论)。
那么,你有什么有争议的观点?我宁愿避免那些基于相对较少的基础而导致相当宗教的事情(例如,大括号放置),但例如可能包括“单元测试实际上并没有多大帮助”或“公共字段确实是可以的”之类的事情。重要的是(至少对我来说)你的观点背后是有理由的。
请提出你的观点和理由——我鼓励人们投票给那些有充分论证和有趣的观点,不管你是否恰好同意这些观点。
顾客并不总是对的。
在我处理的大多数情况下,客户是产品所有者,也就是“企业”。通常情况下,开发人员只是编写代码,而不试图在产品中提供既定的利益。人们有太多的误解,认为IT部门是“公司中的公司”,这完全是一堆垃圾。
I feel my role is that of helping the business express their ideas - with the mutual understanding that I take an interest in understanding the business so that I can provide the best experience possible. And that route implies that there will be times that the product owner asks for something that he/she feels is the next revolution in computing leaving someone to either agree with that fact, or explain the more likely reason of why no one does something a certain way. It is mutually beneficial, because the product owner understands the thought that goes into the product, and the development team understands that they do more than sling code.
这实际上已经开始引导我们走上提高生产力的道路。如何?由于双方的分歧已经改善了沟通,我们更有可能在过程中更早地走到一起,并就产品定义达成一个互利的解决方案。
大多数开发人员对此一无所知
是的. .好了。我说过了。我从我认识的所有开发者身上发现了这一点。只有少数是真正好的。只有少数人明白代码应该被测试……面向对象的开发方法实际上是在帮助你。让我感到沮丧的是,有些人获得了开发人员的头衔,而实际上他们所能做的只是复制和粘贴一些源代码,然后执行它。
无论如何……我很高兴像stackoverflow这样的项目已经开始了。这对开发人员来说是件好事。有没有更好的办法?我做对了吗?也许我可以用这个技巧来加快速度,等等……
但是不行……大多数开发人员只是学习一种工作需要的语言,并坚持使用它,直到他们自己变成了老而暴躁的开发人员,不知道发生了什么。他们得到的只是一大笔薪水,因为他们只是比你大。
好吧……IT界的生活是不公平的,我将采取措施在未来忽略这些人。万岁!
代码布局很重要
也许双括号位置的细节应该保持纯粹的宗教争论-但这并不意味着所有的布局风格都是平等的,或者根本没有客观因素!
问题在于布局的超级规则,即:“保持一致”,尽管听起来不错,但被许多人用作拐杖,从不尝试看看他们的默认风格是否可以改进——而且,这甚至无关紧要。
几年前,我正在学习快速阅读技术,我学到的一些东西是关于眼睛如何在“固定”中获取信息,如何最优地扫描页面,以及潜意识中拾取上下文的作用,这让我思考如何将其应用到代码中——尤其是在编写代码时牢记它。
它使我形成了一种本质上倾向于柱状的样式,在可能的情况下对标识符进行逻辑分组和对齐(特别是我严格要求每个方法参数都在自己的行上)。然而,与一成不变的长柱结构相比,以块为单位改变结构实际上是有益的,这样你最终会得到眼睛可以在一个固定装置中接受的矩形岛屿——即使你没有有意识地阅读每个字符。
最终的结果是,一旦你习惯了它(通常需要1-3天),它就会变得赏心悦目,更容易理解,对眼睛和大脑的负担也更少,因为它的布局方式更容易接受。
几乎无一例外,我邀请的每个尝试这种风格的人(包括我自己)一开始都说,“啊,我讨厌它!”,但过了一两天就说,“我喜欢它——我发现很难不回头用这种方式重写我所有的旧东西!”
我一直希望有时间做更多的对照实验,以收集足够的证据来写一篇论文,但一直忙于其他事情。然而,这似乎是一个向那些对有争议的技术感兴趣的人提及它的好机会:-)
(编辑)
我终于抽出时间把这件事写在博客上(在“意义”阶段停留了很多年之后):第一部分,第二部分,第三部分。
好吧,我说过我会更详细地阐述我的“密封类”观点。我想有一种方法可以展示我感兴趣的答案,那就是给我自己一个答案:)
意见:在c#中,默认情况下类应该是密封的
推理:
There's no doubt that inheritance is powerful. However, it has to be somewhat guided. If someone derives from a base class in a way which is completely unexpected, this can break the assumptions in the base implementation. Consider two methods in the base class, where one calls another - if these methods are both virtual, then that implementation detail has to be documented, otherwise someone could quite reasonably override the second method and expect a call to the first one to work. And of course, as soon as the implementation is documented, it can't be changed... so you lose flexibility.
C# took a step in the right direction (relative to Java) by making methods sealed by default. However, I believe a further step - making classes sealed by default - would have been even better. In particular, it's easy to override methods (or not explicitly seal existing virtual methods which you don't override) so that you end up with unexpected behaviour. This wouldn't actually stop you from doing anything you can currently do - it's just changing a default, not changing the available options. It would be a "safer" default though, just like the default access in C# is always "the most private visibility available at that point."
通过让人们明确表示他们希望人们能够从他们的类中派生,我们将鼓励他们更多地思考这个问题。这也可以帮助我解决我的懒惰问题——虽然我知道我应该密封几乎所有的类,但我很少真的记得这样做:(
对方观点:
我可以看到这样一种说法:可以相对安全地派生没有虚方法的类,而不需要额外的灵活性和通常需要的文档。目前我不确定如何应对这个问题,只能说我相信意外打开类的危害比意外密封类的危害更大。