LBu*_*kin 99 language-agnostic
在我们编程时,我们都会开发我们使用和依赖的实践和模式.然而,随着时间的推移,随着我们的理解,成熟,甚至技术使用的变化,我们逐渐意识到我们曾经认为很棒的一些实践并不(或不再适用).
我曾经经常使用但最近几年改变的一种做法的例子是使用Singleton对象模式.
通过我自己的经验和与同事的长时间辩论,我逐渐意识到单身人士并不总是令人满意 - 他们可以使测试更加困难(通过抑制嘲讽等技术)并且可以在系统的各个部分之间产生不希望的耦合.相反,我现在使用对象工厂(通常使用IoC容器)来隐藏系统中不关心或需要知道的部分单体的性质和存在.相反,他们依靠工厂(或服务定位器)来获取对这些对象的访问权.
我本着自我改善的精神向社会提出的问题是:
Luk*_*lch 159
//Coming out of university, we were taught to ensure we always had an abundance
//of commenting around our code. But applying that to the real world, made it
//clear that over-commenting not only has the potential to confuse/complicate
//things but can make the code hard to follow. Now I spend more time on
//improving the simplicity and readability of the code and inserting fewer yet
//relevant comments, instead of spending that time writing overly-descriptive
//commentaries all throughout the code.
Run Code Online (Sandbox Code Playgroud)
Car*_*ter 117
单点返回.
我曾经偏好每个方法的单个返回点,因为我可以确保不会忽略例程所需的任何清理.
从那以后,我转向了更小的例程 - 因此减少了清理的可能性,并且实际上减少了清理的需要 - 并且发现早期的返回减少了代码的明显复杂性(嵌套级别).单个返回点的工件 - 保持"结果"变量,保留标志变量,未完成情况的条件子句 - 使代码看起来比实际复杂得多,使其更难以阅读和维护.早期出口和较小的方法是可行的方法.
Woj*_*ski 111
用一句话来说,过度工程.
Ken*_*ann 78
匈牙利表示法(表格和系统).我以前用过所有的前缀.strSomeString或txtFoo.现在我使用someString和textBoxFoo.对于新来的人来说,它更易读,更容易阅读.作为一个额外的奖励,保持它一致是微不足道的 - camelCase控件并附加一个有用/描述性的名称.表格匈牙利语的缺点是并不总是保持一致,而匈牙利语系统并没有真正为您带来多少收获.将所有变量组合在一起并不是那么有用 - 特别是对于现代IDE.
Bru*_*eod 67
"完美"的架构
我想出的一对夫妇几年前的架构.我尽可能地在技术上推动自己,因此有100%松散耦合的层,广泛使用委托和轻量级对象.这是技术天堂.
这是废话.该体系结构的技术纯度正在减慢我的开发团队的目标,完美结果,我几乎完全失败.
我们现在拥有更简单,技术更完美的架构,我们的交付率飙升.
Ale*_*lex 57
使用caffine.它曾经让我保持清醒,并且处于一种光荣的编程氛围中,代码从我的手指中流出,带着狂热的流动性.现在它什么也没做,如果我没有,我会头痛.
bbr*_*own 50
评论代码.我曾经认为代码是珍贵的,你不能只删除你精心制作的那些美丽的宝石.我现在删除了我遇到的任何已注释掉的代码,除非附加了TODO或NOTE,因为将它留在其中太危险了.就是说,我遇到了带有大量注释部分的旧类,它真的让我困惑为什么他们在那里:他们最近评论过吗?这是一个开发环境变化吗?为什么要做这个无关的块呢?
认真考虑不要注释掉代码而只是删除代码.如果您需要它,它仍然在源代码管理中.YAGNI虽然.
Sco*_*son 46
#region指令的过度使用/滥用.这只是一件小事,但在C#中,我以前会在整个地方使用#region指令来组织我的课程.例如,我将所有类属性组合在一个区域中.
现在我回顾一下旧代码,大多只是被他们烦恼了.我不认为它在大多数情况下确实让事情变得更清晰,有时它们只会让你失望.所以我现在已经改变了主意,觉得布局合理的课程大多是清洁的,没有地区指令.
Pau*_*ier 39
瀑布开发一般,具体而言,是编写完整和全面的功能和设计规范的实践,这些规范在某种程度上是预期的规范,然后期望这些规范的实现是正确和可接受的.我已经看到它被Scrum取代了,并且很好地解决了它,我说.简单的事实是,客户需求和欲望的变化使得任何固定的规范都无济于事; 真正正确解决问题的唯一方法是使用迭代方法.当然,并不是说Scrum是一颗银弹; 我已经看到它滥用和滥用了很多次.但它击败了瀑布.
gus*_*afc 36
永远不会崩溃.
这似乎是个好主意,不是吗?用户不喜欢崩溃的程序,所以让我们编写不会崩溃的程序,用户应该喜欢这个程序吧?这就是我开始的方式.
如今,我更倾向于认为如果它不起作用,它就不应该假装它正在发挥作用.尽快失败,并提供良好的错误消息.如果你不这样做,你的程序将在稍后的几个指令中更加崩溃,但是有一些非描述性的空指针错误,你需要一个小时来调试.
我最喜欢的"不要崩溃"模式是这样的:
public User readUserFromDb(int id){
User u = null;
try {
ResultSet rs = connection.execute("SELECT * FROM user WHERE id = " + id);
if (rs.moveNext()){
u = new User();
u.setFirstName(rs.get("fname"));
u.setSurname(rs.get("sname"));
// etc
}
} catch (Exception e) {
log.info(e);
}
if (u == null){
u = new User();
u.setFirstName("error communicating with database");
u.setSurname("error communicating with database");
// etc
}
u.setId(id);
return u;
}
Run Code Online (Sandbox Code Playgroud)
现在,您不必要求用户复制/粘贴错误消息并将其发送给您,而是必须深入了解尝试查找日志条目的日志.(因为他们输入了无效的用户ID,所以没有日志条目.)
mol*_*olf 33
我认为只要我认出它就应用设计模式是有意义的.
我几乎不知道我实际上是从外国编程语言复制样式,而我正在使用的语言允许更优雅或更简单的解决方案.
使用多种(非常)不同的语言让我大开眼界,让我意识到我不必将其他人的解决方案误用于不属于我的问题.当我看到像Ruby这样的语言应用工厂模式时,我不寒而栗.
yal*_*tar 27
强迫测试.我曾经是测试优先开发的狂热支持者.对于某些项目来说,这很有道理,但我已经意识到,这不仅是不可行的,而且对许多项目而言是有害的,因为他们盲目地坚持为每一项功能编写单元测试的学说.
真的,盲目地坚持任何事情都可能是有害的.
Dan*_*Lew 25
这是一件小事,但是:关心括号的位置(在同一行或下一行?),建议代码的最大行长度,变量的命名约定以及样式的其他元素.我发现每个人似乎都比我更关心这一点,所以我只想跟随我现在工作的人的流动.
编辑:当然,这是一个例外,当我是最关心的人(或者是一个能够为一个团体设置风格的人).在那种情况下,我做我想做的!
(请注意,这与没有一致的样式不同.我认为代码库中的一致样式对于可读性非常重要.)
Jam*_*ler 20
实用程序库.我曾经带着各种辅助方法和类进行组装,其理论是我可以在其他地方使用它们.
实际上,我刚刚创建了一个庞大的命名空间,其中包含许多组织不当的功能.
现在,我只是将它们留在我创建它们的项目中.很可能我不需要它,如果我这样做,我总是可以将它们重构为以后可重用的东西.有时我会用// TODO标记它们,以便可能提取到一个公共程序集中.
Eri*_*der 15
使用DataSet执行业务逻辑.这会将代码与数据库紧密绑定,而DataSet通常也是从SQL创建的,这使得事情变得更加脆弱.如果SQL或数据库发生变化,它往往会渗透到DataSet触及的所有内容.
在对象构造函数中执行任何业务逻辑.继承和创建重载构造函数的能力往往使维护变得困难.
Rhy*_*nes 15
缩写变量/方法/表/ ...名称
我曾经一直这样做,即使在没有强制限制名称长度的语言中工作(好吧它们可能是255或者其他东西).其中一个副作用是在整个代码中散布了许多解释(非标准)缩写的评论.当然,如果名字因任何原因而改变了......
现在我更喜欢用好的描述性名称来称呼它们的真实含义.仅包括标准缩写.无需包含无用的注释,代码更具可读性和易懂性.
blu*_*blu 14
使用自定义辅助方法层包装现有的数据访问组件(如企业库).
Gre*_*ham 14
我在1984年阅读关于Smalltalk的时候第一次听说过面向对象的编程,但在1992年我使用cfront C++编译器之前我没有访问oo语言.我终于在1995年使用了Smalltalk.我曾热切期待oo技术,并购买了它将节省软件开发的想法.
现在,我只看到oo作为一种具有一些优势的技术,但它只是工具箱中的一个工具.我在Python中完成大部分工作,而且我经常编写不是类成员的独立函数,而且我经常在元组或列表中收集数据组,过去我会创建一个类.我仍然在数据结构复杂时创建类,或者我需要与数据相关的行为,但我倾向于抵制它.
当我得到时间时,我真的很想在Clojure做一些工作,虽然如果我理解正确,它可以使用Java对象.我还没准备好说oo已经死了,但我个人并不是以前的粉丝.
Jul*_*anR 13
在C#中,_notation用于私有成员.我现在认为这很难看.
然后我改为this.notation私人会员,但发现我使用它不一致,所以我放弃了.
ral*_*nja 11
在实施之前,我停止了大学推荐的设计方法.在一个混乱而复杂的系统中工作迫使我改变态度.
当然我还在做代码研究,特别是当我要触摸之前从未接触过的代码时,但通常我会尽量专注于尽可能小的实现来先获得一些东西.这是主要目标.然后逐渐完善逻辑,让设计自己出现.编程是一个迭代过程,并且通过敏捷方法和大量重构非常有效.
代码不会查看您最初认为的样子.每次都发生:)
Fra*_*man 10
我曾经在合同设计方面做得很好.这意味着在我的所有功能开始时进行大量的错误检查.从关注点分离的角度来看,合同仍然很重要,但是我尝试使用单元测试来验证它的作用,而不是试图强制执行我的代码不应该做的事情.
Gre*_*zky 10
已检查的例外情况
在纸上的一个惊人的想法 - 明确定义合同,没有错误的余地或忘记检查一些异常情况.我第一次听到它时卖掉了.
当然,它在实践中变得如此混乱.到目前为止,像Spring JDBC一样拥有库,它将遗留的遗留检查异常作为其主要特征之一.
小智 8
也许在我的编码实践中以及在其他实践中发生的最大变化是接受从互联网下载的外部类和库作为应用程序中行为和功能的基础.在我上大学的时候,我们被鼓励想出如何通过我们自己的代码让事情变得更好,并依靠语言来解决我们的问题.随着用户界面和服务/数据消耗的各个方面的进步,这不再是一个现实的概念.
有些东西在一种语言中永远不会改变,并且有一个库将这个代码包装在一个更简单的事务中,而且我需要编写的代码行更少,这是一种祝福.连接到数据库将始终是相同的.选择DOM中的元素不会改变.通过服务器端脚本发送电子邮件永远不会改变.不得不写这个时间又浪费了我可以用来改进应用程序中的核心逻辑的时间.
初始化所有班级成员.
我曾经用某些东西显式初始化每个类成员,通常是NULL.我已经意识到这一点:
和你一样,我也采用了IoC模式来减少应用程序各个组件之间的耦合.只要我能够使每个组件尽可能独立,它使维护和部件交换变得更加简单.我还使用了更多的对象关系框架,如NHibernate,以简化数据库管理工作.
简而言之,我正在使用"迷你"框架来帮助更快速有效地构建软件.这些迷你框架可以节省大量时间,如果做得好,可以使应用程序变得非常简单,以便在路上维护.即插即赢!