Questions tagged «programming-practices»

编程实践是软件开发中常用或不常用的实践。这些可以包括敏捷开发,看板,编码快捷方式等。

4
内部与软件开发环境[已关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,使它成为软件工程堆栈交换的主题。 5年前关闭。 在行业中,在软件开发人员编写将由公司自己使用的代码的“内部开发”环境与构建要出售/分发的软件的适当“软件开发”环境之间存在区别。对公众。 其中,两者之间的一个明显区别是,面向软件开发的公司通常会遵循某种软件开发生命周期,例如规范编写,测试,构建等,而面向内部的商店通常会坚持因为他们自己是最终用户,并且总是可以修复未正确完成的操作,所以可以更轻松地完成操作。 作为一名学生(像其他大多数学生一样),我有点希望自己能在软件开发环境中工作,但最终我在一家以内部运作方式运作的公司中获得了第一份职位。 有时,我想知道我是否错过了成熟的软件开发经验。有这种感觉的依据吗?我是否应该寻求加入适当的软件开发环境?

7
将压倒性代码分解为可管理块的最佳方法?
一旦大型项目达到一定程度的复杂性,我就会变得不知所措。一旦到达项目中的某个特定点,我的进度就会缓慢地爬行,并且发现自己不断地追踪自己的步骤并理清各种混乱。 由于我的这个弱点,我真的很擅长重构。而且我总是尝试将对象分解为更小,更易于管理的对象。这种弱点也可能导致我过多地注意正确设计事物。 我知道如果我可以将问题分解为较小的问题,那么我将能够顺利完成任务。想到的一种策略是测试驱动的开发。我还可以做些什么?

5
艾伦·库珀的统一文件模型发生了什么?
长期以来,Alan Cooper(在他的《 About Face》一书的3个版本中)一直在推广“统一文件模型”,以免除他所说的有史以来最愚蠢的消息框-一个点击应用或表单上的关闭按钮并显示“您要放弃所做的更改?”时弹出。我喜欢这个主意和他的观点,但也有大多数经验丰富的程序员和用户对此的直率反应。 尽管库珀的书似乎很受人们欢迎和尊重,但我在网上找不到关于这个特定问题的讨论,很少。“编程工业强度Windows”的作者Petter Hesselberg提到了这一点,但似乎是这样。 我有机会在我正在从事的(桌面)项目中实现此目标,但是客户和同事当然会遇到阻力,他们当然熟悉MS Word和Excel的工作方式。我可以推翻他们的反对意见,但是不确定是否应该这样做。 我的问题是: 我没有找到对此的良好讨论?有人在他们的应用程序中这样做吗?一个好主意是,不幸的是,要等到Microsoft才实施,它才是不现实的?

5
何时开始编写异常处理,日志记录
您何时开始编写异常处理代码?您何时开始编写日志记录语句。 出于阐述这个问题的目的,让我们假设我们使用Log4net日志记录在.NET平台上,但是可以以一般方式随意回答。 解决方案:Windows窗体项目。项目:UI,BusinessRules,DataHandlers 因此,您是否打算编写DataHandlers来进行数据处理,例如首先创建,读取,更新,删除。 然后遵循您的业务规则 然后是您的用户界面或以上的任何其他排列。 测试您的应用程序的功能。 而再开始写你的异常处理代码和最后日志记录代码? 在什么时候开始编写您的异常处理代码? PS:在书Clean Code中,他们说首先写您try-catch-finally块。那促使我提出这个问题。

8
C字符串是否始终以null终止,还是取决于平台?
现在,我正在使用嵌入式系统,并研究在没有操作系统的微处理器上实现字符串的方法。到目前为止,我正在做的只是使用使NULL终止的字符指针并将它们视为NULL表示结尾的字符串的想法。我知道这很普遍,但是您是否总是可以指望这种情况? 我问的原因是我正在考虑也许在某个时候使用实时操作系统,并且我想尽可能多地重用当前代码。因此,对于存在的各种选择,我是否可以期望字符串能够正常工作? 让我更具体地说明我的情况。我正在实现一个通过串行端口接收和处理命令的系统。我能否保持命令处理代码相同,然后期望在RTOS(包含命令)上创建的字符串对象全部以NULL终止?还是根据操作系统而有所不同? 更新资料 在被建议看一下这个问题之后,我确定它不能完全回答我的要求。问题本身是在询问是否应该始终传递字符串的长度,这与我要问的完全不同,尽管某些答案中包含有用的信息,但它们并不是我要找的。那里的答案似乎提供了为什么或为什么不以空字符终止字符串的原因。我要问的是,我是否可以或多或少地期望不同平台的出生字符串以空值终止自己的字符串,而不必走出去尝试在那里的每个平台。

6
什么是打印使用/帮助(-帮助)的最佳实践?
在为UNIX的CLI编写工具时,应如何使程序打印出帮助和/或用法? 我通常使用fprintf(stderr, "help text here");,但是有几个问题。 首先,我不确定是否应该使用stderr。可以,还是应该使用stdout? 可以想象,帮助文本很长,具体取决于该工具有多少选项。现在,我通常只需"strings like that\n"在第二个参数中输入几个即可。但是,这用五十行或更多行帮助文本填充了我的源代码。根本不容易管理。我该怎么办呢? 当工具不是用C或类似C的语言编写时,我倾向于在可能的情况下使用here-docs(在Perl中最为明显)。我不能在C语言中使用它,但是我可以使用类似的东西吗? 我正在考虑将其放在a的headerfile.h内部#define HELP "help text here",我从未在野外看到它,也不知道我是否应该真正使用它。 理想情况下,我可以将文本放在外部文件中并包含它。但是,使用#include它似乎是错误的。那我该怎么办? 这个想法是要有一个易于管理的帮助文本。将其包含在源代码中并不是很方便。

6
默认值-它们是好是坏?
有关默认值的一般问题-默认返回函数值,默认参数值,缺少某些内容时的默认逻辑,用于处理异常的默认逻辑,用于处理边缘条件的默认逻辑等。 很长一段时间以来,我都认为默认值是“纯粹的邪恶”,它“掩盖了灾难”并导致非常难以发现错误。但是最近我开始考虑将默认值视为某种技术债务……这不是一件坏事,而是可以提供一些“短期融资”的东西使我们能够在项目中生存(我们中有多少人可以负担得起)在没有抵押的情况下买房?)。 当我说“短期”时,我的意思不是“首先快速地做某事,然后在它投入生产之前再进行重构”。否-我说的是在生产软件中依赖硬编码的默认值。当然-可能会导致一些问题,但是如果仅在一年内造成一次麻烦该怎么办。 再说一遍-我在这里谈论的是“平均”主流软件(不是核电站软件)-会计软件的普通网站或UI应用程序,这意味着人们的生命不会受到威胁,也不会数百万美元。 同样,根据我的经验,业务用户宁愿使用“以某种方式工作”的软件,也不愿等待完美的软件。如果您以RAD风格开发软件,则使用默认值会很有帮助。但是,我再次使用了最长的调试会话,这是因为默认值引入的错误(在此过程中不再是“默认值”),或者由于小型子系统最近已升级,因此升级并没有正确处理默认值(例如,空列表vs空,或空字符串vs空字符串)。 所以我的问题是-默认值是好是坏。而且,如果这些债务属于技术债务,该如何计算您可以借入的金额,以便您有能力偿还还款? 非常感谢您的投入。 干杯。 编辑: 如果我使用默认值作为在开发过程中偷工减料的方式-如果偷工减料会导致错误和问题-从这些问题中恢复的方法是什么?

