Questions tagged «language-agnostic»

该标签用于非特定于编程语言或环境的问题。

16
为何在编程时使用其他数字基数
我和我的同事一直在思考,以找出为什么有人会以除10为底的底数来编程数字。 我建议您也许可以通过将变量放置在要使用的正确基数中来优化较长的方程(例如,如果您只有5组东西而没有余数,则可以使用5基数),但是我不确定如果是真的。 有什么想法吗?

6
记录现有代码库的方法
我作为团队的成员在没有内联文档,也没有技术文档的现有应用程序上工作。当我一直在处理应用程序的各种错误报告时,我为自己写了一条面包屑的痕迹-各个地方的错误号,以便下一个开发人员可以参考该错误号以查看发生了什么。 因此,我的问题是: 记录此代码的最有效方法是什么?我应该在接触该区域时记录下来(如果需要,可以使用病毒方法),还是应该自己从每个部分进行记录,而不遵循分支到应用程序其他区域的路径?我应该在以前不存在的地方插入行内注释吗(担心我最终可能会错误地识别代码的作用)? 您将使用哪种方法来准确,快速地为没有现有内联文档或内联引用外部文档的大型应用程序提供文档?

7
为什么大多数主流语言不支持“ x <y <z”语法进行三路布尔比较?
如果我想比较两个数字(或其他排序良好的实体),则可以使用x &lt; y。如果我想比较其中的三个,那位高中代数的学生会建议尝试x &lt; y &lt; z。然后,我中的程序员将回答“不,那是无效的,您必须这样做x &lt; y &amp;&amp; y &lt; z”。 我遇到的大多数语言似乎都不支持这种语法,考虑到它在数学中的普遍性,这很奇怪。Python是一个明显的例外。JavaScript 看起来像是一个异常,但实际上,它只是运算符优先级和隐式转换的不幸产物。在node.js中,1 &lt; 3 &lt; 2评估为true,因为它确实是(1 &lt; 3) &lt; 2 === true &lt; 2 === 1 &lt; 2。 所以,我的问题是这样的:为什么x &lt; y &lt; z具有预期语义的编程语言不常见?


6
更新密码哈希而不强制现有用户使用新密码
您维护具有已建立用户群的现有应用程序。随着时间的流逝,目前的密码哈希技术已经过时,需要升级。此外,由于UX原因,您不希望强迫现有用户更新其密码。整个密码哈希更新需要在屏幕后面进行。 假设用户的“简单”数据库模型包含: ID 电子邮件 密码 如何解决这一要求? 我目前的想法是: 在适当的类中创建一个新的哈希方法 更新数据库中的用户表以容纳其他密码字段 用户使用过时的密码哈希成功登录后,用更新的哈希填充第二个密码字段 这给我留下了一个问题,即我无法合理地区分拥有和未更新密码哈希的用户,因此将不得不同时检查两者。这似乎是可怕的缺陷。 此外,这基本上意味着,可以强制无限期地保留旧的哈希技术,直到每个用户都更新了密码。只有在那一刻,我才能开始删除旧的哈希检查并删除多余的数据库字段。 我主要是在这里寻找一些设计技巧,因为我当前的“解决方案”是肮脏,不完整的,不是什么,但是如果需要实际的代码来描述可能的解决方案,请随时使用任何语言。

