软件工程

针对在系统开发生命周期中工作的专业人士,学者和学生的问答

11
设计理想范围文字
我一直在思考如果要设计一种语言,我将如何设计“完美”范围文字。对于您不知道的语句中的范围文字,它表示一个值范围,例如1-4。它们最常用于for / foreach循环 似乎应该考虑几个问题 支持包含范围和排除范围,将+1或-1附加到端点似乎有点笨拙且容易出错。 支持步进,因此您可以设置例如偶数或奇数范围 可读性,范围文字描述的内容应该显而易见 明确,范围文字所描述的内容应该完全明确 默认值可能是从包含值到排除值,因为在大多数情况下,这是用于遍历数组等的方式。 无论如何,我所见过的范围文字的一个示例是Ruby,其形式为1..3表示排他性(最后),1 ... 3表示排他性(最后)。您也可以执行1..10.step(5)。经过仔细考虑后,我发现该方法有一些我不喜欢的地方(从我对红宝石的有限了解) 您只能在最后描述包含式和排除式。在描述大多数情况时,它似乎并不一致。 仅需额外增加一个。似乎是使难以看清范围是包含范围还是排除范围的秘诀。我不了解你,但是点变得模糊起来了:) 为范围添加表示法之类的方法似乎将文字的概念与类的概念混合在一起,这似乎有点不一致(即使将范围编译为一个类) 无论如何,在考虑其他选择之后。我想出了这个 [5..1] 5,4,3,2,1 [1..5 [ 1,2,3,4 ] 1..5] 2,3,4,5 [ 0..5..20] 0,5,10,15,20 等等。我喜欢它,因为[通常会否定一个集合,即使这样与集合形成对比,它也很适合。 我有点担心的一件事是使排他性/包含性指示符是否强制性,即,如果只写1..5,则默认值为1,2,3,4,因为这是数组等的最常见情况。 。它更容易阅读,但更具针对性,如果您不得不写[1..5 [您会早日了解它们的工作原理。 那么,您认为我涵盖了大多数基础,却忽略了某些内容吗?您会否使[]为强制性?您会在编程语言中设计范围文字吗? 候选人 括号样式:[0..10 [ ,带有步骤: [0..5..20 [ 间隔符号:[0..10) ,步长:[0..5..20) 感叹为排他。0 ..!10,含步骤:0..5 ..!20 不同的步骤。0 ..!20,5 但是,这将使默认值* 0..10'包含在内 罗:[0至!20 x 5] …

5
移动开发-获取开发硬件-最佳做法?
我正在寻求智能手机的开发,但是目前平台有很多选择。(iOS / Android / WebOS / Bada / Symbian / MeeGo / WindowsMo​​bile / JavaME) 我想要开发硬件来测试我的代码和设备的整体功能。 获取和/或借用硬件进行开发和测试的最佳方法是什么?是否有适用于所有公司和平台的经验法则? 在这种情况下,我是一个开发人员。启动过程会改变吗?黑客空间?小生意?大生意?
10 hardware  mobile 

9
与YAGNI相比,删除硬编码的值和防御性设计
首先介绍一下背景。我正在从“年龄->费率”中查找代码。有7个年龄段,因此查找表是3列(From | To | Rate)和7行。这些值很少更改-它们是已保持3年不变的立法费率(第一列和第三列)。我认为存储该表而不对其进行硬编码的最简单方法是在数据库中的全局配置表中,因为包含CSV的单个文本值(因此“ 65,69,0.05,70,74,0.06” 65-69和70-74层)。比较容易解析然后使用。 然后,我意识到要实现这一点,我将必须创建一个新表,一个要包装它的存储库,用于仓库的数据层测试,围绕将CSV展开到表中的代码的单元测试以及围绕查找本身的测试。所有这些工作的唯一好处是避免对查找表进行硬编码。 与用户交谈时(当前他们直接使用查找表-通过查看纸质副本)时,人们几乎认为“费率永远不会改变”。显然,这实际上是不正确的-费率是三年前才创建的,过去,“永不改变”的习惯已经改变了-因此,对于我来说,应该进行防御性编程,我绝对不应该在其中存储查找表应用程序。 除了我想YAGNI的时候。我要实现的功能未指定费率会改变。如果费率确实发生变化,它们仍将变化得很少,以至于甚至不需要考虑维护,并且该功能实际上并不十分重要,以至于如果在费率变化和更新的应用程序之间存在延迟,任何事情都将受到影响。 我几乎已经决定,如果我对查询进行硬编码,就不会失去任何价值,而且我不太担心我对这一特定功能的处理方式。我的问题是,作为专业人士,我是否可以合理地证明这一决定?硬编码值是不好的设计,但是麻烦从应用程序中删除值似乎违反了YAGNI原则。 编辑为了澄清这个问题,我不关心实际的实现。我担心自己可能会做出快速,糟糕的事情并通过说出YAGNI来证明其合理性,或者我会采取一种防御性更高的努力方法,即使在最好的情况下,最终收益也很小。作为一名专业程序员,我实施我知道有缺陷的设计的决定是否仅仅取决于成本/收益分析? 编辑虽然所有的答案都非常有趣,因为我认为这归结为个人的设计选择,我认为最好的答案是@科尔宾的和@EZ哈特为他们带来了的事情,我没有在这个问题考虑: 错误的二分法是通过将其移动到数据库来“正确删除硬编码的值”,而不是使用硬编码来“有效地应用YAGNI”。第三种选择是将查找表放入应用程序配置中,这不会产生正确方法的开销,而且没有YAGNI的效率。我们通常不限于任何一个或一个决定,然后可以归结为成本/收益决定。 代码生成可以减少将硬编码值移动到数据库的开销,并且还可以消除我过度设计的决定,即将CSV处理到表中的决定。如果查询方法的基本要求发生变化,则可能还会对生成的代码造成长期维护问题。这一切都只会影响成本/收益分析,而且如果我拥有自动化功能,那么我什至都不会考虑对这种东西进行硬编码。 我将@Corbin的答案标记为正确,因为它改变了我对开发成本的假设,并且我可能会在不久的将来向我的军械库中添加一些代码生成工具。
10 design 


7
在规范文档,用例或场景中,您如何称呼客户的客户?
我和我的团队开发了客户可以用来与客户互动的软件。此外,我们还吃自己的狗粮,并自己使用该软件与客户互动。 因此,有时可能很难解释用例和场景,因为我们的员工可以是操作员,我们的客户可以是操作员,而我们的客户的客户可以是访客。 但是,我们的客户也可以是与我们的运营商员工互动的访客,我们的客户的顾客可以是与我们的客户或员工互动的访客。 这是一个模型,其中: A is an employee B is a customer C is our customers' customer X interacts with Y Operator --> Visitor A --> B A --> C B --> C 因为有时我们的客户可以扮演不同的角色,所以有时有必要引用特定的角色,即操作员或访客,而不是雇员和客户。 一直说“客户的顾客”也是一个大嘴巴。 我想知道其他开发商店在编写用例和场景时如何处理这些语义细节。 是否有任何一个单词的通用术语可适用于涉及三级参与者的任何产品? 除了使用特定角色(运营商和访客)以外,还可以使用哪些词来识别客户的客户? 这个词必须足够短以便在组织内采用。如果音节长于一对音节,则它的缩写形式必须与其他演员区分开。

5
可以对所有递归函数进行迭代编码吗?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 6年前关闭。 递归的优点是什么? 某些编程语言可以优化尾部递归,但是,总的来说,递归比常规循环消耗更多的资源。 是否可以具有某些递归函数的迭代版本?

3
XAML标记的推荐控件命名约定是什么?
在使用WPF或Silverlight时,应该如何使用控件命名约定?您是否在XAML标记中命名控件?我在Codeplex上看到了带有控件名称(例如“ selectButton”或“ btnSelect”)的项目示例。你会推荐什么?
10 wpf  silverlight 

6
什么时候变得过度杀伤力?
首先,我很抱歉,因为我不知道如何创建社区线程。所以有人帮我 作为开发人员,跨越许多平台,技术甚至在基础架构级别;我总是问自己,我什么时候做得太多? 自从我开始以来,这是一个永无止境的学习过程。我了解到的一(1)件事是,要求在很长一段时间内几乎都无效,因此,稍加预见可能会大有帮助。 但是平衡在哪里,又怎么知道何时失去时间却没有获得时间呢?

5
PHP,HTML,Javascript和编写良好实践
我意识到我必须为我和我的团队写下有关HTML,JavaScript和PHP编码的约定规范。 在Web开发中,就像在C ++中一样,我绝对是缩进和注释的爱好者。 但是,在我的工作中,我经常会遇到HTML + JavaScript + PHP代码,这突然令人头疼。 我试图使我的代码可读,但是对我来说似乎更好的(缩进和注释)似乎并不使我的队友着迷,所以我想知道在编写“混合”时是否存在最佳或至少共享的良好实践就像今天的网页一样,文档变得越来越复杂。 我知道以下事实:今天的网页代码本质上可能有些复杂,但是我想知道是否存在关于这些方面的良好约定。

4
为什么通过静态方法传递对象会有好处?
为什么使用静态方法并将引用作为参数传递给对象而不是在对象上调用该方法会有好处? 为了阐明我的意思,请考虑以下课程: public class SomeClass { private double someValue; public SomeClass() { // Some constructor in which someValue is set } public void incrementValue() { someValue++; } } 与使用静态方法的此替代实现相比: public class SomeClass { private double someValue; public SomeClass() { // Some constructor in which someValue is set } public static …

5
如何在下拉标签中引用ByRef和ByVal?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 4年前关闭。 关于MSDN页面ByRef和ByVal关键字不是很有帮助;除非我以某种方式略过它,否则它们到处都被简单地称为“关键字”。 Rubberduck项目的主要贡献者之一是进行非常酷的Encapsulate Field重构,并且UI进行得非常好..除了我对ByRef/ 下拉菜单上方的标签有问题ByVal,它说“ Accessibility”: 我不喜欢“辅助功能”,因为我用它在其他地方Public/ Private/ Friend访问修饰符在那里感觉更准确。 我不想使用“修饰符”,因为IMO只是“访问修饰符”的缩写。 我希望该标签准确无误,但我的词汇表显然缺乏,而且我不知道该怎么称呼这些关键字。 这个标签应该说什么呢?我在找什么字?ByRef/ ByVal属于什么“关键字家族” ?
9 naming  ui  vba 

3
是否有CPU执行这种可能的L1缓存写优化?
当具有L1高速缓存的CPU进行写操作时,通常会发生这种情况(假定正在写入的高速缓存行已在L1高速缓存中),高速缓存(除了更新数据外)会将高速缓存行标记为脏,并在稍后将行与更新的数据一起写出。 一种可能的优化方法是使缓存将写入内容与缓存的先前内容进行比较,如果它们相同,则不要将行标记为脏。因为这可以使高速缓存有时避免回写,所以我可以看到CPU制造商如何看待这种逻辑所需要的门。 我的问题:是否有执行此优化的CPU? 关于我为什么要问的背景:我正在编写一些需要经常访问内存的代码;也就是说,能够侦听缓存行为的人不应该推断出我在做什么。我的某些访问是写操作,并且以明显的方式来实现此代码,许多写操作将写入已经存在的相同数据。我需要进行写操作,因为根据数据,我正在写的数据可能相同也可能不同,并且无论如何都要执行相同的操作很重要。如果CPU通过不实际写“ no-change-write”来进行优化,则意味着高速缓存的行为将根据我在做什么而变化,这将颠覆我的目标。 那么,是否有CPU尝试以这种方式优化写入?
9 caching  cpu 

1
当异步任务使用户体验不佳时
我正在编写一个COM插件,该插件扩展了迫切需要它的IDE。这里涉及许多功能,但是为了这篇文章,我们将其缩小到2: 有一个“代码资源管理器”工具窗口,其中显示一个树状视图,允许用户浏览模块及其成员。 有一个“代码检查”工具窗口,其中显示一个datagridview,可让用户浏览代码问题并自动修复它们。 两种工具都有一个“刷新”按钮,用于启动异步任务,该任务将解析​​所有打开的项目中的所有代码。该代码浏览器使用的解析结果建立树形视图和代码评审使用的解析结果,以找出代码问题并显示其结果的datagridview。 我在这里想要做的是在功能之间共享解析结果,以便在代码浏览器刷新时,代码检查会知道它并可以刷新自身,而无需重做代码浏览器刚刚进行的解析工作。 因此,我做了什么,将解析器类设置为事件提供者,这些功能可以注册到: private void _parser_ParseCompleted(object sender, ParseCompletedEventArgs e) { Control.Invoke((MethodInvoker) delegate { Control.SolutionTree.Nodes.Clear(); foreach (var result in e.ParseResults) { var node = new TreeNode(result.Project.Name); node.ImageKey = "Hourglass"; node.SelectedImageKey = node.ImageKey; AddProjectNodes(result, node); Control.SolutionTree.Nodes.Add(node); } Control.EnableRefresh(); }); } private void _parser_ParseStarted(object sender, ParseStartedEventArgs e) { Control.Invoke((MethodInvoker) delegate …

1
浮点函数的隐含精度
在回顾另一位程序员对某个函数的实现以计算正态分布CDF的实现时,我建议用Python的内置函数替换整个实现,或者使用通用的科学库SciPy。 另一位程序员指出,他们的文档中也math.erfc()没有scipy.stats.norm.cdf()提供任何精度保证。因此,在替换近似算法(该算法取自颇受好评的源,并记录了错误范围)时,我应该格外谨慎。 老实说,怀疑内置或库函数的准确性和精确度的想法从来没有想到。毕竟,多年来我一直在不停地调用诸如sin()和之类的函数,sqrt()为什么math.erf()还是scipy.stats.norm.cdf()应该有所不同呢? 但是现在,我很担心。我的问题是: 通常,如果文档中没有特别提及,是否暗示这些功能在IEEE双精度浮点提供的精度范围内完全精确到最后一位小数? 尤其是对于Python math.erf()或SciPy而言,这是真的scipy.stats.norm.cdf()吗?你怎么知道? 此手册页sin()说…… 当它们的参数接近pi的倍数或远离0.0时,这些函数可能会失去准确性。 当正弦函数是周期性且对称的时,为什么要存在这样的警告?似乎给调用者增加了规范输入以获取最佳准确性的负担。 另一方面,Mozilla的文档中Math.sin()没有提及准确性或精度。这是否意味着它是完全准确的,还是Math.sin()仅在某些情况下才像其他地方一样在JavaScript中才是准确的“常识” ?

8
存储在数据库中的任务的优先级列表
我正在尝试执行以下操作的最佳方法: 我有一个存储在数据库中的任务列表。任务具有分配的优先级。您可以更改任务的优先级,以重新排序执行任务的顺序。 我在想与Pivotal Tracker非常相似的东西。 因此,假设我们有以下内容: 1 Task A 2 Task B 3 Task C 4 Task D 5 Task E 我们认为E现在是最重要的任务 1 Task E 2 Task A 3 Task B 4 Task C 5 Task D 我需要更新所有5个任务以赋予它们新的优先级。 如果任务B变得更加重要,那么我将拥有AI 1 Task E 2 Task B 3 Task A 4 Task C …

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.