5
在什么条件下(如果有),查询两个服务器并且仅消耗最快的响应是一种好习惯吗?
我问过什么是SO上现在被社区删除的问题,为什么有人会使用javascript的问题Promise.race,而一个高级用户则对此发表了评论: 如果您有两个计算某个值的服务,则可以并行查询它们,并使用第一个返回的值,而不是查询一个,等待失败,然后查询第二个。 我已经在冗余和这种用例上进行了全面的搜索,但是我什么也找不到,而且从我的POV中来看,如果不打算使用响应,只向服务器/服务添加工作负载绝不是一个好主意。


4
重用方法参数是不好的做法吗?
有时,我需要修改从方法本身内部传递到方法中的值。一个示例将在此处清除诸如此类的字符串: void SanitizeName(string Name) { Name = Name.ToUpper(); //now do something here with name } 这是完全无害的,因为该Name参数未通过引用传递。但是,如果由于某种原因,将来开发人员决定让ref传递所有值,则对字符串进行任何清理都会影响方法外部的值,这可能会带来不利的结果。 因此,我总是像这样创建本地副本,而不是重新分配参数本身: void SanitizeName(string Name) { var SanitizedName = Name.ToUpper(); //now do something here with name } 这样可以确保更改传递的值永远不会影响方法外的操作,但是我想知道我是否对此过于偏执。

2
Haskell解决3n + 1问题的方法
这是来自SPOJ的一个简单的编程问题:http : //www.spoj.com/problems/PROBTRES/。 基本上,要求您为i和j之间的数字输出最大的Collat​​z周期。(数字$ n $的Colatz周期是最终从$ n $变为1的步骤数。) 我一直在寻找一种Haskell方法,以比Java或C ++更好的性能来解决问题(以适应允许的运行时限制)。尽管可以记住任何已计算周期的周期长度的简单Java解决方案将起作用,但是我并未成功地将其应用于获得Haskell解决方案的想法。 我已经尝试了Data.Function.Memoize,以及使用这篇文章中的想法的自制日志时间备注技术:https ://stackoverflow.com/questions/3208258/memoization-in-haskell 。不幸的是,记忆实际上使cycle(n)的计算更加缓慢。我认为,放缓的原因来自Haskell方式的开销。(我尝试使用编译的二进制代码运行,而不是进行解释。) 我还怀疑简单地将数字从i迭代到j可能会很昂贵($ i,j \ le10 ^ 6 $)。因此,我甚至尝试使用http://blog.openendings.net/2013/10/range-trees-and-profiling-in-haskell.html中的想法为范围查询预先计算所有内容。但是,这仍然会出现“超出时间限制”错误。 您能为此告知一个精巧的竞争性Haskell程序吗?

3
通过指针算术而不是[]运算符引用访问数组元素是否不好?
我刚刚开始学习用C编程,并且为了提高对指针和数组的理解,我尝试引用数组的元素而根本不创建任何指针: for(k1 = 0; k1 < ROW; k1++){ for(k2 = 0; k2 < COLUMN; k2++){ array[k1][k2] = k1*COLUMN + k2 + 1; printf("[%d][%d] = %d\n", k1, k2, *(array[k1] + k2)); } } 整个代码可以编译并完美运行。 我想必须在大型源代码中为每个数组创建一个指针似乎效率很低。 因此,与其使用指针存储和检索数组的地址,不如上面所示,直接使用数组的地址是一种不好的编程习惯吗?

3
是否适合将已知问题直接放入软件中?
我已经接管了一个Android应用的维护工作,虽然有一些残留的问题或多或少已经得到解决,但是由于Android操作系统版本不同,仍然存在一些问题。 例如,使用MediaPlayer类发送Web请求时,操作系统发出请求之前剥离了自定义HTTP标头,但仅在Android 4.X(我经过详尽测试)上,这导致该特定功能失败,因为它依赖在这些标题上。 这是一个已知问题,我正在尝试解决,但是有条件的检查是一个好主意,例如 if (OS.VERSION == 4) { knownIssueDialog(This feature will not work on your Android version... etc."); } 显然,我们会在支持渠道上对此进行说明,但我想知道将这些已知问题也嵌入到软件中并在必要时,必要时进行展示是否是一个好主意(假设一切都已被跟踪)例如我上面所描述的。 基于此类问题,我们不断收到许多不良评论和大量支持电子邮件,因此在我看来,仅阻止已知无法正常工作的功能,它将为每个人节省大量时间和头痛。 我看到两个潜在的问题: 用户以前可能从未见过类似“已知问题”对话框的内容。很多用户可能根本不明白这意味着什么。 有一些开发开销-需要确保在代码中的某些地方跟踪这些问题。幸运的是,有了Java批注,诸如此类的条件检查可以在其之前@KnownIssue或类似的东西进行,这使得查找/修改它们非常简单。 在软件中添加“已知问题”提示是否有意义? 编辑:我将添加一个大约一个星期前才开始出现的问题。我已经修复了该问题的一半,并且不太可能能够为4.X修复此问题,因为导致问题的是操作系统。我可以发布包含此修复程序的新版本,并使50%的用户群再次满意,并警告其他50%(4.X用户)该问题将继续存在于4.X上,并提出升级建议(或其他建议) )。问题是是否要在软件中执行此操作(即向4.X用户显示对话框),还是只让他们向我们发送垃圾邮件,我们将通过电子邮件支持“您的修复无效!”的电子邮件!然后将他们定向到支持页面,其中将详细讨论该问题。

8
写软件比从头开始阅读和理解它容易吗?[关闭]
按照目前的情况,这个问题并不适合我们的问答形式。我们希望答案得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 6年前关闭。 我和我的一个朋友昨天讨论了编写大型C ++软件与将其视为新兵之间的区别。 是否有可能因为一种软件一次只能完成一行,并且此过程类似于我们(人类)如何学习事物并在另一种之上构建事物,所以编写大型软件实际上比阅读并理解其功能容易。 (逐步执行代码会有所帮助,但您需要一起记住多个类/源文件,甚至都不知道它们是为什么编写的,多线程代码会增加恶意点)? 一开始听起来很奇怪,但经过一番思考,这似乎是合理的

4
如何避免在单独项目中出现特征蠕变?
因此,我有一个程序要追溯到2011年,直到2012年为止,但最后一个版本是2011年12 月。我一直在积极地研究它,但是特征蠕变吸引了它丑陋的头,现在它充满了许多未完成的特征。 不好的部分是,随着我实现一项功能,一个新的功能应运而生。为了避免将来出现功能蠕变,我该怎么做,以便实际上可以在一年内发布它? 该项目基于iOS,过去每个iOS版本更新都有发行版本,但最后一个版本是5.1(2011)。我希望能够恢复到稳定的发布周期,但是事实证明这太困难了。

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.