9
while(true)和循环中断-反模式?
考虑以下代码: public void doSomething(int input) { while(true) { TransformInSomeWay(input); if(ProcessingComplete(input)) break; DoSomethingElseTo(input); } } 假设此过程涉及有限但与输入有关的步骤数;循环的目的是由于算法而自行终止,而不是设计为无限期地运行(直到被外部事件取消为止)。因为检查循环是否应该结束的测试是在逻辑步骤的中间,所以while循环本身目前不检查任何有意义的事情;而是在概念算法的“适当”位置执行检查。 有人告诉我这是错误的代码,因为由于循环结构未检查结束条件,所以它更容易出错。弄清楚如何退出循环会更加困难,并且由于将来的更改可能会意外地忽略或破坏中断条件,因此可能会引发错误。 现在,代码的结构如下: public void doSomething(int input) { TransformInSomeWay(input); while(!ProcessingComplete(input)) { DoSomethingElseTo(input); TransformInSomeWay(input); } } 但是,这会重复调用代码中的方法,这违反了DRY。如果TransformInSomeWay后来被其他方法替换,则必须找到并更改这两个调用(在更复杂的代码中可能不那么明显地存在两个调用)。 您也可以这样写: public void doSomething(int input) { var complete = false; while(!complete) { TransformInSomeWay(input); complete = ProcessingComplete(input); if(!complete) { DoSomethingElseTo(input); } …

10
达到中间编程状态
我是一名软件工程师,曾在VBA中担任过职位编程(尽管我不敢考虑那种“真实的”经验,因为那是反复试验!),带有CGI,Perl的CGI,C#和ASP.NET。后两个是本科生,我进入了“现实世界”。我大学毕业了2年,并且在我提到的所有语言上有5年(总计)的经验。但是,谈到我的简历,我只能将C#放下两年,而将ASP.NET放下不到一年。 我觉得我知道 C#,但是我仍然必须花时间去研究“此方法的作用是什么?”,而一些更高级的工程师可以立即说:“哦,方法X可以做到这一点,而无需考虑它方法之前。” 因此,我凭经验知道那里有一个鸿沟,但我不确定如何弥合它。我已经开始在Euler项目中进行编程,并且读了一本关于设计模式的书,但是我仍然觉得我每天都在花很多时间而不是继续前进。 这并不是说我没有进步的感觉,这只是意味着,就我每天来而言,我仍然可以看到远处的山顶。 我的问题是:您如何克服这个高原?你花了多长时间?您可以建议采用什么方法来协助我? 我已经阅读了《 Code Complete》,《The Manthical Man Month》和《CLR》第二版的CLR,我的问题是:我现在该怎么办? 编辑:我刚刚在中级程序员的项目中发现了这个问题。我认为这增加了讨论的范围(尽管并不能取代我的问题)。因此,我将其添加到问题中作为“更多信息”。


13
语言不受欢迎的开发中的问题(例如维护)
我正在团队中单独使用clojure(lisp)开发一些应用程序。它从小应用程序开始。没问题。但是,由于它具有功能并扩展了区域,因此它已成为重要的程序。 我担心维护等问题。我们团队中没有人知道Clojure或Lisp,也不对诸如此类的语言感兴趣。 因此,用不受欢迎的语言进行编程不是错误的做法吗?(为了我自己的乐趣?)我应该使用更多流行的语言吗?(至少像python) 我确定我是否要离开团队,而不是说我要离开。:)-没有人​​会维护它。该程序将被销毁,部分程序将使用其他语言进行开发。 尽管我非常喜欢使用clojure进行开发,但我发现这可能不适合我的团队。 你怎么看待这件事?我认为许多喜欢不受欢迎的语言的程序员都在关注类似的问题。



5
数据输入验证-在哪里?多少?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 6年前关闭。 数据输入验证对我来说一直是内部的斗争。 即将在我们的旧应用程序重写项目中添加一个真正的安全框架和代码(到目前为止,该框架几乎保持了卡式城堡般的旧安全代码和数据验证),我再次想知道应该验证多少,哪里等等 在担任Java专业开发人员的5年中,我创建并完善了个人规则,以进行数据输入验证和安全措施。当我想改进自己的方法时,我希望有人听到你们的一些想法。通用规则和过程很好,并且特定于Java的规则和过程也很好。 归纳起来,以下是我的指南(在3层Web应用程序样式中公开),并带有简要说明: 第一层客户端(浏览器):最低限度的验证,只有不变的规则(必填电子邮件字段,必须选择一项,依此类推);减少使用诸如“ 6到20个字符之间”之类的附加验证的频率,因为这会增加对变更的维护工作(可以在业务代码稳定后添加); 第一层服务器端(网络通信处理,“控制器”):我对此没有规定,但我认为此处仅应处理数据处理和组装/解析错误(生日字段不是有效日期);在此处添加进一步的验证很容易使其变得很无聊。 第二层(业务层):可靠的验证,不少于;输入数据格式,范围,值,内部状态检查(是否可以随时调用方法),用户角色/权限等;使用尽可能少的用户输入数据,如果需要,再次从数据库中检索它;如果我们也将检索到的数据库数据也视为输入,则只有在已知某些特定数据在DB上不可靠或已损坏得足够多的情况下,我才会对其进行验证-强类型化在这里做了大部分工作,恕我直言; 第三层(数据层/ DAL / DAO):从来没有认为这里需要太多的验证,因为只有业务层才可以访问数据(在某些情况下,例如“ param1为true时,param2不能为空”验证);但是请注意,当我的意思是“这里”是指“访问数据库的代码”或“ SQL执行方法”时,数据库本身是完全相反的; 数据库(数据模型):需要充分考虑,强大和自我实施,以尽可能避免DB上的数据不正确和损坏,并具有良好的主键,外键,约束,数据类型/长度/大小/ precision等-我不再赘述,因为他们有自己的私人讨论。 我知道早期的数据验证是不错的并且是性能方面的,但是重复的数据验证是一个无聊的过程,并且我承认数据验证本身很烦人。这就是为什么这么多编码员跳过它或半途而废的原因。同样,如果每个重复的验证并非始终保持同步,则可能是一个错误。这些是当今我更喜欢将大多数验证放到业务层的主要原因,但要浪费时间,带宽和CPU,并要逐案处理异常。 所以,对于这个你有什么想法?反对意见?您还有其他程序吗?提到这样的话题?任何贡献均有效。 注意:如果您正在考虑Java的做事方式,我们的应用程序是基于Spring的Spring MVC和MyBatis(性能和不良的数据库模型排除了ORM解决方案);我计划将Spring Security添加为我们的安全提供程序以及JSR 303(休眠验证器?)。 谢谢! 编辑:在第三层的一些额外的澄清。

9
让赋值运算符返回值有什么好处?
我正在开发一种语言,打算取代Javascript和PHP。(我看不出有任何问题。这两种语言都不具有庞大的安装基础。) 我要更改的一件事是将赋值运算符转换为赋值命令,从而取消了使用返回值的功能。 x=1; /* Assignment. */ if (x==1) {} /* Comparison. */ x==1; /* Error or warning, I've not decided yet. */ if (x=1) {} /* Error. */ 我知道这将意味着C员工如此钟爱的单行功能将不再起作用。我发现(几乎没有我个人经验的证据),这种情况在绝大多数情况下确实是比较操作。 还是?赋值运算符的返回值是否有任何实际用途,无法轻易重写?(对于具有这种概念的任何语言。)

3
具有验证检查的控制流样式
我发现自己在写很多这样的代码: int myFunction(Person* person) { int personIsValid = !(person==NULL); if (personIsValid) { // do some stuff; might be lengthy int myresult = whatever; return myResult; } else { return -1; } } 它可能会变得非常混乱,特别是如果涉及多个检查。在这种情况下,我尝试了多种样式,例如: int netWorth(Person* person) { if (Person==NULL) { return -1; } if (!(person-&gt;isAlive)) { return -1; } int …

11
服务器是否应该“宽容”它所接受的内容并“静默丢弃错误的输入”?
我的印象是,到现在为止,每个人都同意这句话是错误的。但是我最近看到了这个答案,其中有一个“宽容”的评论被投票了137次(截止到今天)。 在我看来,宽容浏览器的原因是HTML和其他一些Web标准在几年前就完全混乱的直接原因,并且直到最近才开始从该混乱中明确体现出来。我的看法是,宽容您所接受的东西会导致这种情况。 格言的第二部分是“以静默方式丢弃错误的输入,除非规范要求,否则不返回错误消息”,这使人感到不快。任何在某些问题无声地失败时撞墙的程序员都会知道我的意思。 那么,我对此完全不对吗?我的程序是否应该宽容它所接受的内容并默默地吞下错误?还是我误解了这意味着什么? 最初的问题是“程序”,我对此表示赞同。宽大处理程序是有意义的。但是,我真正的意思是API:暴露给其他程序而非人的接口。HTTP就是一个例子。该协议是仅其他程序使用的接口。人们从不直接提供诸如“ If-Modified-Since”之类的标题中的日期。 因此,问题是:除标准实际要求的格式外,实施一项标准的服务器是否应宽松,并允许采用其他几种格式的日期?我认为,“宽容”应该适用于这种情况,而不是人机界面。 如果服务器是宽松的,这似乎是一个整体的改进,但是我认为在实践中,它只会导致客户端实现最终依赖宽大处理,因此无法以稍有不同的方式与另一台宽松的服务器一起工作。 那么,公开某些API的服务器应该宽容还是一个非常糟糕的主意? 现在开始宽大处理用户输入。考虑使用YouTrack(错误跟踪软件)。它使用的文字输入语言让人联想到Markdown。除了“宽大”。例如写 - foo - bar - baz 是不是创建一个项目符号列表的文档的方式,但它的工作。因此,它最终在我们的内部Bugtracker中被大量使用。下一个版本问世了,这个宽大的功能开始工作时略有不同,打破了一堆(误用)此(非)功能的列表。当然,创建项目符号列表的文档化方法仍然有效。 那么,我的软件应该宽容接受的用户输入吗?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.